前回、4x4キーマトリックスの回路を描いて、ユニバーサル基板上に実装してみました。
今回はプログラムを書いてキーマトリックスが動作することを確認していきたいと思います。
…の前に、前回作った回路の導通チェックをしているとおかしいところがあったんで、半田付けを修正しました。修正後が↓になります。 …まぁ、接続が間違ってたんでつなぎ変えたんですけど、Afterの写真だけ見てもわかりませんよね。
Arduinoにつないでみる。
Arduino(ProMicro)に接続したキーマトリックスの回路図はこんなんです。
単純にGPIOポートにキーマトリックスのKEYIN、KEYOUTを接続しただけです。
部品表はこちら。
緒言 | 部品 | 購入先リンク |
---|---|---|
U1 | ProMicro | Amazon |
SW1~16 | 6x6x5mm タクトスイッチ | Amazon |
D1~4 | 1N4148 | 秋月電子 |
R1~4 | 15kohm 1/4W 1% 金属被膜抵抗 | Aliexpress |
- | ユニバーサル基板 | 秋月電子 |
- | ピンヘッダ | 秋月電子 |
コードを書いてみる
KEYOUT1~4を順番にHIGHにしていって、どのタイミングでKEYIN1~4のどれがHGIHになるかを見ればいいわけです。ですので、動作確認用のコードはこんな感じにしました。
const int KEYIN[] = {18,19,20,21}; const int KEYOUT[] = {10,14,15,16}; unsigned long previousMillis = 0; const long interval = 50; int columnNum=0; int sw[4][4]={0}; void setup() { for(int i=0; i<=3; i++){ pinMode(KEYIN[i],INPUT); pinMode(KEYOUT[i],OUTPUT); digitalWrite(KEYOUT[i], LOW); } Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; digitalWrite(KEYOUT[columnNum], HIGH); for(int rowNum=0; rowNum<=3; rowNum++){ sw[columnNum][rowNum]=digitalRead(KEYIN[rowNum]); delay(10); } digitalWrite(KEYOUT[columnNum], LOW); columnNum++; columnNum &=3; } if(columnNum==3){ for(int i=0; i<=3; i++){ for(int j=0; j<=3; j++){ Serial.print(sw[i][j]); } Serial.println(); } Serial.println(); Serial.println(); delay(500); } }
一列ずつ順番にスイッチの状態を見ていって、4x4の配列sw[4][4]にスイッチの状態を書き込んでるって感じですね。で、結果をシリアル出力で見てます。
動かしてみた
回路図に沿ってキーマトリックスとProMicroを接続し、書いたコードをProMicroに書き込みます。
走らせてみると、こんな感じで反応してくれました。
0100 0000 0000 0000 0000 0000 0010 0000 0000 0000 0000 0000 . . .
ちゃんと動いてくれました。よしよし。
おわりに
キーマトリックスは昔からあるものなので、技術情報も多く、あまり苦労せずに回路やコードを書くことができました。ユニバーサル基板のサイズを攻めすぎたせいか、配線が悩ましく、半田付けには少し苦労しました。
キーマトリックスの製作はこれにて一旦完了です。お疲れ様でした。
おしまい。
GEEKY Fab.では思い出のゲームで遊ぼうをテーマにハードウェアを作ってます。
よかったら↓から見ていってください。