ぶていのログでぶログ

思い出したが吉日

文鎮化したPro Microを復活させた

早速やらかしました。Pro Microが文鎮化しました! ことの発端は、QMKのMouse Keysページを見ていて、便利そうじゃんっと思っておもむろに有効化したことだった…。 ファームウェアのサイズが大きくなりすぎて、ブートローダ領域をぶっ壊しうんともすんとも言わなくなったのであった。

途方に暮れていたら、以下の記事を見つけた。 幸いHelixは2つのPro Microを使うのと、片側はまだ正常であったために、試してみることにした。

qiita.com

AVR ISPとは

まずなんでこんなことしないといけないかということから調べた。 Helix(QMK)のファームウェアは、直接これがブートされるわけではなくて、Arduinoブートローダが前段にいる。 電源が入るとこのブートローダが呼び出されて、Helix(QMK)のファームウェアが起動される。 リセットを押すと、LEDが点滅してファームウェアが書き込めるようになるのもArduinoブートローダがよしなにやっているからなのであった。 このブートローダは、Helix(QMK)が置いてあるフラッシュメモリ領域に保存されているため、Helix(QMK)のサイズが大きくなるとブートローダ領域に浸食しぶっ壊れるのであった。

で、ブートローダが壊れるとUSBをPCに刺してもうんともすんとも言わなくてなる。。 こうなると、直接AVRマイコンにアクセスしてファームウェアを書き換えるしかにない。 この書き換えには、AVRライターが必要になるのだが、AVRマイコンをライター化するファームウェアがAVR ISP(In-circuit Serial Programmer )である。 Pro MicroをAVR ISP化して、文鎮化したPro Microに直接ファームウェアを書き込もうというのが、先述の記事である。

母艦Pro MicroのAVR ISP

ここからが本題。 作業の前に必要なものは以下の通り

  • 正常なPro Micro(母艦)
  • 文鎮化したPro Micro
  • ブレッドボード
  • ジャンパワイヤ
  • PC
  • Arduino IDE

まず、Arduino IDEをDL。ファームウェアとavrdudeがあれば不要ではあるが、AVR ISPファームウェアがどこにあるか分からなかったので、Arduino IDEを使った。 なお、DLにはかなり時間がかかる。

https://www.arduino.cc/en/main/software

DL後実行したら、まず、母艦Pro MicroをAVR ISP化する。 メニューの[ファイル]->[スケッチ例]->[11.AurduinoISP]->[AruduinoISP]を選択する。すると、新しいウインドウが開いて中にスケッチ(コード)が書かれている。

次にデバイスの設定を行う。 デフォルトではPro Microのボード情報は入っていない?ので追加する必要があると公式ドキュメントに書いてあるのでそれに従う。 メニューから環境設定画面を開き、[追加のボードマネージャのURL]に以下のURLをコピーする。

https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json

入力を完了したら、スケッチ画面に戻りメニューより[ツール]->[ボード]からSpark Fun Pro Microを選択する。 一覧にない場合は同メニューのボードマネージャからPro Microを選択すると、メニューに追加される。 ボードを選択したら、同じく[ツール]メニューの[プロセッサ]からATmega32U4(5V,16MHz)を選択する。

ここまでできたら、母艦Pro MicroをPCにつなげ、一旦リセットを押す。 ファームウェア書き込み用のUSBモデムが見えている間に、メニューの[ツール]->[シリアルポート]から母艦Pro Microのポートを選択する。

選択が出来たらファームウェアを書き込む。 メニューの[スケッチ]->[マイコンボードに書き込む]を選択すると書き込みが開始される。 初回はファームウェアのビルドが走るので少々時間がかかる。 ビルドが終わり、ファームウェアの書き込みが走る直前に、再度母艦Pro Microのリセットを押す。 このタイミングが絶妙すぎるので、いい感じに調整する…。

無事書き込みが出来るとLEDが何度か点滅する。 そして、リセットボタンを押さなくてもUSBモデムが見えている状態なっているはず。

文鎮Pro Microへのブートローダ書き込み

ここまで来たらあとは簡単。 一旦母艦Pro MicroをPCから外し、以下のように配線する。

母艦Pro Micro 文鎮Pro Micro
VCC VCC
GND GND
14 14
15 15
16 16
10 RST

問題がなければ、再度母艦Pro MicroをPCに接続する。 Aruduino IDEに戻り、メニューの[ツール]->[書き込み装置]からAruduino as ISPを選択したら、同メニューよりブートローダを書き込むを選択すると、書き込みが開始される。 問題がなければ正常に文鎮Pro Microにブートローダが書き込まれるはず。

おわりに

文鎮化したPro Microを復活することができてよかった! 組み立てて一週間も経たずに壊すところであったw

とはいえ、どのくらいのサイズまでならOKであるか知りたい…! っと思っていたらavr-sizeというズバリそのものなコマンドがあった。 このコマンドを使うとHexファイルが実際に何byteになるのかわかるのであった。 たとえば、以下はHelixデフォルトのファームウェアで試した例である。

$ avr-size .build/helix_rev2_default.hex
   text    data     bss     dec     hex filename
      0   17540       0   17540    4484 .build/helix_rev2_default.hex

17540byteであることがわかる。 ちなみに、Arduinoブートローダ(Caterina-promicro16.hex)は4090byteである。

$ avr-size Caterina-promicro16.hex
   text    data     bss     dec     hex filename
      0    4090       0    4090     ffa Caterina-promicro16.hex

Helixに使われているPro Microは32KBのフラッシュメモリを積んでいるので、ブートローダ分を除外すると28,678byteつかえることがわかる。 今後はファームウェアアップデート前にavr-sizeを確認して、この数値を超えていないかチェックするようにしようと思ったしだい。

2018/03/06 追記

qmk_firmwareを最新にしたらファームウェアサイズのチェックがされるようになっていた! これで文鎮化する人が減るんやなって・・・

f:id:buty4649:20180306134317p:plain