アフィリエイト広告
アフィリエイト広告

ラインデコーダによるデジット制御をArduinoで行なう(スケッチ)

ラインデコーダによるデジット制御をArduinoで行なう(回路)」で 4 桁 7 セグメント LED を点灯制御するための回路を作りました。
今回はこの回路を制御する Arduino のスケッチを作ってみましょう。

4 桁 7 セグメント LED 制御回路

この回路は、7 セグメントドライバ TC4511 でセグメントを制御、論理 IC で組み立てた 2 to 4 ラインデコーダでデジットを制御し、複数の桁を同時点灯させないようになっています。

Arduino スケッチ

上の回路を制御するための Arduino のスケッチです。
もっとまとめることができる部分もありますが、いまのところは自分にもわかりやすく、こんな程度で (^_^;)

  1. void setup() {
  2.   pinMode(2, OUTPUT);
  3.   pinMode(3, OUTPUT);
  4.   pinMode(4, OUTPUT);
  5.   pinMode(5, OUTPUT);
  6.   pinMode(6, OUTPUT);
  7.   pinMode(7, OUTPUT);
  8.   pinMode(8, OUTPUT);
  9.   pinMode(9, OUTPUT);
  10. }
  11. void loop() {
  12.   int sensorValue = analogRead(A0);
  13.   int displayValue = map(sensorValue, 0, 1023, 0, 1023);
  14.   for(int i=0; i<4; i++) {
  15.     digitalWrite(7, i & B01);
  16.     digitalWrite(8, i & B10);
  17.     int digitValue = displayValue % 10;
  18.     if((0 < i) && (0 == displayValue)) {
  19.       digitalWrite(6, LOW);
  20.     } else {
  21.       digitalWrite(6, HIGH);
  22.     }
  23.     digitalWrite(2, digitValue & B0001);
  24.     digitalWrite(3, digitValue & B0010);
  25.     digitalWrite(4, digitValue & B0100);
  26.     digitalWrite(5, digitValue & B1000);
  27.     digitalWrite(9, HIGH);
  28.     delay(4);
  29.     digitalWrite(9, LOW);
  30.     displayValue /= 10;
  31.   }
  32. }

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 に置き換えることにしましょう。

タイトルとURLをコピーしました