さて、「 2 進数入力 7 セグ LED ドライバを作る (論理回路) 」で作った論理回路に Arduino をつないで、7 セグメント LED を表示制御してみましょう。7 セグメント LED の制御はドライバに任せればよいので、Arduino は 4 ビットのデータを出力するだけです。
Arduino をつないだ回路図
データ入力部分の DIP スイッチを Arduino に置き換えました。論理回路部分以降は変更ありません。
ボリュームの位置に応じて、7 セグメント LED に表示される数字が変化していきます。
ボリュームからの電圧をアナログポート A0 に入力し、Arduino で 4 ビットの 2 進数 (BCD コード) に変換します。2 進数はデジタルピン D2 〜 D5 に出力、それぞれにつながった 4 個の LED は BCD コードの状態を表示します。
スケッチを作る
スケッチを作りましょう。
しかし、いやぁ〜たまに Arduino IDE を開いてみると、何をどうすればよいのかわからない。歳とるとすぐに忘れてしまうんだよ (^_^;)
閑話休題。
まずは入力部分。アナログピン A0 につながれたボリュームの電圧を受け取って変数に代入します。
- int sensorValue = analogRead(A0);
analogRead() は、0 から動作電圧の 5V までの電圧を、0 から 1023 までの整数値に変換します。変換された整数値を、変数 sensorValue に代入します。
次に、その数値を 7 セグメント LED に表示させるために、0 から 9 の整数値に変換します。
- byte digitData = sensorValue *10/1024;
スケッチ例によく sensorValue *9/1023 となっていることがあるのですが、これはあまりうまくありません。
ボリュームの位置によって 0 から 9 を表示させるということは、入力値の範囲を 10 等分するということです。そのために入力値を 9 倍ではなく 10 倍しています。また、入力値自体も 1024 等分する必要があるので、上のような定数を掛け算することにします。
なお、入力を電圧測定値として表示させる場合などは、少し考え方が変わってきます。それはまた機会があれば。
変換した数値は変数 digitData に代入します。この数値を 4 ビットの 2 進数として出力するために digitData は 2 進数を表す byte 形式にしました。これで 0 から 9 までの数値は 2 進数の B0000 から B1001 に変換されます。
ではこの 2 進数を、デジタルピン D2 から D5 に 1 ビットずつ出力しましょう。
- digitalWrite(2, digitData&B0001);
- digitalWrite(3, digitData&B0010);
- digitalWrite(4, digitData&B0100);
- digitalWrite(5, digitData&B1000);
デジタルピンの出力を決めているのはビット演算です。
デジタルピン D2 では digitData の値と B0001 とを、D3 では digitData の値と B0010 とを AND 演算しています。D4 D5 も同様にそれぞれの桁を AND 演算します。
たとえば digitData が B0101 ( 10 進数の 5 ) の場合、D2 では AND 演算すると B0001 です。digitalWrite() は 0 のとき LOW 、0 以外のとき HIGH ですから、D2 は HIGH になります。
同様に、D3 では B0010 と AND 演算しますので、digitData が B0101 のとき演算値は B0000 で出力は LOW 。D4 は B0100 と演算して B0100 、これは 0 以外ですので HIGH になります。D5 は B0000 ですから LOW。
これらの出力が Z0 〜 Z3 へ渡され、ドライバの入力値は 0100 、7 セグメント LED の表示は [ 5 ] となります。
以上をまとめたスケッチが以下です。
- // analog2bcd.ino 2020/03/09 by meyon
- void setup() {
- pinMode(2, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(4, OUTPUT);
- pinMode(5, OUTPUT);
- }
- void loop() {
- int sensorValue = analogRead(A0);
- byte digitData = sensorValue *10/1024;
- digitalWrite(2, digitData&B0001);
- digitalWrite(3, digitData&B0010);
- digitalWrite(4, digitData&B0100);
- digitalWrite(5, digitData&B1000);
- }
ブレッドボード
論理回路部分の左下にあった DIP スイッチとプルダウン抵抗を取り外し、Arduino からの出力をつないでいます。
下の LED は入力の 4 ビットの状態を表示していて、写真では 0101 ( 1 が点灯) となっています。7 セグメント LED は入力に応じた [ 5 ] を表示しています。
Arduino の下にあるボリュームを回すと、その位置に応じた値が 7 セグメント LED に表示されます。