前回はマルチリモコンを作りました。
geekyfab.com
でも、作ったマルチリモコンにはスイッチは二つだけ…
これでは用途が限られすぎています。
そこで今回はマルチリモコンにスイッチをいっぱい追加したいので、キーマトリックスを作ってみようと思います。
キーマトリックスとは
キーマトリックスとはたくさんのスイッチのON/OFF判定を少ない入出力ポート数で達成する方法の一つです。キー (スイッチ)がマトリックス上に並んでる回路なので、キーマトリックスです。
例えば、16個のスイッチのON/OFF判定をしようと思ったら、単純に各スイッチを一つずつマイコンのポートにつなげばできます。
ただ、それだと当然マイコンのポートを16ポート使ってしまうことになります。
Arduino UNO rev.3だとDigital pinとして使えるポートは全部で22ポートなので、仮に16ポートをボタンだけで埋めると残りはたった6ポートです。
これはさすがにもったいない。
そこでキーマトリックスの出番です。キーマトリックスを使用すると、元の半分の8ポートで16個のスイッチのON/OFF判定ができるようになります。
では、そんな便利なキーマトリックスをどうやって実現するのでしょうか?
次からは、実際に回路を描いて説明してみます。
キーマトリックス回路
4x4キーマトリックスの回路図は下図の感じになります。
KEYOUT1~4がマイコン(今回はArduino)のデジタル出力端子、KEYIN1~4がデジタル入力端子につながります。
各スイッチ(SW1~16)の一方のピンが、電源ではなくデジタル出力端子につながっているところがポイントです。
もしKEYOUT1~4が、1ポートにつきボタン1個を使う単純な回路のように、5V(High)で固定されていたらどうなるでしょうか?
仮にSW1を押したときはKEYIN1が反応することになります。
ではSW5を押したときは?
…同じくKEYIN1が反応することになります。
つまり、マイコンからはSW1を押したときもSW5を押したときも同じように見えてしまい、実際にはどのスイッチが押されているかわかりません。
では、KEYOUT1だけがHigh(5V)でKYEOUT2~4がLow(0V)とした場合、SW1とSW5を押したときの反応はどうなるでしょうか?
SW1を押したときの反応はさっきと同じですね。
KEYIN1が反応します。
SW5を押したときは?
ここがさっきと変わってきますね。
KEYOUT2は0Vなので、SW5は押しても押さなくても0Vのままとなり、KEYIN1は反応しません。
キーマトリックスではこのKEYOUT側を一つだけHighにするってやつを、順番に行い続けます。
例えば、初めの10ms間はKYEOUT1だけをHighにし、次の10ms間ではKYEOUT2だけをHighにし…という具合に。
このように、キーマトリックスでは同時に見るスイッチの数を絞ることで、少ないピン数で多くのスイッチを見ることができてるんですね。
スイッチ以外の部品について
回路図で使われてるスイッチ以外の部品の役割も説明しておきます。D1~4は逆流防止用のダイオードです。
例えば、SW1とSW5が同時に押された場合にダイオードがなければKEYOUT1からKEYOUT2に電流が流れてしまい、最悪故障してしまいます。
こういうことがないようにするためのダイオードです。
ちなみに、SWごとにダイオードをつけることでボタンを同時押ししても誤判定されなくなりますが、今回はそこまでしてません。
R1~R4はプルダウン抵抗です。
これがないとスイッチが押されてないときのKEYIN1~4の状態は不定となります。
値は適当です。
ユニバーサル基板で作ってみた
キーマトリックスは使う機会が多いと思うので、ユニバーサル基板上に実装してモジュール化してみました。
ギリギリサイズすぎて抵抗が無理のある付け方になってしまいました。
抵抗が付いている方がKEYIN,ダイオードが付いている方がKEYOUT。
抵抗側のピンが5ピンなのは、pin1(一番手前)でArduino側のGNDと接続するためです。
使った部品リストは下記です。
緒言 | 部品 | 購入先リンク |
---|---|---|
SW1~16 | 6x6x5mm タクトスイッチ | Amazon |
D1~4 | 1N4148 | 秋月電子 |
R1~4 | 15kohm 1/4W 1% 金属被膜抵抗 | Aliexpress |
- | ユニバーサル基板 | 秋月電子 |
- | ピンヘッダ | 秋月電子 |
タクトスイッチは100個入りで¥615という安さ。
抵抗もAliexpressで買ったので、3120個入の抵抗キットで$15という安さ。
ただし、余りまくり。
次回、Arduinoとつないでプログラムを組んで実際に動かしてみたいと思います。
つづく。