BCD-to-Seven Segment Latch/Decoder/Driver(TC4511BP)
ArduinoUNOを使って7セグLEDに数字を表示したいです。 Arduinoに直繋ぎでも表示は出来るのですが、電流量的にマイコンに優しくない・GPIOピンを1文字で7pinも使う・プログラムが煩雑になる・PWMpinが足りず1文字の調光すら出来ない・・・。と安易な手段は後々大変な事になります(;'∀')
「7セグLEDドライバ」で検索すると、シリアルで3,4文字制御出来るモノとか、ダイナミック点灯(輝度半減以下)する物が殆どでした。
欲しい条件として、
①MAX輝度は落とさず
②調光出来て
③文字数が1文字単位で自由に決められ
④GPIOpin数を節約出来
⑤プログラムが簡単で
⑥入手性の良い
⑦ブレッドボードで使えるDIP形状IC
・・・で探した所「TC4511BP」(TOSHIBA製)が見つかりました!(^^)/
「74HC4511」(NXP製)や「CD74HC4511」(TEXAS INSTRUMENTS製)等、各社出しているようですが、入手性の良い「TOSHIBA製」ですね、
と言う事で実際に「TC4511BP」を使って7セグLEDを点灯してみました!
1.「7セグメント LED デコーダ」とは
「7セグメントLEDドライバ」・「7セグメントLEDデコーダ」・「7セグメントディスプレイ・・・」等など色々呼ばれています。
機能としては、2進数から10進数にエンコード※2(7セグメントLEDデコーダ※3,4では?作る人10進→エンコード→マイコン2進→デコード→見る人10進の意味?)する回路と、その結果を7セグメントLED※1に出力しドライブする回路からなるものです。
※1:7セグメントLEDとは、7つのセグメント「a~g」で構成され、個々の部分が点灯したり消灯したりすることで、「0~9」を表示するもの。また小数点「.」を表す8番目のセグメントとして「DP」がある。
図1:実験で使う7セグメントLED「OSL10561-IW(LW) 」
※2:エンコードとは、データを他の形式へ変換すること。
※3:デコードとは、エンコードされたデータを元の形式へ戻すこと。
1.1 「TC4511BP」の概要
今回使用する「TC4511BP」の特徴として、以下4項目が挙げられます。
①BCD※5 コードの入力を 7 セグメント表示素子駆動信号に変換し
②カソードコモン型LEDを直接駆動
1.2 「TC4511BP」の仕様
「TC4511BP」の仕様を表1に、真理値表を表2に示します。
項目 | 絶対最大定格 |
電源電圧(VDD) 単位:V | Vss-0.5 ~ Vss+20 |
入力電圧(VIN) 単位:V | Vss-0.5 ~ VDD+0.5 |
出力電圧(VOUT) 単位:V | Vss-0.5 ~ VDD+0.5 |
入力電流(IIN) 単位:mA | ±10 |
出力電流(IOH) 単位:mA | -50 |
許容損失(PD) 単位:mW | 300(DIP)/180(SOP) |
動作温度(Topr) 単位:℃ | -40~85 |
保存温度(Tstg) 単位:℃ | -65~150 |
表2:真理値表
※詳細はプログラム中のコメント参照
2.実験!
実際にArduinoUNOに「TC4511BP」を接続して「7セグメントLED」を点灯してみました!
2.1 接続
回路図を図2に、ブレッドボード図を図3に、実際に繋げた状態を図4に示します。
図2:「TC4511BP」と「OSL10561-IW(LW) 」接続 回路図
図3:ブレッドボード図 図4:実際に作ったもの
2.2 プログラム
図4の回路で使っているArduinoUNOに書き込むプログラムを図5に示します。
また参考に、 BI 端子はBCDコード 入力とは無関係に全出力を“L” (消灯) する事が可能なので、そこに繋がった5pinからPWM出力して調光するプログラムを図6に示します。
#define TC4511_LE 6 #define TC4511_BI 5 #define TC4511_LT 4 #define TC4511_D 7 #define TC4511_C 3 #define TC4511_B 2 #define TC4511_A 8 void setup() { Serial.begin(9600); pinMode(TC4511_LE, OUTPUT); pinMode(TC4511_BI, OUTPUT); pinMode(TC4511_LT, OUTPUT); pinMode(TC4511_D, OUTPUT); pinMode(TC4511_C, OUTPUT); pinMode(TC4511_B, OUTPUT); pinMode(TC4511_A, OUTPUT); } #define Array 19 bool Val[Array][7] ={ /*LE,BI,LT, D, C, B, A*/ { 0, 0, 0, 0, 0, 0, 0}, //8 ※優先順位1位(条件: LT=0) { 0, 0, 1, 0, 0, 1, 1}, //Blank ※優先順位2位(条件: BI=0 and LT=1) { 1, 1, 1, 0, 0, 0, 0}, //前回値保持 ※優先順位3位(条件:LE=1 and BI=1 and LT=1) { 0, 1, 1, 0, 0, 0, 0}, //0 ※以下優先順位4位(条件:LE=0 and BI=1 and LT=1) { 0, 1, 1, 0, 0, 0, 1}, //1 { 0, 1, 1, 0, 0, 1, 0}, //2 { 0, 1, 1, 0, 0, 1, 1}, //3 { 0, 1, 1, 0, 1, 0, 0}, //4 { 0, 1, 1, 0, 1, 0, 1}, //5 { 0, 1, 1, 0, 1, 1, 0}, //6 { 0, 1, 1, 0, 1, 1, 1}, //7 { 0, 1, 1, 1, 0, 0, 0}, //8 { 0, 1, 1, 1, 0, 0, 1}, //9 { 0, 1, 1, 1, 0, 1, 0}, //Blank { 0, 1, 1, 1, 0, 1, 1}, //Blank { 0, 1, 1, 1, 1, 0, 0}, //Blank { 0, 1, 1, 1, 1, 0, 1}, //Blank { 0, 1, 1, 1, 1, 1, 0}, //Blank { 0, 1, 1, 1, 1, 1, 1}, //Blank } ; void loop() { for (int i = 0; i < Array; i++) { Serial.println(i); digitalWrite(TC4511_LE, Val[i][0]); digitalWrite(TC4511_BI, Val[i][1]); digitalWrite(TC4511_LT, Val[i][2]); digitalWrite(TC4511_D, Val[i][3]); digitalWrite(TC4511_C, Val[i][4]); digitalWrite(TC4511_B, Val[i][5]); digitalWrite(TC4511_A, Val[i][6]); delay(1000); } }
図5:Simpleプログラム例
#define TC4511_LE 6 #define TC4511_BI 5 #define TC4511_LT 4 #define TC4511_D 7 #define TC4511_C 3 #define TC4511_B 2 #define TC4511_A 8 void setup() { Serial.begin(9600); pinMode(TC4511_LE, OUTPUT); pinMode(TC4511_BI, OUTPUT); pinMode(TC4511_LT, OUTPUT); pinMode(TC4511_D, OUTPUT); pinMode(TC4511_C, OUTPUT); pinMode(TC4511_B, OUTPUT); pinMode(TC4511_A, OUTPUT); } #define Array 19 bool Val[Array][7] ={ /*LE,BI,LT, D, C, B, A*/ { 0, 0, 0, 0, 0, 0, 0}, //8 ※優先順位1位(条件: LT=0) { 0, 0, 1, 0, 0, 1, 1}, //Blank ※優先順位2位(条件: BI=0 and LT=1) { 1, 1, 1, 0, 0, 0, 0}, //前回値保持 ※優先順位3位(条件:LE=1 and BI=1 and LT=1) { 0, 1, 1, 0, 0, 0, 0}, //0 ※以下優先順位4位(条件:LE=0 and BI=1 and LT=1) { 0, 1, 1, 0, 0, 0, 1}, //1 { 0, 1, 1, 0, 0, 1, 0}, //2 { 0, 1, 1, 0, 0, 1, 1}, //3 { 0, 1, 1, 0, 1, 0, 0}, //4 { 0, 1, 1, 0, 1, 0, 1}, //5 { 0, 1, 1, 0, 1, 1, 0}, //6 { 0, 1, 1, 0, 1, 1, 1}, //7 { 0, 1, 1, 1, 0, 0, 0}, //8 { 0, 1, 1, 1, 0, 0, 1}, //9 { 0, 1, 1, 1, 0, 1, 0}, //Blank { 0, 1, 1, 1, 0, 1, 1}, //Blank { 0, 1, 1, 1, 1, 0, 0}, //Blank { 0, 1, 1, 1, 1, 0, 1}, //Blank { 0, 1, 1, 1, 1, 1, 0}, //Blank { 0, 1, 1, 1, 1, 1, 1}, //Blank } ; void loop() { for (int i = 3; i < 13; i++) { Serial.println(i); digitalWrite(TC4511_LE, Val[i][0]); if(i>2 && i<13){ analogWrite(TC4511_BI, (i-2)*25.5); } digitalWrite(TC4511_LT, Val[i][2]); digitalWrite(TC4511_D, Val[i][3]); digitalWrite(TC4511_C, Val[i][4]); digitalWrite(TC4511_B, Val[i][5]); digitalWrite(TC4511_A, Val[i][6]); delay(200); } }
図6:PWM調光プログラム例
2.3 実験!
図4の回路で図5のプログラムを実行した結果を図7,8に示します。
図7:8,blank(3),3,0,1,2,3,4,5,6,7,8,9,blank…と、18データ表示成功!
〇図5 simpleプログラム
当然ですが、表2真理値表の通り正しく「Outputs」が得られました!(*^^)v
〇図6 PWM調光プログラム
実行すると「0」の輝度10%から10%ずつ増加し「9」で最大輝度「100%」に調光された数値が表示されました!(^^)!
3.まとめ!
このIC「TC4511BP」シンプルで使い勝手も良く、しかも一個80円とお安くて良いですね!
次回は!二桁表示やってみます!それと点灯データを配列で持たせずにbit演算で何とかなりそうな気がしますね( ;∀;)
励みになりますのでよければクリック下さい(^o^)/