4x4のスイッチマトリックス

電子工作で良く使う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 OUT2OUT3OUT4
IN1SW1SW5SW9SW13
IN2SW2SW6SW10SW14
IN3SW3SW7SW11SW15
IN4SW4SW8SW12SW16

ただし、これがうまくいくのはいずれか1つのスイッチが押された時だけです。 もし、SW1とSW5が同時にONであったら、OUT1が1の時、SW5を介してOUT2へ1の信号が行く、 すなわちOUT1とOUT2が直結してしまいます。両方のポートは出力なので、出力がぶつかって壊れるかもしれません。

これに加えてSW7がONだったら、SW5を介してIN2へ戻る信号がSW7を通じてIN3へ出力されます。 すなわち、OUT1が1で、IN3に信号が出ますので押してもいないSW3がONのように見えてしまいます。

この2つを防ぐためには、上で言うところのSW5の逆流を止めれば良いことになります。以下のような回路図となります。