Arduinoのスケッチを買ってきたマイコンに書き込む
Arduinoスケッチをたくさんのチップで動かしたいのですが、ATMEGAのマイコンだけあればよく、シリアル通信もUSB端子もArduinoのIOピンも必要ない場面に遭遇しました。必要数のArduinoを買うと高くつくので、Arduinoのスケッチをマイコンに書き込む方法を取りました。
Arduino IDEからHEXファイルを作り、それをWindows環境でAVR ISP mkIIで書きこむ方法をまとめます。
Arduino IDEからHEXファイルを作る
まずArduino IDEからHEXをファイルを取得します。開発環境は Mac OS X。Arduino 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点のヒューズ設定に注意します。
Arduino でISPするには
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のシグネチャに書き換えればいいのですが、もう面倒なので、やめました。
リンク
- Arduino - ArduinoToBreadboard
- Arduinoの公式解説ページ。
- http://www.geocities.co.jp/arduino_diecimila/use/attiny.html
- http://dev4soft.wordpress.com/2011/05/04/mac%E4%B8%8A%E3%81%AEarduino%E3%81%A7hex%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6mega48%E3%81%ABavrispmk2%E3%81%A7%E6%9B%B8%E3%81%8D%E3%81%93%E3%82%80/
- 168P向けのHEXファイル生成およびavrduidoで直接書きこむ方法。