IchigoJamで遊ぶ・その6 「7セグで3桁表示する」
ひさびさのIchigoJamネタです。
前回に引き続き7セグLEDを使うんですが、今回を桁を増やして3桁にチャレンジします。
3桁7セグLED
今回使うのは、こういう3桁表示の7セグLED。
何故3桁という中途半端な桁になったのかというと、ちょうどこの部品が手許にあったから。
裏はこんな感じで、ピンが12本あります。
7セグが3つのわりにピン数が少ない気がしますが、実はこれはダイナミック点灯用だから。
ダイナミック点灯とは
ダイナミック点灯というのは、LEDなどを高速に点滅させて使う方法のこと。
点滅スピードが速いと人間の目には普通に光ってるようにしか見えないため、点けっぱなしにするより消費電力を抑えたりできます。
(多少はチラチラしますが)
今回の場合のダイナミック点灯は、1桁目から3桁目に順番に高速に点灯させることによって、瞬間的には1桁しか点灯してないけど、あたかも3桁同時に光っているように見せるというもの。
こうすることで使用するピンを減らせて、マイコン等につなぐ際にポートの節約が出来るというワケです。
なぜピンが減らせるのかというと、内部の配線がこういう風に各桁で共通となっているため。
(図ではaの配線のみで他は省略してます)
信号の出口(図の上側)は別々になっているので、ここを制御することで点灯する桁を選べる仕組みです。
上側を3つとも接続すると同時に点灯できますが、表示内容が全部同じになってしまうのであまり意味が無いです。
ちなみに前回のように点滅させずに点灯させたままなのは「スタティック点灯」と言います。
目の錯覚を利用するなんて邪道、スタティック点灯こそ正義・・・とかいうのであれば、前回使った1桁のモノを3つ使えばできますが、配線も大変そうだし、ポートが足りなくなるのも何とかしないといけません。
なので、今回はダイナミックに点灯させます。
ダイナミック点灯でもポートが足りない?
前回、7セグを利用する時のポートを4つに節約できましたが、それでも残りは2ポート。
それでどうやって3桁を制御するのか?
まぁ、そこは例によって便利な汎用ロジックICがあるのです。
今回使うのは74HC138、「3to8 ラインデコーダ」というもの。
(ピンセットでつまんでいるのは特に意味はない)
これは3ビットの入力信号から、8ビットのうち1つを選択した出力が得られるというもの。
真理値表はこんな感じ。
(フェアチャイルドのデータシートより引用)
左側のG1、G2というのはとりあえず無視して、A・B・Cが「X」でない3行目以降に注目。
このA・B・Cが入力する3ビットの信号で、この値によってOutputsのY0からY7のどれかが「L」になってます。
「L」とはLowのことで、電圧が低いことを表します。
今回は電流の出口側で桁を制御したいので、選択したビットの電圧が「L」になると電流が流れて好都合です。
(電流は電圧の高い方から低い方へ流れるため・・・と、理解してますが、厳密には違うかも)
しかし、入力に3ビット必要なら、やっぱりポートが足りない?
かと言うとそういうことは無く、今回使いたいのは3桁だけなので、真理値表でいうところのY0~Y2を制御できれば十分。
なので2ビットだけを使って、残り1ビットは「L」に固定してしまえば問題なしです。
実際に接続する
説明はこれくらいにして、実際にIchigoJamにつないでみましょう。
回路図?はこんな感じで、だんだんややこしくなってきました。
パズルめいてきたブレッドボード上の実装。
いかにヒモ状のジャンパーワイヤーを使わずに作れるかを考えるとちょっと楽しい。
(全然減らせてないですが)
それはさておき、この接続では出力する6ビットのうち、上位2ビット(ポート5と6)で桁の選択、下位4ビットが表示する値になります。
「5」は2進数で「000101」なので、「out 5」とすると1桁目が「5」になります。
2桁目を点灯させようとおもえば、表示させる値に2進数の「010000」、すなわち16を足せばOK。
「OUT 19」だと、2桁目が3になります。
同様に3桁目の場合は32をプラス。
「9」を3桁目に表示したいなら、「OUT 41」。
なので、以下のようなプログラムを実行すると。
10 OUT 5 20 OUT 19 30 OUT 41 40 GOTO 10
3桁表示できました。
といっても、固定値を表示しただけなので、次はもうちょっとまともな表示を行ってみたいと思いますが。
ところで、このプログラムを実行すると、3桁目の「9」が若干明るく見えます。
これは、3桁目の表示後にGOTO文を処理するため、その分他の桁より長く光ってるからでしょう。
明るさを均等にするには、以下のようにGOTO文の前に全桁を消灯すると良いかと(40行目)。
10 OUT 5 20 OUT 19 30 OUT 41 40 OUT 10 50 GOTO 10
「OUT 0」では、1桁目に0が表示されてしまうので、何も表示されない値である「10」を1桁目に出力してます。
ちなみに、40行目を「OUT 0」にすると、「839」と表示されてるように見えます。
(そして8だけ微妙に明るさが違う)
というわけで、たぶん続きます。
IchigoJamで遊ぶ・その5 「7セグディスプレイを使う」
なんだか久々になりましたが、今回は7セグメント(略して7セグ)LEDを使ってみたいと思います。
ええ、また光りモノですとも。
7セグというのは、こういう「日」の字型になっている、よく見かけるお馴染みのやつです。
光る棒の部分が7本あるので7セグメント。
小数点のドット部分を入れると8セグメントですけどね。
(ドットのことは忘れて)これを制御するには7本の信号が必要になるんですけど、ここで困った問題が。
Ichigo Jamには出力ポートが6つしかない!
さて、どうしましょう?
※ Ichigo Jam も日々進化しており、新しいバージョンでは出力ポートはもっと増えています。
7セグメントデコーダを使う
しかし、世の中には便利なものがあるものです。
汎用ロジックICの中に、その名も7セグメントデコーダという7セグ用の「74HC4511」というICがありますので、これを使いましょう。
これが「74HC4511」です。
足が16本あります。
(日立(現ルネサス)のデータシートから引用)
構造はこんな感じになっていて、左側のABCDの4ビットを使って0から9の信号を入力すると、それに対応した7セグ用の信号が右側のa~gから出力されます。
入力が4ビットなので、これを使えば4本の出力ポートで7セグ表示が可能になるというワケです。
他に、このICが動作するためには電源も必要なので、VCCには電源を接続します。
LT,BT,LEといったのは制御用?なので、今は特に気にしなくても良いかと。
ちなみに、10以上の信号を入力(4ビットなので15まで入力可能)した場合、全てのセグメントが消えて何も表示されません。
BASICで制御する
というわけで、74HC4511と7セグLEDをこんな感じで接続します。
LT,BT,LEは、VCCやGNDに固定します。
(本当は他にも抵抗やらコンデンサやらを追加した方がいいんだと思いますが省略しています)
あとは、表示したい数字をOUT命令に指定すれだけでOK!
OUT命令はパラメータが1つだと、2ビット化して各ポートに出力してくれるためです。
早速、「OUT 1」を実行してみると・・・
この通り。
「OUT 9」だとこうなります。
下の横棒が光らないデザインですね。
「OUT 10」とすると何も表示されません。
プログラムでグルグル回してみます。
10 FOR I=0 TO 9 20 OUT I 30 WAIT 30 40 NEXT 50 GOTO 10
電子ルーレット
グルグルカウントするだけでは面白くないので、電子ルーレットみたいなのを作ってみました。
10 REM INIT 20 M=0 30 W=0 50 REM RANDOM 60 A=RND(10) 70 IF R=A THEN GOTO 60 80 R=A 90 OUT R 100 IF M=0 AND BTN(0)=1 THEN M=1 110 IF M=1 THEN W=W+1 120 IF W>20 THEN M=2 130 WAIT W 140 IF M<>2 THEN GOTO 60 150 REM RESULT 160 FOR I=1 TO 5 170 OUT R 180 WAIT 30 190 OUT 10 200 WAIT 30 210 NEXT 220 GOTO 10
本体のスイッチを押すとルーレットが遅くなっていき、最後に出目の数値か点滅します。
数値はカウントアップではなくランダムです。
「ルーレットなら、別に7セグ使わなくても画面で表示すればいいじゃん」 とか言われそうですけど、それを無理矢理作るのが電子工作なのです。
・・・ほんとかよ(笑)
というわけで、ではまた。
IchigoJamで遊ぶ その4 アナログ入力で温度計
IchigoJamには(あのRaspberry Piにも付いていない)アナログ入力が備わっていて、0V~3.3Vの範囲の電圧を0~1023の数値として取得できます。
今回はこのアナログ入力を使ってみようと思います。
アナログ温度センサで温度を測る
見た目はトランジスタみたいですけど、温度センサです。
(この形だとトランジスタだと思っていた時期が私もありました)
これはTMP36というアナログ温度センサで、この三つある足のひとつから、温度が25℃の時には750mVが出力され、そこから温度が1℃変わる毎に電圧も10mV増減します。
なので、この足をIchigoJamのアナログ入力につないで電圧を測れば、温度が分かるというわけです。
(ちなみに残り2本の足は、電源とGND)
例によってつなぎ方はこんな感じ。
TMP36のVoutというのが温度の出力で、Vsが電源です。
今回はIN2のアナログ入力を使うので、VoutとIN2をつないでます。
実際の接続はこんな感じ。
アナログ入力の値はANAという関数で調べられるので、早速取得してみます。
IchigoJamのアナログ入力は0~3.3Vが1024段階なので、1段階あたりは 3.3V ÷ 1024 ≒ 0.0032V =3.2mV。
アナログ入力の値が225ということは、3.2mvをかけると720mv。
25℃の時の750mVとの差は-30mVなので、温度は22℃という事になります。
若干肌寒い。
温度計で測ってみると22.8℃。
まぁまぁ近い値でした。
温度計プログラム
しかし、いちいちアナログ入力の値を調べて計算するのは面倒なので、こういうことはコンピュータにやらせましょう。
5 CLS 10 O=ANA(2)*32-5000 20 LOCATE 10,10 30 PRINT O/100; 40 PRINT "."; 50 PRINT O%100/10 60 GOTO 20
20行目、IchigoJamは小数を扱えない(たぶん)ので、アナログ入力の値に3.2mV分の32を掛け、500mV分の5000を引いておきます。
この値を100で割ると温度が求まるハズ。
40行目や60行目で、100で割ったり余りを求めたりして小数1桁まで表示してます。
温度の数字以外何も出さない、手抜きプログラムです。
では、実行~。
速すぎっ!
こんな温度計はせわしなさすぎる。
というわけで、途中にウェイトを入れて調整。
55 WAIT 10
まだ速い気もしますけど、そこはWAITを調整かな。
単にWAITを入れるだけではなくて、待ってる間にも値を測定し、それを平均化したものを表示するのが良いかもしれない。
温度計の分解能
温度計を動かしていると、値はころころ変わるわりに、小数部分は同じ数字ばかり出てきます。
これは、IcihgoJamのアナログ入力の分解能が約3.2mVであるのと、温度センサの1℃あたり10mVという仕様とが相まって、約0.3度単位でしか温度を測れないからでしょう。
もっと細かく温度を測ろうと思ったら、センサを1℃あたり20mVとかのものに換えたり、出力電圧を増幅したりが必要かと。
あるいは、上に書いた平均を求めるようにプログラムを改造しても、ある程度は細かくなりそうな気がします。
IchigoJamで遊ぶ その3 信号機を作る
信号機っぽいものを作ろう
前回は1個のLEDを制御したので、今度は三つくらい制御してみましょう。
せっかくなので、青(緑)・黄色(橙)・赤の3色のLEDを用意して、信号機もどきにチャレンジ。
こんな感じで、前回同様にOUT1には緑色のLEDを取り付け、加えてOUT2に黄色のLED、OUT3に赤色のLEDを接続します。
前回は「OUT 1」というコマンドを使っていましたが、実はこのOUTコマンドはパラメータを二つ指定することができて、以下のように使えます。
OUT 1,1 'OUT1をオンにする OUT 2,1 'OUT2をオンにする OUT 1,0 'OUT1をオフにする
※オンにするというのは正確には電圧をHighにする事ですが、今のところは単純にオンとオフとしておきます。
OUT 2,1 にすると黄色のLEDが光り、OUT 3,1にすると赤色のLEDが光るというわけです。
簡単ですねぇ。
で、こんなプログラムで、緑が6秒、黄色が1.5秒、赤色が6秒というような信号機っぽいものを作ってみました。
10 OUT 1,1 20 WAIT 360 30 OUT 1,0 40 OUT 2,1 50 WAIT 90 60 OUT 2,0 70 OUT 3,1 80 WAIT 360 90 OUT 3,0 100 GOTO 10
見た目はちょっとアレですけど、信号機っぽい動作になってるハズ。
プログラムが分かりづらい!
しかし、このプログラムはちゃんと動きはしますが、出力先の指定とオンとオフが入り乱れていてややこしいし、なんだか無駄に長いです。
プログラムを一端途中で止めてから再度実行すると、初期化してないので青と赤が同時に光ったりする不具合もあります。
なので、ここは複数の出力を一度にオンとオフできる方法を使ってみます。
といっても、何のことは無い(前回も使っていた) OUTコマンドをパラメータ一つで使うだけなんですけどね。
OUTコマンドをパラメータ一つのみで使うと、そのパラメータを2進数にしたときの各ビットに対応したOUT端子がオン・オフされます。
たとえば、パラメータが「6」の場合、2進数だと「00000110」なので、OUT2とOUT3がオンで他はオフとなるわけです。
というわけで、プログラムをこういう風に書き換えました。
10 OUT 1 20 WAIT 360 30 OUT 2 40 WAIT 90 50 OUT 4 60 WAIT 360 70 GOTO 10
50行目の「OUT 4」 が、OUT4端子をオンにするものと思いがちですけど、実際は「OUT3端子のみオン」にしています。
個人的には分かりやすくなったと思ってますが、2進数を知らないと余計に分かりにくくなったかも?
ただ、プログラムは短くなったので良しとします・・・してください。
おまけ・歩行者用信号機
ほとんど同じようなプログラムですけど、歩行者用信号機も作ってみました。
10 OUT 1 20 WAIT 360 30 FOR I=1 TO 5 40 OUT 0 50 WAIT 30 60 OUT 1 70 WAIT 30 80 NEXT 90 OUT 4 100 WAIT 360 110 GOTO 10
動き的にはこちらの方が面白いかも(笑)
IchigoJamで遊ぶ その2
ハルチカ・・ではなくLチカ
今回は、電子工作での「Hello,World!」と言われるLチカ(LEDをチカチカ点滅させる)にチャレンジしてみましょう。
といっても、私の買ってきたIchigoJamのボードには最初からLEDが実装されています。
BASICにもLEDコマンドというものがあり、実に簡単に制御できます。
というわけで、以下のようなプログラムを作成。
10 LED 1 20 WAIT 30 30 LED 0 40 WAIT 30 50 GOTO 10
LEDをオンにして、30フレーム(0.5秒)待機し、LEDをオフにして、また30フレーム待機、を繰り返すだけのプログラム。
実行させると・・・
Lチカ完成です!
(刺さってる赤い線やらは今のところ気にしないでください)
外付けLEDをチカチカさせる。
しかし、基板上のLEDをチカチカさせるだけでは、いまいち面白くない。
なので、ブレッドボードを用意して、そこにLEDを取り付けてチカチカさせてみます。
つなぎ方はこういう感じ。
IchigoJamの出力ポートのOUT1とGNDの間にLEDを接続。
LEDに電流が流れすぎないよう、途中に抵抗も入れます。
実際の接続。
白い線がOUT1、黒い線がGNDで、IchigoJamのそれぞれのポートに刺さってます。
プログラムも出力ポートを使用するように変更。
といっても「LED」を「OUT」に変えるだけですけどね。
10 OUT 1 20 WAIT 30 30 OUT 0 40 WAIT 30 50 GOTO 10
そして実行。
無事にチカチカしました。
やっていることは基板上のLEDを動かす事と変わり無いんですけど、自分で取り付けた部品を動かすというのが楽しいところですね。
次回、LEDでもうちょっと遊んでみたいと思います。
謝辞
回路図(と言うほどのものではないですが)の作成には、水魚堂さんのBSch3Vを使用させて頂きました。
ハルチカとは
初野晴さんによる日常系の青春ミステリ小説。及び、それを原作としたPA WORKS制作によるアニメーション。
個人的に好きな作品ですけど、Ichigo Jamには全然関係ありません。
IchigoJamで遊ぶ
IchigoJamとは
ビデオ出力とPS2キーボードを接続すればすぐに使える、小さなワンボードコンピュータ。
電源ONでBASICが起動する、昔のMSXライクなパソコンです。
GPIOというハードウェアの入出力端子もついていて、これもBASICで簡単に制御できるので、電子工作にも最適。
「こどもパソコン」という触れ込みですが、MSX世代の大人の琴線に触れるのも間違いなし(?)
値段も1500円(完成品は2000円)とお手頃です。
Hello,World!
では、早速モニタをつないで起動。
起動後の画面はこんな感じで、とてもシンプル。
続いて、Hello,World をプログラムしてみます。
BASICのスタイルも昔懐かしい行番号付き。
入力できたら「RUN」でプログラムを実行します。
動いた!
起動から、プログラム入力、実行までを動画にしてみました。
動くHello,World
これだけでは面白くないので、動くHello,World!というのを作ってみました。
プログラムはこんな感じです。
10 CLS 20 FOR X=0 TO 10 30 LOCATE X,10 40 PRINT" Hello,World!" 50 FOR I=0 TO 50:NEXT 60 NEXT
実行結果は、コチラ。
「Hellow,World!」の文字が左から右に動きます。
ただそれだけです。
ポイントは、40行目で表示する「Hello,World!」の前にスペースを一つ置いてあり、これにより先頭文字を消しながら動いているように見せかけていること。
あと、50行目の何もしないループで時間稼ぎをしてるところでしょうか。
まぁ、今となっては、ほとんど何の役にも立たないテクニックですけどね。
実際、IchigoJam BASICには指定されたフレームだけ待機するWAITというコマンドがあるので、50行目は以下のようにするのが良いかも。
50 WAIT 5
というわけで、IchigoJamでは、もうちょっと遊んでみたいと思います。