今日はキーボードファームウェアをつくろうとしていた。
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); }
参考。
- https://www.microchip.com/wwwproducts/en/ATmega32U4
- http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf
- Complete Datasheet
- 10.2 Ports as General Digital I/O に各ポートの構成について書かれている
- 31 Register Summary にレジスタについて書かれている
- https://store.arduino.cc/usa/arduino-micro
- https://content.arduino.cc/assets/Pinout-Micro_latest.pdf
- pinout diagram を DOCUMENTATION から参照できる
しばらくはどうやって動いているのかを ATmega32u4 のデータシートを読みながら追いかけていくことになると思う。