電子工作で良く使う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このスイッチを検出することができます。

上のマトリックスでは、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になります。ですのでこれ以上ポート数を減らすことは、 **この方法**ではできません。