blog.bouzuya.net

2020-03-21 キーボードファームウェアへの下準備

今日はキーボードファームウェアをつくろうとしていた。

Arduino IDE だと Keyboard.h を読み込んで Keyboard.press(c) でキーボードになってしまうのだけど Rust でどうすれば良いのか分からない。

いきなり Keyboard.h 相当に挑戦しても良いのだけどデバッグにも困る。まずは Serial.write() のようなものをつくろうと考えた。

そう。シリアル通信をしたい。ただ何がどう動いているのか分かっていない。

とりあえず Arduino IDE のシリアルモニタから機能を削ったようなものをつくった。 Arduino Micro 側は Arduino IDE で Serial.write() するようにした。 PC 側は serial crate で読み込んだ。 README のものを try! から ? に書き換えて port.write() を削った感じで動いた。

Arduino Micro 側のシリアル通信の仕組みを調べようとして中断した。


脱線して ゆかりメモの オリジナルキーボードを作ってみる まとめ に従ってその 8 まで進めた。言われたとおりに Arduino IDE で書いているだけなので特に問題はない。

  • 1 キーキーボードの作成 (Keyboard.h)
  • キー数を増やす
  • キーマトリックスで必要ピン数を減らす
  • アクティブハイからアクティブローへ変更 (組み込みのプルアップ抵抗の使用)

INPUT_PULLUP をきっかけに crkbd (Corne Keyboard) の PCB を見ながら調べた。

基本的な General Digital I/O の操作とその対応関係のメモ。

Arduino のライブラリにおける Digital I/O の API は↓の 3 つ。

  • digitalRead()
    • 利用イメージ: HIGH or LOW digitalRead(pin);
  • digitalWrite()
    • 利用イメージ: void digitalWrite(pin, HIGH or LOW);
  • pinMode()
    • 利用イメージ: void pinMode(pin, INPUT or INPUT_PULLUP or OUTPUT);

ATmega32u4 での動作。

各ポート (Pxn) の動作は DDxn と PORTxn と PINxn で構成できる。

  • DDxn が 0 かつ PORTxn が 0 ならば Pxn は INPUT 。
  • DDxn が 0 かつ PORTxn が 1 ならば Pxn は INPUT_PULLUP 。
  • DDxn が 1 ならば Pxn は OUTPUT
  • DDxn が 1 かつ PORTxn が 0 ならば Pxn は OUTPUT (LOW) 。
  • DDxn が 1 かつ PORTxn が 1 ならば Pxn は OUTPUT (HIGH) 。

例。

void setup() {
  // Arduino Micro のピン 13 (= D13) は ATmega32u4 の PC7
  // PC7 を OUTPUT にするためには DDC7 を 1 にする。
  // DDC7 は 0x27 の Bit 7 。それを 1 にする。
  pinMode(13, OUTPUT);
}

void loop() {
  // Arduino Micro のピン 13 (= D13) は ATmega32u4 の PC7
  // PC7 を OUTPUT (HIGH) にするためには DDC7 を 1 かつ PORTC7 を 1 にする。
  // (DDC7 は setup で設定済み)
  // PORTC7 は 0x28 の Bit 7 。それを 1 にする。
  digitalWrite(13, HIGH);
}

参考。


しばらくはどうやって動いているのかを ATmega32u4 のデータシートを読みながら追いかけていくことになると思う。