4x4キーマトリックスを作ってみる

 前回作ったマルチリモコンにボタンをいっぱい追加したいので、キーマトリックスを作ってみようと思います。
 キーマトリックスとはたくさんのボタンのON/OFF判定を少ない入出力ポート数で達成する方法のことです。単純に16個のボタンのON/OFF判定をしようと思ったら、各ボタンを一つずつマイコンのポートにつなげば達成できます。ただそれだと当然マイコンのポートを16ポート使ってしまうことになります。これはさすがにもったいない。そこでキーマトリックスの出番です。キーマトリックスを使用すると8ポートで16個のボタンのON/OFF判定ができるようになります。
 キーマトリックスについては、googleで検索すれば山ほど情報が出てくるので、ここでは回路図ベースでの簡単な説明だけにしておきます。*1

 4x4キーマトリックスの回路図は下図の感じになります。

f:id:moutakusan:20201017181158p:plain
4x4 キーマトリックス回路図
 KEYOUT1~4がマイコン(今回はArduino)のGPIO出力端子、KEYIN1~4がGPIO入力端子につながります。ボタン(SW1~16)の片方のピンがGPIO出力端子につながっていることでHigh/Lowの切り替えができるようになっているところがポイントです。
 もしKEYOUT1~4が、1ポートにつきボタン1個を使う単純な回路のように、5Vで固定されていたらどうなるでしょうか?仮にSW1を押したときはKEYIN1が反応することになります。ではSW5を押したときは?…同じくKEYIN1が反応することになります。つまり、マイコンからはSW1を押したときもSW5を押したときも同じように見えてしまい、実際にはどのボタンが押されているかわかりません。
 キーマトリックスではこの問題を解消するために、KEYOUT1~4を1つずつ順番にHighにしていきます。例えば、初めの10ms間はKYEOUT1だけをHighにし、次の10ms間ではKYEOUT2だけをHighにし…と、順番にHighにしていきます。そして、KEYIN1~4がどのタイミングで反応したかを見ることで、どのボタンが押されているかを判定しています。例えば、KEYOUT2がHighであるタイミングでKEYIN1が反応した場合にはSW5が押されていると判定できます。
 以上がキーマトリックスの説明になります。

 回路図で使われてるスイッチ以外の部品の役割も説明しておきます。D1~4は逆流防止用のダイオードです。例えば、SW1とSW5が同時に押された場合にダイオードがなければKEYOUT1からKEYOUT2に電流が流れてしまい、最悪故障してしまいます。そういうことがないようにするためのダイオードです。
 ちなみに、SWごとにダイオードをつけることでボタンを同時押ししても誤判定されなくなりますが、今回は家用なのでそこまでしてません。
 R1~R4はプルダウン抵抗です。値は適当です。

作ってみた

 キーマトリックスは使う機会が多いと思うので、ユニバーサル基板上に実装してモジュール化してみました。

f:id:moutakusan:20201017163207j:plain
作ったキーマトリックス(表面)
f:id:moutakusan:20201017163250j:plain
作ったキーマトリックス(裏面)
 ギリギリサイズすぎて抵抗が無理のある付け方になってしまいました。
 抵抗が付いている方がKEYIN,ダイオードが付いている方がKEYOUT。抵抗側のピンが5ピンなのは、1ピン(一番手前)がGND接続用だからです。
 使った部品リストは下記です。

緒言 部品 購入先リンク
SW1~16 6x6x5mm タクトスイッチ Amazon
D1~4 1N4148 秋月電子
R1~4 15kohm 1/4W 1% 金属被膜抵抗 Aliexpress
- ユニバーサル基板 秋月電子
- ピンヘッダ 秋月電子


 次回、プログラムを組んで実際に動かしてみたいと思います。




つづく。

*1:例えばしなぷすさんのHPでとてもわかりやすく解説されている。