kuroの覚え書き

96の個人的覚え書き

ADBキーボードをUSBに変換する(2020年版)

以前一度作成していたADB-USB変換アダプタをまた作ってみた。
以前はCJMCU-beetleというArduino Leonardo互換基板を使って作成したが、無駄に高いので今回はお手頃価格で入手できるArduino Pro MicroというSparkFun(
https://www.sparkfun.com
)というメーカーが出しているATMega 32U4を使ったLeonardo互換基板の中国製コピー商品。


1個あたり安いものだと500円くらいで入手できる。
ただし、製品によって仕様が微妙に違うことがあるらしいので、ここに書く情報はあくまで今回使った製品での記録ということになる。

その他用意したものは
ユニバーサル基板の切れっ端 1枚
どこのご家庭にも2−3個は転がっているADBポート(メス)1個
タクトスイッチ 1個
プルアップ用1kオーム抵抗 1個

機材
Mac mini
ADBケーブル(S端子ケーブル)
ADBキーボード



基本的には
github.com
こちらに書かれている通りでいい。

使用するピンはVCC,GNDそしてD0(data)の3本だけ。ADBキーボードの電源スイッチについては無視した仕様。
で、D0がこの基板でどこに相当するのかというところが唯一の問題となるわけだが、シルク印刷で3と番号が振ってあるところがD0に相当するらしい。
これに関しては
riv-mk.hateblo.jp
こちらの情報を参考にさせていただいた。

さて、基板へのファームウェアの書き込みであるが基本は
https://k-kuro.hatenadiary.jp/entry/20161230/p1
ここでやった時と同じようにすればいい。

ファームウェア
tmk_keyboard/converter/adb_usb/binary/adb_usb_rev1_unimap.hex
を使う。
もしくは設定ファイル群を編集したのち、
tmk_keyboard/converter/adb_usb/
ディレクトリで

make -f Makefile.rev1

とやって出来上がった
.hex
ファイルを書き込む。

なお、Makefile.rev1は

TARGET = adb_usb_rev1
MCU = atmega32u4
include Makefile

となっており、Pro microにあわせてatmege32u4にしてある。
今回チャタリング回避のためにconfig.hに

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 200

のような記述を加えてみた。



まずまっさらのPro MicroをMacに接続し、Arduino.appを立ち上げる。
ツール>ボード
Arduino Leonardoを選択
ツール>シリアルポート
で/dev/cu.usbmodemHIDP1 (Arduino Leonardo)を選択

Arduino>preference
を開き、「より詳細な情報を表示する」の「書き込み」にチェックを入れる。

で、適当なプログラム(たとえばBlinkなど)を書き込んでみる。

例えば

#define TX_LED 30
#define RX_LED 17

void setup() {
  pinMode(TX_LED, OUTPUT);
  pinMode(RX_LED, OUTPUT);
}

void loop() {
  digitalWrite(TX_LED, LOW);  // turn the TX LED on
  delay(1000);
  digitalWrite(TX_LED, HIGH); // turn the TX LED off
  digitalWrite(RX_LED, LOW);  // turn the RX LED on
  delay(1000);
  digitalWrite(RX_LED, HIGH); // turn the RX LED off
}

こうするとシリアル通信のLEDが交互に点滅するようになるのでわかりやすい。

そうするとAvrdudeのプログラムパスがわかるのであとはコマンドで直接書き込むという手順。

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cavr109 -P/dev/cu.usbmodem14641 -b57600 -D -Uflash:w:/var/folders/bh/ggq7fvb9581379cgprt5p9r40000gn/T/arduino_build_887388/sketch_sep26a.ino.hex:i 

/var/folders/bh/ggq7fvb9581379cgprt5p9r40000gn/T/arduino_build_887388/sketch_sep26a.ino.hex
この部分を書き込みたいファームウェアに置き換える。

実際に書き込む際にはリセットをかけてから書き込まなければならないので、基板上のrstというピンを素早く2回gndに落とす。
結構やりにくいので、あらかじめここにタクトスイッチをつけておくといい。
設定を変えて焼き直す時も同様に接続してからリセットボタンをダブルクリックし、書き込みコマンドをすかさず実行、という手順となる。

タイミングが悪いとエラーが出て進まないので、これはタイミングを色々変えてやってみるしかない。
リセットボタンのダブルクリックの後、だいたい3−4秒くらいおいてコマンドをリターンするくらいがいいようだ。

なお、一旦これで書き込んでしまうとArduino.appからシリアルポートが見えなくなるため、もう一度Arduinoとして使いたい場合はリセットボタンをダブルクリックしたら素早くシリアルポートの設定を合わせ直し、プログラムを書き込むという忙しいことをしなければならない。8秒しか猶予がなく、その間にシリアルポートを設定して書き込み開始までする必要があるため、長いプログラムのコンパイルをしていたら間に合わない。まずはBlinkなど短いプログラムでブートローダを回復させてから、落ち着いて長いプログラムに挑戦した方がいい。

なお、ここでもArduino.appを介さずにAvrdudeを直接使ってコマンドラインArduinoのスケッチを書き込んだほうがやりやすそうではある。