プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Arduinoでキーボードを作る

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


タクトスイッチでキー入力

キー入力マクロ

こちらのサンプルコードでは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の自動入力とかも出来そうです。
組み立てたらまた報告します。