Aruduino pro microを触ってみる
こういったマクロキーボードがあるのですが、割といい値段がします。また、カスタマイズ性ももう一歩かな?と思いながら見ていたのですが、せっかくなのでArduinoで作ってみようと思いました。
一般に自作キーボードに使われるのがPro microというタイプのもののようですが、USB micro なのです。
今時Type Cでなきゃ、と探してみると以下のもの(互換品)を見つけました。
ちなみに、以下のようなものもキーボードとして使えるようです。
こちらを参考にArduino(互換品)にキーボードとしてのプログラミングをします。
okiraku-camera.tokyo
キーボードのハードウェアはまだ手元にないので、タクトスイッチで動かしてみます。
SparkFunのPro microをボードマネージャーから追加し、上記の参考ページのサンプルコードを書き込みます。
環境設定の追加のボードマネージャのURLに追加 https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
タクトスイッチでキー入力
Arduinoをキーボードにする pic.twitter.com/VM7llJRLlV
— とりてん (@s51517765) 2023年11月25日
キー入力マクロ
Arduinoでキーボードマクロ。 pic.twitter.com/p43GgYX9wN
— とりてん (@s51517765) 2023年11月25日
こちらのサンプルコードでは7ピンの入出力を使って12のキーを受け付けるようになっています。
これは一般的なキーボードの入力方法らしいですし、またリモコンのキー入力なども同様の方法が使われています。
どのような仕組みでピン数より多いキーの入力を受け取れるのかコードを見てみます。
その仕組みに相当するのが以下のコードです。
// 全キースキャンして、押下されているキーのビットを1にしたビットマップを返す。 int key_scan() { int key_pressed = 0; for(int col = 0; col < sizeof(scan_port); col++) { digitalWrite(scan_port[col], LOW); int row_data = 0; for(int row = 0; row < sizeof(data_port); row++) row_data |= (digitalRead(data_port[row]) ? 0 : 8 >> row); key_pressed |= (row_data << (sizeof(data_port) * col)); digitalWrite(scan_port[col], HIGH); } return key_pressed; }
これを2 x 2として模式的に表すと以下のようになります。
通常は入力側はPULLUPされているのでどちらのINPUTもHIGHとなっています。
スイッチが押されると、OUTPUTがLOWになったタイミングでINPUTがLOWになります。
上図の●位置のスイッチが押されたら、OUTPUT2がLOWのタイミングでINPUT1がLOWになり、INPUT2は常にHIGHのままです。
これによってこの位置のスイッチが押されたことが分かります。
また、キー入力に抵抗が不要なのはPULLUPになっているからです。
これで基本的な機能は作れそうな気がします。
思っていた以上に簡単です。
まとめ
自作キーボードを作ってみようと思い立ちました。
キーボードの基板とスイッチ、キーキャップも発注中です。
3 x 4の基板ですが、シフトキーのような機能を付ければこれを3 x 4 x 2の機能を持たせることも可能だと思います(そんなもの必要かどうかはわかりませんが)。
またWindowsのLogin passwordの自動入力とかも出来そうです。
組み立てたらまた報告します。