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が接続されています。 すなわち、上のやり方では16個のスイッチの状態を知るために16個の入力ポートが必要でしたが、 この回路では4個の出力と、4個の入力ポートがあれば可能となります。

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の逆流を止めれば良いことになります。以下のような回路図となります。 これで、4個の出力ポートと、4個の入力ポート、合わせて8個のポートがあれば16このスイッチを検出することができます。



3to8ラインデコーダーを使う

上のマトリックスでは、8個のポートが必要でしたが、さらにポート数を減らすことができます。 デコーダーを使うことです。ここでは、74HC138という、よく使われるデコーダーICを使います。 このICは、3つの入力信号の組み合わせによって、8本ある出力のうちどれか1本だけを選んでONにする回路です。 3つの入力は0〜7までの数字(3ビットのバイナリ)を表します。 その数字に対応した出力だけが**LOW(選ばれた状態)**になり、他の出力はHIGHのままになります。



˜E0, ˜E1はLOWに、E2はHIGHにすることで、138は動作します。

入力 出力
A B C ˜Y0 ˜Y1 ˜Y2 ˜Y3 ˜Y4 ˜Y5 ˜Y6 ˜Y7
0 0 0 0 1 1 1 1 1 1 1
1 0 0 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
1 1 0 1 1 1 0 1 1 1 1
0 0 1 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
0 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0

74HC138の出力は、対応した数字がLOWになります。上で作成したスイッチマトリックスは入力ラインに HIGHが必要ですので、それぞれの出力をインバーターで反転します。回路図は以下のようになります。 これで、2個の出力ポート、4個の入力ポートの計6個のポートで実現できます。



入力ポートは、複数のスイッチが押されることを考えると2つ以上のポートがHIGHになります。ですのでこれ以上ポート数を減らすことは、 **この方法**ではできません。