bouzuya.hatenablog.com

ぼうずやのにっき

キーボードファームウェアへの下準備

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

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

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

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

とりあえず Arduino IDE のシリアルモニタから機能を削ったようなものをつくった。 Arduino Micro 側は Arduino IDESerial.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 のデータシートを読みながら追いかけていくことになると思う。