Arduinoのスケッチを買ってきたマイコンに書き込む

Arduinoスケッチをたくさんのチップで動かしたいのですが、ATMEGAのマイコンだけあればよく、シリアル通信もUSB端子もArduinoのIOピンも必要ない場面に遭遇しました。必要数のArduinoを買うと高くつくので、Arduinoのスケッチをマイコンに書き込む方法を取りました。
Arduino IDEからHEXファイルを作り、それをWindows環境でAVR ISP mkIIで書きこむ方法をまとめます。

Arduino IDEからHEXファイルを作る

まずArduino IDEからHEXをファイルを取得します。開発環境は Mac OS XArduino IDE 022です。HEXをファイルを書き込むターゲットはATMEGA168P、クロックは内部発振回路の8MHzを使うとします。
まずコンパイルの過程を見てみます。IDEのVerify/Compileボタンを、SHIFTキーを押しながらクリックすると、Arduino IDEが呼び出しているGCCの詳細ログが表示されます。このログを見れば、テンポラリパスにHEXをファイルを作っているのがわかると思います。このテンポラリフォルダにアクセスするのは面倒なので、この作業領域を自分のローカルな領域に設定します。
Arduino IDE 22の設定ファイルは、 ~/Library/Arduino/preference.txt にあります。このファイルに次の2行を追記します:

preproc.save_build_files = true
build.path = /tmp/

preference.txtの編集は、Arduino IDEを終了させてから、行います。Arduino IDEは終了時にこのファイルを上書きしますから、もしもArduino IDE を立ち上げたまま編集作業をすると編集内容が失われます。
設定の、build.pathは、先頭のスラッシュがなければ/Applications からの相対パスとして扱われます。ここでは絶対パス"/tmp/" に出力します。

次にコンパイルのターゲットボードの設定を追加します。
~/Documents/Arduino/hardware/breadboard/boards.txt という空のテキストファイルを作り、以下の内容を書きます:

##############################################################
atmega168pbb.name=ATmega168P on a breadboard (8 MHz internal clock)

atmega168pbb.upload.protocol=stk500
atmega168pbb.upload.maximum_size=14336
atmega168pbb.upload.speed=19200

atmega168pbb.bootloader.low_fuses=0xE2
atmega168pbb.bootloader.high_fuses=0xD9
atmega168pbb.bootloader.extended_fuses=0x07
atmega168pbb.bootloader.path=arduino:atmega
atmega168pbb.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex
atmega168pbb.bootloader.unlock_bits=0x3F
atmega168pbb.bootloader.lock_bits=0x0F

atmega168pbb.build.mcu=atmega168
atmega168pbb.build.f_cpu=8000000L
atmega168pbb.build.core=arduino:arduino

今回はHEXをISP mkIIで直接ターゲットに書き込むので、上記のヒューズやブートローダ等の設定は意味はありません。意味があるのはmcuの種類とその動作クロックf_cpuの設定だけです。Arduino IDE 22は起動時にこのファイルを読み込みます。このファイルを編集してからArduino IDEを再起動すれば、ターゲットのボードにnameで指定したボード名が表示されるはずです。
最後にターゲットのボードを選択して、コンパイルしてHEXファイルを作ります。あとは"/tmp"のHEXをファイルを、ISP mkIIで書きこむだけです。クロックのDIV8のチェックを外すこと、クロックに内部発振回路を使うこと、の2点のヒューズ設定に注意します。

ArduinoISPするには

Arduino 自体がISPになるので、やりかけたのですがavrdudeの設定が面倒だったので、WinのISP mkIIを使いました。途中経過メモを置いておきます。
まずHEXファイルを作るところまでは同じ手順です。ただしHEXファイルを取り出す必要はないのでpreference.txtを設定する必要はありません。
ISPライター側はArduino UNO。ターゲットのチップはATMEGA168P。Arduino IDE のExampleのISPをUNOに書きこむと、avrdudeが初期化エラーを出しました。http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1286589145 にある ISPスケッチの修正パッチを使うと、これが直ります。
次に168Pのチップシグネチャが認識でないとavrdudeがエラーを出します。168のチップシグネチャはあるのですが168Pのがないためにエラーになるようです。 Arduino ISPを使ってATmega8/168Pにbootloaderを書き込む - DiaryException
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf の168の設定項目をコピーして、168Pのシグネチャに書き換えればいいのですが、もう面倒なので、やめました。

リンク