Arduinoとキーマトリクスで遊んでみる
ゆかりさん (https://twitter.com/eucalyn_)の「ねこでも作れる! オリジナルキーボード」をもとに、universal16のキーマトリクスからpress/releaseを捕まえるコードを書いて実験してみました。
Pro Microの4,5,7,8ピンをそれぞれRow 0-3に、10,15,14,16ピンをそれぞれCol 0-3に配線します。
キーマトリクスが使えそうなところまでの配線が終わったので今日はここまで♨️ #universal16 pic.twitter.com/e5TIQ5ZLbc
— せがた ひろみ (@keyaki_namiki) 2018年10月16日
const int Rowpin[] = {4,5,7,8}; const int Colpin[] = {10,15,14,16}; const int Cols = (sizeof(Rowpin)/sizeof(Rowpin[0])); const int Rows = (sizeof(Colpin)/sizeof(Colpin[0])); bool beforeState[Rows][Cols]; bool currentState[Rows][Cols]; void setup(){ Serial.begin(9600); while(!Serial); Serial.println("Started."); for(int i=0;i<Cols;i++){ pinMode(Rowpin[i],OUTPUT); } Serial.print("num of Rowpin: "); Serial.println(Rows); Serial.println("Rowpin initialized."); for(int i=0;i<Rows;i++){ pinMode(Colpin[i],INPUT_PULLUP); } Serial.print("num of Colpin: "); Serial.println(Cols); Serial.println("Colpin initialized."); for(int i=0;i<Rows;i++){ for(int j=0;j<Cols;j++){ currentState[i][j] = HIGH; beforeState[i][j] = HIGH; } } Serial.println("initialize finished"); } void loop(){ for(int i=0;i<Rows;i++){ digitalWrite(Rowpin[i],LOW); for(int j=0;j<Cols;j++){ currentState[i][j] = digitalRead(Colpin[j]); if (currentState[i][j] != beforeState[i][j]){ if(currentState[i][j] == LOW){ Serial.print("key "); Serial.print(i); Serial.print(","); Serial.print(j); Serial.println(" pressed!"); } else { Serial.print("key "); Serial.print(i); Serial.print(","); Serial.print(j); Serial.println(" released!"); } beforeState[i][j] = currentState[i][j]; } } digitalWrite(Rowpin[i],HIGH); } }
うごいている様子
#universal16 マトリクスでキーpress/release検出できた! pic.twitter.com/YkT7MtGp2S
— せがた ひろみ (@keyaki_namiki) 2018年10月19日
左右間の通信などほかの処理を一切含まないため、チャタリングをよく捕まえてしまうのでdelay(1)
などを挟んでみてもいいかもしれません。
次回は、universal16のLEDマトリクスについて更新の予定です♨
#universal16 Stem
キーマトリクスといくつかの実験要素を実現した基板、universal16を少し手直ししてみました。
変更点は以下のとおりです。
- プレートマウント用の穴を比較的わかりやすい位置に用意
- キーマトリクス等の配線をパッドに引き出し、シルク印刷でわかりやすく案内
- kailh Low Profile スイッチが使えるスルーホールを用意
- 右側でのみ扱うことができたユニバーサル基板部分を左側でも使えるように、左右対称のキースイッチフットプリントを使用
- ユニバーサル部-コントローラ間の手配線がしやすいように中継用パッドを数か所用意
前回の基板と違って引き出したすべての配線をパッドとして用意しているため、「ピンフレームを実装してブレッドボードで実験」というところまでに少しだけはんだ付けの技術を要するようになってしまいましたが、ユニバーサル基板部分がいわゆる完全なユニバーサル基板になったため、より自由度が高まったかと思います。
ボトムプレートとして更にユニバーサル基板を採用することで、もっと大掛かりな電子工作(小さなコンピュータやシンセサイザとか...?)もできるかな...などと考えていますが、いかがでしょうか。
#universal16 基板の到着
中国の国慶節を挟んだため発注から若干時間がかかりましたが、無事、手元に基板が届きました。
画面の中で線を引いたものが実物となって届くというのは、初めてということもあり、なかなかに不思議な体験でした。
フットプリントの大きなミスもなく、各部品が期待通りに実装できます。
Pro Micro実装のシルク印刷がなされていますが、前述の通り配線はされていないので、teensyシリーズやBluetoothモジュールを搭載したMbedなどでの実験ができます。
実際に届いてみて、いくつか改善できそうな点/問題点が見つかりました。
- 裏面のシルク印刷が無いためどの穴がどの配線に繋がっているかがわからない
- GNDとVCCが他の配線と同じ幅になっている
- sk6812miniの配線がただ線を引いただけになっている(デジタル信号等に関しての考慮が一切ない)
- 申し訳程度に開けたM2の穴位置が非常にわかりづらいため、プレートマウント用のsomethingを設計しづらい
- PCBマウントでないキースイッチを実装する際、プレートの用意がないので位置合わせが難しい
この基板はポリウレタン銅線などの使用を前提としているので、スルーホールではなくパッド/テストポイントとして配線を引き出すことで使用するはんだ量を抑えられるかな、など、そういった点にも手を加えていけたらなと思います。
#universal16
キーマトリクスのみを実現した基板というのが私には見つけられなかったので作ってみました。 ほしかった要件は、
- キーマトリクスのみを簡単に実現できる
- ユニバーサル基板のような使い方ができる
- キーボードを自作するにあたっての機能をあらかた実験できる
です。
ちょうどfusionPCBというところが100mm x 100mm 以内の基板3枚を$1で作ってくれるという企画を行っていたので、その大きさに収まるように大きさを調整しました。
上部と右側にユニバーサル基板のような部分を配置したことで、気になった部品を比較的手軽に試すことができます。
(フットプリントに部品の3D情報が含まれたり含まれなかったりしています)
キーマトリクスからコントローラーまでの最後数cmはポリウレタン銅線などで手配線する必要がありますが、そこがこの基板のポイントで、キーボードを自作する際によく用いられるPro Microのみに限らず、横幅600milに収まるコントローラーならおよそ何でも使うことができます。
コントローラーではなくピンフレームを実装することで、キーマトリクスをブレッドボードで扱いやすくすることもできるでしょう。
また、per key RGBとしてよく用いられるsk6812miniやLEDテープなどを実装できるため、どのようにコントロールしているかを学習することができます。
発注した基板は先日手元に届きましたが、そちらはまた別でまとめることとします。