2025年12月3日水曜日

FlashArduino

 

ArduinoボードでArduinoを書き込む


1.はじめに

パソコンなし環境で、Arduinoで別のArduinoのスケッチを焼くのってどうすれば良いか実験してみました。Arduinoのブートローダには種類が多数あるので、全部対応するのはとても大変そうですが、手持ちのボードに書き込むぐらいなら難しくなかった、という内容です。

2.準備するもの

焼き込みされるボード、焼き込みするボードそれぞれ一枚。今回はAstar-328PB(3.3V 8MHz)というボードを使ってみました。あとはchatgpt5.1です。
2枚のボードを以下の様に配線しました。左がターゲットで、右が書き込み機です。今回はパソコンから右のボードにFTDI変換をつないでいます。プルアップ抵抗は必須のようです。


3. 変換ソフトウェア

まずは他のプロジェクトのHEXファイルを持ってくる必要があります。

このメニューを使って、該当プロジェクトのhexを準備します。ファイルは該当ディレクトリのbuildの下の方にできます。blink.inoならblink.ino.hexというファイルを探します。
そのhexファイルを今回chatgptに作ってもらったhex2h.pyというソフトで変換します。
今回はサンプルとして、blink 1000mS点滅と500mS点滅のバイナリーを.hに変換したファイルを準備しました。

4. 書き込みソフトウェア

chatgptにarduinoでarduinoを焼き込みたいと聞いて、出てきた結果をarduinoIDEにコピペしました。使ってるボードの名称が分かるとoptibootのbuad-rateが決まるのと、bufferサイズについては試行錯誤が必要でした。プロジェクト名はFlashArduinoとしました。
変換したバイナリはfirmware.hとしてFlashArduinoのプロジェクトに配置します。

5. 使い方

使い方は簡単です。
電源を入れて、D2のボタンを押すと、ライター側の基板上のLEDが点灯し、書き込みが終わると消灯します。
その時にArduino IDEのシリアルモニターをつないでおくと、以下の様なlogが見えます。
==== PROGRAM START ====
Firmware size: 1148
[RST] Resetting target...
[RST] Bootloader wait...
[SYNC] 
[OK] Synced with target
[SIG] 1E 95 16
==== FLASHING ====
[WRITE] Chunk 1/9 (11%)
[WRITE] Chunk 2/9 (22%)
[WRITE] Chunk 3/9 (33%)
[WRITE] Chunk 4/9 (44%)
[WRITE] Chunk 5/9 (55%)
[WRITE] Chunk 6/9 (66%)
[WRITE] Chunk 7/9 (77%)
[WRITE] Chunk 8/9 (88%)
[WRITE] Chunk 9/9 (100%)
==== VERIFY ====
[VERIFY] READ_PAGE not supported by bootloader. Skipping verify.
[WARN] LEAVE_PROG failed (ignored)
==== DONE (WRITE + VERIFY OK) ====
[RESULT] SUCCESS (WRITE+VERIFY)

ここで、ターゲットボードをリセットするとLEDの点滅が始まりました。書き込みを確認するために、500mSと1000mSを交互に書き込んでみるとよく分かります。

6.まとめ

手持ちのArduinoボードを使って、別のArduinoボードをパソコンのない環境で書き込みすることができました。感想ですが、chatgptにエラー内容を見せながら進めると結構簡単に作ることができました。

今回の実験は以上です。

これらのファイルをまとめたものを以下のgithubに置きます。