電子工作で良く使う4行x4列の計16個のスイッチをArduinoで取り込む回路です。以下は自分で失敗したことの覚書になっています。 16個のスイッチの状態をArduinoで取り込みたい時、次の回路図のようにスイッチそれぞれにポートを使うとすると、ポートが16個必要になります。 Arduino UNO R3の場合、Digital INのポートは16個なので、2個足らなくなってしまいます。
そこで、次のようなマトリックス構造を作ります。下の回路で、OUT1,2,3,4はArduinoの出力、IN1,2,3,4は入力です。 OUT1はSW1,SW2,SW3,SW4に接続されています。 また、IN1にはSW1,SW5,SW9,SW13が接続されています。
OUT1,2,3,4 はいずれかが1になり、その他はゼロです。もし、OUT1が1で、他がゼロである時、 もしSW1のスイッチがONであればIN1が1になります。
同様に、OUT1,2,3,4のいずれを1にしたかと、IN1,2,3,4のいずれが1であるかをArduinoが判断すれば、 どのスイッチがONであるか、下の表のようにわかります。
| OUT1 | OUT2 | OUT3 | OUT4 | |
|---|---|---|---|---|
| IN1 | SW1 | SW5 | SW9 | SW13 |
| IN2 | SW2 | SW6 | SW10 | SW14 |
| IN3 | SW3 | SW7 | SW11 | SW15 |
| IN4 | SW4 | SW8 | SW12 | SW16 |
ただし、これがうまくいくのはいずれか1つのスイッチが押された時だけです。 もし、SW1とSW5が同時にONであったら、OUT1が1の時、SW5を介してOUT2へ1の信号が行く、 すなわちOUT1とOUT2が直結してしまいます。両方のポートは出力なので、出力がぶつかって壊れるかもしれません。
これに加えてSW7がONだったら、SW5を介してIN2へ戻る信号がSW7を通じてIN3へ出力されます。 すなわち、OUT1が1で、IN3に信号が出ますので押してもいないSW3がONのように見えてしまいます。
この2つを防ぐためには、上で言うところのSW5の逆流を止めれば良いことになります。以下のような回路図となります。