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

Arduinoで2進数入力7セグLEDドライバを制御

さて、「 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 ] となります。

以上をまとめたスケッチが以下です。

  1. // analog2bcd.ino 2020/03/09 by meyon
  2. void setup() {
  3.   pinMode(2, OUTPUT);
  4.   pinMode(3, OUTPUT);
  5.   pinMode(4, OUTPUT);
  6.   pinMode(5, OUTPUT);
  7. }
  8. void loop() {
  9.   int sensorValue = analogRead(A0);
  10.   byte digitData = sensorValue *10/1024;
  11.   digitalWrite(2, digitData&B0001);
  12.   digitalWrite(3, digitData&B0010);
  13.   digitalWrite(4, digitData&B0100);
  14.   digitalWrite(5, digitData&B1000);
  15. }

ブレッドボード

論理回路部分の左下にあった DIP スイッチとプルダウン抵抗を取り外し、Arduino からの出力をつないでいます。

下の LED は入力の 4 ビットの状態を表示していて、写真では 0101 ( 1 が点灯) となっています。7 セグメント LED は入力に応じた [ 5 ] を表示しています。

Arduino の下にあるボリュームを回すと、その位置に応じた値が 7 セグメント LED に表示されます。

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