ちょっと需要が出たので、avrdudeを使用してバイナリデータ(拡張子が.hexのやつ)をAVRに直接書き込む方法をまとめました。
本来、AVRにバイナリデータを書き込むときはAVRライタが必要ですが、今回はAVRライタは使用せずにシリアル変換器(FT232系etc.)を使用します。
要するにこの記事は、シリアル変換器を使ってAVRにArduinoのブートローダとかのバイナリデータを書き込む方法をまとめたものです。

物的環境

今回使用した物的環境は以下の通りです。
  • Arduinoボード(Arduino Uno R2)
  • Macコンピュータ(rMBP13" Early 2015)
別にMacじゃなくてもできます。
ただこの後に書く、今回のメインディッシュのavrdudeのインストールがMacであれば超簡単なので、みんなMacにしy (ry

avrdudeのインストール

・Macの場合
注:ここではHomebrewを使用します、Homebrewを導入していない場合は、ここ(Homebrewのページ)からインストールしてください。
ターミナル.appで、以下のコマンドを実行してください。
$ brew install avrdude --with-usb
あとは放置しておけば、avrdudeがMacにインストールされます。

・Windowsの場合
WinAVRをインストールし、その中にあるavrdudeを使用します。
ここ(しなぷすのハード製作記)が詳しいです。

avrdudeのテスト起動


Macの場合はターミナル.appで、Windowsの場合はコマンドプロンプトで、以下を実行します。
$ avrdude
すると、オプションコマンドの一覧が出るはずです。
29
出たらインストールに成功しています。

いざ書き込み

ではバイナリコードを書き込んでみます。
書き込む前に、バイナリデータのあるディレクトリをカレントディレクトリとします。
ディレクトリの移動にはcdコマンドを使って移動します。
例えば、こんな感じ。
$ cd ~/Desktop
これで、Macでは今ログインしているユーザのデスクトップをカレントディレクトリにすることができます。
そんな感じで、cdの後にバイナリデータのあるディレクトリの絶対パスを入力してエンターを押してください。
自分の場合、デスクトップにテスト用のLED点滅プログラムのバイナリコードを置いてあるので、そこに移動しました。

では、バイナリコードを書き込んでいきます。
ここでは例として、Arduino Unoのボードを使用してATmega328Pに対して、ArduinoのLED点滅サンプルコード「Blink.ino」をバイナリコードにコンパイルしたものを書き込みます。
以下のコマンドを実行します。
$ avrdude -c arduino -P [シリアルポート番号] -b 115200 -p m328p -U flash:w:Blink.ino.standard.hex
[シリアルポート番号]には、ボードに割り当てられているポート番号を入れてください。
Macで言う「/dev/cu.usbmodem○○○○」であるとか、Windowsで言う「COM○」のやつです。(○は数字)
これでエンターを押せば、バイナリコードが書き込まれます。
05
書き込まれたらこんな感じでザーッと出てきます。
「error」とか「mismatch」とか、問題ありそうな単語が出ていない限りうまくいっています。

オプションコマンド解説

今回使用したオプションコマンドのみ解説します。
詳しいことは、ここ(しなぷすのハード製作記)に丁寧に解説されています
・-cオプション
 ライタの選択。今回の場合は「arduino」。
 AVRライタ(AVRISP)を使用する場合は「avrisp」、AVRISP mkIIの場合は「avrisp2」

・-Pオプション
 シリアルポート番号設定。
 注:このオプションは大文字で記述する必要があります。(小文字にすると別の意味になります)

・-bオプション
 シリアル接続ボーレート設定。
 今回はArduino Unoとして書き込んだため、115200と入力。
 AVR ISPの場合は19200、Pro Miniの場合は57600。

・-pオプション
 マイコン選択。
 ATmega328Pの場合はm328p、各AVRマイコンによって決まっています。

・-Uオプション
 読み書き実行。
 後ろに「memtype:op:filename[:format]」の形で読み書きする内容を記述します。
  memtype:操作(読み書き)する対象。今回の場合は「flash」
  op:操作の種類。今回の場合は「w」、指定したファイルを読んでメモリに書く。
  filename:メモリに書き込むデータ。今回の場合は「blink.ino.standard.hex」
 このfilenameで指定するバイナリデータを変えてやれば、別のバイナリコードを書き込むことができます。

[おまけ] Arduinoでバイナリコードを吐き出す方法

Arduino IDEで書いたプログラムを、バイナリコードとして吐き出すことができます。
ライブラリを複数含んでいて配布が面倒だったり、配布したコードがIDEのバージョンの違いのせいでコンパイルできないなんて言うことを防ぐことはできそうですね。
バイナリコードを吐き出すには、Arduino IDEのメニューバーの「スケッチ」内の「コンパイルしたバイナリを出力」をクリックします。
51

すると、スケッチが保存されているディレクトリに、ブートローダ込みのバイナリと無しのバイナリが生成されます。
10