今回は、Arduino IDE 1.6.10でブートローダを書き込もうとした場合に生じるエラーと、その対処法について書きます。
エラーの詳細
Arduino Uno用ブートローダライタシールドキットのユーザーからのメールで気が付いたのですが、Arduino IDE 1.6.10でツール→ブートローダを書き込むメニューでブートローダを書き込もうとした時に、
Arduino:1.6.10 (Windows 10), ボード:"Arduino/Genuino Uno" ***failed; avrdude: verification error, first mismatch at byte 0x0000 0xfd != 0x05 avrdude: verification error; content mismatch ブートローダの書き込み中にエラーが発生しました。
というエラーが出る事があるようです。
これは、Arduino IDE 1.6.10をインストールした時に、同時にインストールされるArduino AVR Boardsの1.6.12が原因で引き起こされるバグの様です。
エラーの解決法
この問題を回避するには、次のいずれかの方法を取ってください。
- 方法1:Arduino IDEを最新版にアップデートする(推奨)
- 方法2:Arduino IDE 1.6.10のままArduino AVRBoardsのアップデートをする
もし方法2を取る場合は、次の方法に従って下さい。
まず、ツール→ボード→ボードマネージャ…メニューを選択します。
そうすると、ボードマネージャのウィンドウが開きますので、Arduino AVR Boardsを選択し、更新ボタンをクリックします。そうすれば、Arduino AVR Boardsが最新版に更新され、問題が解決します。
なお、この解決方法を取った後でも、次の様な警告がブートローダ書き込み時に表示されますが、これは無視してかまいません。(この警告の内容は、次の章で簡単に説明します)
***failed; avrduide: WARNING: invalid value for unused bits in fuse "efuse", should be set to 1 according to datasheet This behavior is deprecated and will result in an error in future version You probably want to use 0xfd instead of 0x05 (double check with your datasheet first).
エラーが発生する原因
この様なエラーが発生する原因ですが、ひとつの理由はArduino IDE 1.6.10でavrdudeのバージョンを6.3に引き上げた事にあります。
avrdudeというのは、8ビットのArduinoをはじめとする、AVRマイコンのフラッシュメモリにプログラムを書き込むためのオープンソースソフトウェアで、Arduino IDEの中にも含まれているソフトウェアです。
AVRマイコンにはヒューズバイトというマイコンの動作モードを決定するための情報を記憶しておくための不揮発性メモリがあります。ATmega328Pのヒューズバイトは、上位ヒューズバイト・下位ヒューズバイト・拡張ヒューズバイトの3種類からなりますが(ArduinoISPを汎用AVRライタとして使う(2)を参照)、その内、拡張ヒューズバイトは、8ビットの内、下位3ビットしか使っていません。未使用の5ビットについては、1を書き込むのが本来のやり方なのですが、Arduino IDEのボード定義では、未使用ビットに0を書き込んでいます。
未使用ビットについては、未使用なのですから、1を書き込もうと0を書き込もうと動作には影響しないはずですが、おそらく将来のAVRマイコンで未使用ビットを使用する様になる場合に備えて、1を書き込む事が推奨されているのだと思います。
avrdudeの古いバージョンでは、拡張ヒューズバイトの未使用ビットのチェックをしていなかったのですが、Arduino 1.6.10で導入された avrdude 6.3では、厳格にチェックする様になった模様です。このため、エラーが発生する様になりました。
Arduino IDE 1.6.11では、avrdudeのバージョンを一旦6.0.1に戻して問題を表面化しないようにしたようです。
さらにArduino IDE 1.6.12では、avrdudeのバージョンを再び6.3にしたものの、拡張ヒューズバイトの未使用ビットのチェックをしないようにパッチを当てたようです。
パッチを当てて、未使用ビットが0になっていてもエラーは出なくなりましたが、先ほどの
***failed; avrduide: WARNING: invalid value for unused bits in fuse "efuse", should be set to 1 according to datasheet This behavior is deprecated and will result in an error in future version You probably want to use 0xfd instead of 0x05 (double check with your datasheet first).
という警告は出てしまう様です。この警告は、Arduino IDE 1.6.12以降の新しいバージョン(例えばArduino IDE 1.8.0)でも発生します。
この警告は、「拡張フューズバイトの未使用ビットを0に指定しているようだが、1にするべきだ。そうしないと、将来のavrdudeのバージョンではエラーになる可能性がある。おそらく0x05の代わりに0xfdを指定すべきだ」という様な意味です。(0x05の内、未使用ビットの上位5ビットを1にすると、0xfdになる) 実害がない警告だとはいえ、意味が分からない人には、気持ち悪いものです。
この警告を出なくするには、boards.txtの拡張フューズビットの設定を、実際に0x05から0xfdに書き換えればいいです。
boards.txtの中に
uno.bootloader.extended_fuses=0x05
という行があるはずですが、これを
uno.bootloader.extended_fuses=0xfd
に書き換えれば警告は出なくなります。
ただ、手動でboards.txtを書き換える方法は初心者には敷居が高く、失敗するとArduino IDEの環境を壊してしまうので、Arduino IDEの将来のバージョン(正確にはArduino AVR boardsの将来のバージョン)で、boards.txtが書き換えられる事を願います。
はじめまして、古い記事にコメント付けてすみません。ラジオペンチと申します。
実は最近全く同じ症状に遭遇したので、対策について記事を書いたところですが、
http://radiopench.blog96.fc2.com/blog-entry-907.html
こちらに詳しい記事が書かれていたので、私の上記記事に追記してリンクを貼らせていただきました。
わざわざリンクのご連絡ありがとうございました。