Arduinoで74HC4051APを使う−その1−

Arduino で自作ダーツ盤を作成するにあたって、
7×10のマトリックス回路を入力しなければならないことがわかりました。

そのためには Arduino ではポートが足りないので、
ロジックICを使って、複数のボタンを制御しようと考えました。

いろいろなサイトを見ていると
74HC4051AP というICが良いようなので、
いろいろと実践してみました。

参考にしたサイト

ArduinoMIDIアナログシーケンサー
http://dkylog.air-nifty.com/dkylog/2009/12/arduinomidi-9dc.html

Analog Multiplexer/Demultiplexer - 4051
http://www.arduino.cc/playground/learning/4051

そもそも、電子回路の知識ゼロなので
どういったものなのか。まったくわかりませんでしたw

4051の使い方について

s0, s1, s2 へそれぞれ、HIGH か LOW の信号をデジタルピンから送ります。

3箇所に同時に送信するので、2進数の考え方をすると、8種類の信号が送ることができます。

↓こんな感じ


s0 : s1 : s2
0 : 0 : 0
1 : 0 : 0
0 : 1 : 0
1 : 1 : 0
0 : 0 : 1
1 : 0 : 1
0 : 1 : 1
1 : 1 : 1

そして、y0 〜 y7 はボタンや可変抵抗などの入力を受け取ります。

4051は s0, s1, s2 で信号を元に y0 〜 y7 のどの入力を受け取るのか判断します。

Arduino のプログラムとしては
for文を用いて、高速で信号を送り出すことで、
あたかも、8つの入力を同時に受け取っているかのように動作します。

8つのボタンを入力できる回路図

ソースコード


/*
* 74HC4051 を使用して、8つのボタン入力を制御します。
*/

// 固定値を設定
int MAX_CNT = 4;

// 入出力ピンを指定
int led = 13;
int s0 = 2;
int s1 = 3;
int s2 = 4;
int input = A0;

// 各変数を宣言
int r0 = 0;
int r1 = 0;
int r2 = 0;
int val = 0;
int count = 0;

void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
digitalWrite(led, HIGH);
Serial.begin(9600);
}

void loop () {
for (count=0; count<=MAX_CNT; count++) {
r0 = bitRead(count, 0);
r1 = bitRead(count, 1);
r2 = bitRead(count, 2);

digitalWrite(2, r0);
digitalWrite(3, r1);
digitalWrite(4, r2);

val = analogRead(input)/4;
if (val > 0) {
Serial.println(count*10);
}
delay (100);
}
}

これで基本的な使い方はわかると思います。