Arduboy に Arduino 経由でブートローダーを書き込む
ふとしです。
最近は Arduboy にプログラムを書き込んで遊んでいますが、勢いあまって大きすぎるプログラムを書き込んでしまい、ブートローダー領域に書き込みが及び、ブートローダーが破損しました。
ブートローダーが破損すると従来の USB 経由の書き込みが、リセットボタンを押したりしても、できなくなってしまいます。つまりなにもできません。
Arduboy は 3 年前に購入したものを発掘して使用していますが、書い直すのは割とお高いのでこれは困りました……。
そこで今回はブートローダーを専用の装置以外で書き込み、復活させました。
ブートローダー再書き込み方法
多くのボードでは ISP (In System Programmer: 基板に実装したままで書き換えが行える装置の総称) を用いた書き込みができます。Arduino 互換機も同様です。
Arduino as ISP
専用の装置もありますが、Arduino には Arduino を ISP として使用する方法が公式に提供されています。さいわい Arduino 互換機の Pro Micro は何枚も家にありますから、今回はこれを使いました。
他の Arduino 互換機でもスケッチ書き込みの際の設定が替わるだけで、手順は同様だと思います。
おおまかな手順
まず Pro Micro に Arduino ISP スケッチを書き込み、Pro Micro as ISP 経由でブートローダーを書き込みます。
┌─────────────┐ ┌───────────┐
│ Arduino IDE │ --------> │ Pro Micro │
└─────────────┘ └───────────┘
Arduino ISP
┌─────────────┐ ┌──────────────────┐ ┌─────────┐
│ Arduino IDE │ -> │ Pro Micro as ISP │ -------> │ Arduboy │
└─────────────┘ └──────────────────┘ └─────────┘
Bootloader
Arduino ISP スケッチの書き込み
これは普通のスケッチの書き込みと同様です。
- File > Examples から Arduino ISP を選択
- Sketch > Upload を実行
Arduboy への配線
現時点では Arduino IDE から Arduboy への配線がありませんから、ISP 化した Pro Micro から Arduboy へ配線を行います。
Arduboy の裏蓋を開ける
Arduboy は生ピンを露出していないので、アクセスのために裏蓋を開ける必要があります。
リチウムポリマー電池を固定しておく
銀色の板はリチウムポリマー電池です。これは上部の接点でしか保持されていないので、おそらく簡単にもげてしまいます。マスキングテープや輪ゴムで動かないようにしておきましょう。
ピン表記
ブートローダー書き込みに必要なのは MISO・MOSI・SCK・RESET・GND・VCC に相当するピンです。
基板の左に MISO・MOSI・CLK (CLK は SCK の誤記らしい)、右側には RESET・GND・VCC のパッドがあるので、ISP 側の対応するピンを配線します。
ISP | Arduboy |
---|---|
14 | MISO |
16 | MOSI |
15 | CLK |
10 | RESET |
GND | GND |
VCC | VCC |
配線
配線ははんだ付けをすると安定しますが後始末が大変です。そこで、パッドのピッチは一般的なピンヘッダと同じなので、ピンヘッダに線を繋ぎある程度固定しておくと、手でも無理なく固定できます。
オプション
さらに、ISP 側の下記のピンに LED をつなげておくと動作中のインジケーターとして働きます。
#define LED_HB 9
#define LED_ERR 8
#define LED_PMODE 7
ブートローダーの書き込み
書き込みの際の給電は ISP から行われるので、Arduboy 側の給電スイッチは切ったままにしておきます。
- ターゲット設定を Arduboy 用に変更します。
- Tools > Board を Arduino Leonardo に
- ブートローダーを書き込むので、それ用の設定をして実行します。
- Tools > Programmer を Arduino as ISP に設定 (Pro Micro だったので ATmega32u4 付きの方)
- Tools > Burn Bootloader を実行
正常に処理が進んでいる場合は LED_HB はゆるやかに明滅したまま RX TX は点灯状態になり、終了すると消灯するはずです。
また、正常に終了すれば Arduino IDE にその旨が表示されます。
エラー
配線が上手くいっていない場合、おそらく ISP 側にブートローダーを書き込もうとしてしまい、以下のようなエラーになります (ブートローダーがすでにある場合のエラーらしい)。
Arduino: 1.8.13 (Linux), Board: "Arduino Leonardo"
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Error while burning bootloader.
確認
Example や手持ちのプログラムが書き込めれば成功です。
おわりに
ISP 化した Pro Micro が単体で動くと思い込んでいたのと、書き込み時に配線を抑える手がプルプルしたのが今回の山場でした。
これで Arduboy 以外の互換機のブートローダーを破損しても大丈夫になったので、より自由奔放に作業がすすめられそうですね。