Arduino IDEはコンパイルが絶望的に遅い。また、基本的な動作がコンパイルして即ターゲット(ボード)に書き込むというスタイルなので、同じものを複数のターゲットに書き込む際に毎回あの遅いコンパイルに付き合わされるのはたまったものじゃない(本当は、開発中もちょっとソースを変更して動作を確認しようと思う度に激遅コンパイルがかかるのが非常にネックなのだけど、とりあえずそれは置いておく)。
しかし、ちゃんと調べるとArduino IDEにはコンパイル結果のバイナリをファイルに書き出す機能があるので、それを使えば出来上がったものを複数のターゲットに書き込める(いちいちコンパイルせずに)。ということで、そのやり方と、一緒にフューズを書き込む方法のメモ。
Arduino IDEでコンパイルしたバイナリを出力する
まずは、ターゲットに合わせてボートやクロックを適切に設定する。

「スケッチ → コンパイルしたバイナリを出力」を選択。

これでコンパイルが行われる。

コンパイル完了。当然だけど、ボードへの書込みは行われない。
バイナリファイルはソースコード(スケッチ)と同じフォルダに生成される。

.hexが生成されたバイナリファイル。スケッチのファイル名にボード名やクロックの値が付いている。「with_bootloader」が付いている方はArduinoのブートローダが含まれたもの(だと思う)。.lstファイルはコンパイルの途中生成ファイル。アセンブラファイルでソースコードが埋め込まれているものみたい。
ターゲットに書き込む
avrdudeの準備
書込みにはavrdudeを使う。avrdudeの公式サイトから持ってきてもいいけど、Arduino IDEにも含まれている(ボードへの書込みにはavrdudeを呼び出している)。そこで、Arduino IDEの中に入っているものを使ってみる。
必要なものは、avrdude.exeとavrdude.conf。在り処は、Arduino IDEがインストールされているフォルダ。下の図を参照。


C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf
ここでは、手っ取り早く使うため、この二つを先程のバイナリファイルのフォルダにコピーする。

ここで、アドレスバーに「cmd」を打ち込んでEnterするとカレントワーキングディレクトリをここにしたコンソール画面が開く。


ターゲットに接続して、とりあえず、フューズを読んでみる。

ここでは、AVRライタとしてUSBaspを使った。「-c usbasp」がその指定。「-p m328p」はターゲットデバイス(ATmega328P)。この辺はシヨするものに合わせる。
上の結果を見ると、問題なく読めているのでターゲットとの通信はOK。
書込み
あとは実際に書き込むだけ。フューズの値と書込みファイルをavrdudeのオプションで指定する。
まず、フューズ。
-U lfuse:w:0xe2:m
「-U」がメモリ操作の指定。「lfude」が下位フューズ、「w」が書込み、「0xe2」が書き込む値、「m」が直前のものが数値であることの指示。要するに、下位フューズの値として0xe2(内部クロック8MHz指定の意味)を書き込め、ということ。
次に、書き込むファイルの指定。
-U flash:w:RMEE01_095.ino_atmega328p_8000000L.hex:i
「-U」は上と同じ。「flash」はフラッシュメモリ、「w」が書込み、「RMEE01_095.ino_atmega328p_8000000L.hex」は書き込むファイル、「i」はファイルの形式を表している(Arduino IDEが吐き出したバイナリなら「i」でOK)。Arduinoのブートローダはいらないので「with_bootloader」がない方のファイルを指定。
この二つを同時に指定してavrdudeを実行する。
avrdude.exe -c usbasp -p m328p -U lfuse:w:0xe2:m -U flash:w:RMEE01_095.ino_atmega328p_8000000L.hex:i
実行結果。

これで完了。必要に応じてバッチファイルにしておけば便利。

以下、参考記事。
- バイナリの吐出し
- フューズの書込み
- 書込み治具
コメント
VAJ さんの記事に触発されて、AVR等のマイコン開発環境を再構築中です。
数年前に廃棄したノートPC には、PIC や AVR 等の環境があったのですが・・
avrdude は、GUI のインターフェースで使っていた記憶があります。
私の記事が少しでも役に立つなら嬉しいです。