2013年5月16日木曜日

arduinoで4桁7セグメントLEDを使ってみる


4桁7セグメントLEDを購入したのでシールド化しました。



秋月で購入,、SL40562-LB 250円。
高輝度4桁7セグメントLED青色、カソードコモン。
8つのエレメント+4桁分のカソードで12ピン。
ダイナミック点灯前提で4桁を高速に切り替えて表示します。

ブレッドボードに挿せます。

12ビットシリアル-パラレル変換機NJU3714D。
上記4桁7セグメントLEDを直接arduinoに接続もできますが、使うピン数は11本です。
使う目的によってはそれでもOKですが、このICを使えば使用ピンを4本に節約出来ます。
arduinoで7セグメントLEDを使う時、シフトレジスタ74HC595や74AC164がよく使われるようですが、秋月になかったのでNJU3714Dを採用。これなら、1桁分の8ビットと、どの桁を表示するかの切り替えに4ビットを使えばちょうど12ビット。
1ピンあたり、25mAまで流せるのでLEDの駆動もできます。
今回は使用していませんが、ICを連結をしてもっと多くのビット数を扱うこともできるようです。
ちなみに8ビット版はNJU3711D。(連結不可)
ところで、74HC595もNJU3714Dも中身は、シフトレジスタとラッチ回路のようですし使い方も同じようですが、呼び方がシフトレジスタとシリアルパラレル変換機と呼びかたが違うのは登録商標的な何かがあるのでしょうか?
ほかにIOポート拡張、マルチプレクサなんて呼ぶこともあるようです。

カソードを直接NJU3714Dに接続して吸い込むには電流が大きすぎるので、トランジスタC1815をスイッチングしてGNDに流します。


◆回路図
arduinoから4ピンで制御します。
7セグメントLEDの表示するだけのデモ的なスケッチであればCLR(パラレル出力をすべてL)を使わなくても、表示は綺麗だと思います。
各桁の表示時間を均等にしないと1桁だけ明るくなったりするので、CLRを使用しました。

ブレッドボードで試運転。緑っぽいですが肉眼ではちゃんと青く見えます。

秋月Cタイプユニバーサル基板にハンダ付け。
一方の長辺をカットしています。



秋月arduino互換ボード基板(150円)をシールドのベースにします。

パターンから5VとGNDを引き、厚みのある両面テープで貼り付け、固定とショート防止。

arduinoに重ねて制御ピンと接続、動きました。




◆スケッチ
デモ部分を削れば半分ぐらいになります。


関数disp7()に表示したい文字のキャラクタコードを渡すだけ。(例)disp7("-12.3");
   disp7("abcd");
   disp7(str);
キャラクタコード0~9 → 表示文字0~9
キャラクタコードa~f → 表示文字a~f と一致しています。
H、L、Pもキャラクタコードと表示が一致しています。
小数点、マイナス記号、半角スペースは自動的にキャラクタコードに置き換えられます。
その他のキャラクタコードには記号や1セグメントのみの表示に割り当てました。
組み合わせて切り替えれば簡単なアニメーションになります。

数値や数値の入った変数はString( val )の様に変換してください。
(例)int i_val = -456;
   disp7(String(i_val));
※String()で変換できる型には制限があります。参考リンク
空白の表示や、小数点のみ、複数の小数点も表示できます。



16msごとにMsTimer2でタイマー割り込みをして表示。
なので、他にMsTimer2を使ったものや、タイマー2が使うD3、D11のPWMも使えなくなると思います。
4桁未満の時は右寄せにし、左の空きは変数 fill_left で指定した文字で埋めます。
5桁以上の時は、下4桁だけを表示。

void demo(){
省略
}
とデモ用の変数をごっそり削れば流用出来ます。

disp7()に渡された文字列は処理されて str_7seg、pos_dot に保存されます。その2つから disp7seg() がNJU3714Dに4ビット+8ビットを送ります。

shiftOut()は、一度の命令で8ビット(固定)を送ります。参考リンク
なので、上位4ビットはshiftOut()を使っていません。



環境:arduinoUnoR3、IDE1.0.4、win7(32bit)






1 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除