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だけ微妙に明るさが違う)
というわけで、たぶん続きます。