Mono Netflix専用キーボード を Digistump で作る (その2)
前回の続き。
プログラム
10年以上、ほぼ使っていなかった Digistump
。
今回も、思い知る、その容量の小ささ。
最初はお手軽に、Pimoroni で購入した I2C
で繋げる光るロータリーエンコーダーを利用しようとしたが、Arduino用のseesawライブラリを組み込むと、6Kbytesを越えてしまい、メモリが足りない。
しょうがないので、ロータリーエンコーダーの動作を検知するプログラムを自作する。
GPIO の INPUT_PULLUP
まず、なぜか。いやまあわかるけど、 P1
が INPUT PULLUP として利用できなかった。
本体上のLEDと同期しているので、無理目ではあるけど、 できない
という記述を見つけられないので、正し仕様はわからず。
SWITCH A
と SWITCH B
の INPUT PULLUP には、 PINP0
と P2
を利用する。
ロータリーエンコーダーの回転検出
ロータリーエンコーダーは、2つのスイッチのON/OFFの組み合わせで、回転方向を検出することができる。
実際には、4回の状態変化を検出できる。
時間経過 | SWITCH A | SWITCH B |
---|---|---|
t0 | OFF | OFF |
t1 | ON | OFF |
t2 | ON | ON |
t3 | OFF | ON |
t4 | OFF | OFF |
t0 から t4 までの時間経過は、 カチ
っと1メモリ動かす時間なので、数百msec くらい。
- t1
SWITCH A
が先にON
になり、ちょっと遅れてSWITCH B
もON
- t3
SWITCH A
が先にOFF
になり、ちょっと遅れてSWITCH B
もOFF
逆回転では、SWITCH B
が先に変化する。
最初は、 t0->t1
になるところで回転方向を取得していたがうまくいかない。
DEBUGをいれてみると、 t1
のタイミングがとれてない。
どうやら、 t4
直後に USBのキーボードとしてキー入力を送信するコストで t1
が間に合わず、検出漏れしてる感じ。
ということで、 t3->t4
のタイミングで回転方向を検知するようにした。
プッシュスイッチ
これは簡単、シンプルな、PULLUPスイッチ。
が、モデルによっては、 PIN P5
が使えないこともあるらしい。
自分の使った Digistump 初号機では、 P5
も正しく動作した。
code
3D データ
ケースと合うように、ペットボトルキャップのデータは、数mm くらい低くなるように修正した。