「ラインデコーダによるデジット制御をArduinoで行なう(回路)」で 4 桁 7 セグメント LED を点灯制御するための回路を作りました。
今回はこの回路を制御する Arduino のスケッチを作ってみましょう。
4 桁 7 セグメント LED 制御回路
この回路は、7 セグメントドライバ TC4511 でセグメントを制御、論理 IC で組み立てた 2 to 4 ラインデコーダでデジットを制御し、複数の桁を同時点灯させないようになっています。
Arduino スケッチ
上の回路を制御するための Arduino のスケッチです。
もっとまとめることができる部分もありますが、いまのところは自分にもわかりやすく、こんな程度で (^_^;)
- void setup() {
- pinMode(2, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(4, OUTPUT);
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- }
- void loop() {
- int sensorValue = analogRead(A0);
- int displayValue = map(sensorValue, 0, 1023, 0, 1023);
- for(int i=0; i<4; i++) {
- digitalWrite(7, i & B01);
- digitalWrite(8, i & B10);
- int digitValue = displayValue % 10;
- if((0 < i) && (0 == displayValue)) {
- digitalWrite(6, LOW);
- } else {
- digitalWrite(6, HIGH);
- }
- digitalWrite(2, digitValue & B0001);
- digitalWrite(3, digitValue & B0010);
- digitalWrite(4, digitValue & B0100);
- digitalWrite(5, digitValue & B1000);
- digitalWrite(9, HIGH);
- delay(4);
- digitalWrite(9, LOW);
- displayValue /= 10;
- }
- }
13 〜 14 行
A0 ピンにつながれたボリュームからの電圧を取り込んでいます。14 行目の map() は、表示する値の範囲をマッピングするためのもので、現状はデジタル値をそのまま表示させています。
16 〜 18 行
for() 文で、デジット制御の桁位置の値 0 〜 3 を繰り返し出力しています。
20 、37 行
表示する値を 10 で割った余りが、現在の桁に表示させる数値です。次の桁へ移るときには、 10 で割ることで処理済みの桁を取り除いてしまいます。
28 〜 31 行
現在の桁に表示させる数値をビットごとに分けて D2 〜 D5 ピンに出力します。ビット演算の結果が 0 ならば LOW 、0 以外ならば HIGH が出力されます。
33 〜 35 行
表示する値を出力したら、D9 ピンを 4ms だけ HIGH にして桁を点灯させます。
1つの桁は 4ms 点灯し、他の 3 つの桁を制御している 12ms のあいだ消灯することになりますから、周期は 16ms 、デューティー比は 25% です。このぐらいの周期であればチラツキはないと思います。
ちなみに、この delay() を仮に 100ms 程度にしてみると、ダイナミック点灯のデジット制御の動きがよくわかると思います。
22 〜 26 行
ゼロサプレス制御を行なっています。2 桁目以降、数値が 0 であれば D6 ピンを LOW にしてセグメントを消灯しています。
ゼロサプレスも論理回路で作ることができると思いますが、これぐらいの制御は Arduino にやらせても負担にはならないでしょう。
なお、スケッチに関しては Arduinoで遊ぶページ「4桁7セグメントLEDで始めるArduino」を参考にさせていただきました。ありがとうございました。
ブレッドボード
え〜と、最終形のブレッドボードの写真が… ない (^_^;)
この写真はセグメントの電流値を調整した後のものだと思います。でもまぁ、全体の構成はこんな感じですので。
上段の右側はデジット制御のトランジスタ、その左に AND ゲートとインバータによるラインデコーダがあります。
下段中央が 7 セグメント LED ドライバ TC4511 で、Arduino からこのドライバへ表示する数値データを、上のラインデコーダへ桁の制御データを送っています。
写真ではわかりにくかもしれませんが、ダイナミック点灯でも LED は十分明るく点灯しています。
左は、ラインデコーダの出力波形です。
16ms 周期で 4ms が HIGH になっていることがわかります。
デューティー比は 24.7% です。Arduino の実行時間の分が必要ですから、25% きっちりとはなりませんね。
周波数が 61.538Hz となっていますから、周期を逆算すると 16.25ms 、HIGH の時間は 4.01ms ということでしょうか。
さて、秋月電子通商へ注文してあった 2 to 4 ラインデコーダ TC74HCT139AP が届きましたので、次はラインデコーダ部分をこの IC に置き換えることにしましょう。