N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< ArduinoのWireライブラリはI2Cのリピーテッド・スタートが使えます | main | 音声合成LSIで「オリジナルの音声時計」を作ろう!- その1 概要編 >>
簡単!ATmega328Pにブートローダを書きこむ(第2弾)
ブートローダが書き込まれていないATmega328PにArduinoのブートローダを書き込む方法です。
以前に書いたOptifixを使う方法だと、ブートローダのバージョンがかなり古いので、今回は最新の方法を紹介します。

現在のArduinoIDE(Ver.1.6)にはメニューに『ブートローダを書き込む』というのがあります。
今回はこれで、買ったばかりの新品のATmega328p-puにブートローダを書き込んでみましょう。

用意するもの
ハードウェア
  • Arduino Uno(互換ボードも可)
  • ブレッドボード
  • ATmega328P
  • セラロック(8MHz-16MHz適当でよい)またはXtal
ソフトウェア
  • ArduinoIDE

boot_write_brd
(2015/04/27 ピン接続がずれてる間違いを修正)
(セラロックでなくXtalを使う場合は18-22pFのコンデンサx2も必要です)


作業手順
  1. ブレッドボードとArduino Unoを上図のように配線
  2. PCとArduino UnoをUSBケーブルで接続
  3. ファイル>スケッチの例>ArduinoISP
  4. ファイル>マイコンボードに書き込む
  5. ツール>ボード>Arduino Uno  (おそらく選択済み)
  6. ツール>書き込み装置>Arduino as ISP  (ArduinoISPのほうではない!)
  7. ツール>ブートローダを書き込む
  8. ステータス表示が「マイコンボードにブートローダを書き込んでいます」から「ブートローダーの書き込みが完了しました」になれば出来上がり!

注意
すでにブートローダが書かれてるデバイスや、セラロックが正しく接続されていないと以下のエラーが出ます。

avrdude: Yikes!  Invalid device signature.




おまけ 外部オシレータ(セラロックやXtal)無しでブートローダを書き込む

本来、ATmega328Pの工場出荷時は内蔵RSオシレータを使う設定なので、外付けのXtal無しでも動作し、ブートローダだって書き込めるはずです。本家の記述(http://arduino.cc/en/Tutorial/ArduinoISP)でも外部オシレータ無しでできると書いてあるのですが、実際にやってみると、この方法では外部オシレータ無しでブートローダの書き込みはできません。


なぜ、外部オシレータが必要なの?
その原因を調査したところ、ArduinoIDEは、ブートローダの書き込みの際に最初にデバイスにErase処理を行ってから、次に、ブートローダのプログラムを書き込んでいます。そして、この最初のEraseの際にFuseの設定を内蔵オシレータから外部オシレータに変更してしまっているため、ブートローダの書き込みの段階では外部オシレータが必要になるのです。
このとき外部オシレータがついていないと、ArduinoIDEは「avrdude: Yikes!  Invalid device signature.」というエラーを出します。実際のところはデバイスシグネチャーが違っているわけでなく、デバイスシグネチャーが正しく読めていない状態のようです。
 

それなら、外部オシレータを使わないで書き込むには・・・
Eraseの段階ではFuse設定は変更せずに、ブートローダを書き込んだ最後にfuseを設定するようにすればOKです。
実際には、¥arduino¥hardware¥arduino¥avr¥platform.txt の中の2行を次のように編集します。

tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
 ↓
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m

tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m
 ↓
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m -U lock:w:{bootloader.lock_bits}:m


とりあえずこの方法で、Xtalやセラロックなしでも、素のAtmega328P-PUにブートローダを書き込めるようになります。

一度ブートローダを書き込んだものなどFuse設定が外部オシレータになっているものは、外部オシレータをつけて書き込むしかなさそうです。

(本記事執筆時点のArduinoIDEのバージョンは1.6.1)

 
| その他 | 22:37 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
Arduino Uno
Arduino Uno (JUGEMレビュー »)

AquesTalk pico LSIの評価ボードとして最適
RECOMMEND
Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus) (JUGEMレビュー »)

これと AquesTalk pi で簡単にテキスト音声合成!
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND