UNOを壊した – ブートローダ設定ミス

UNOを壊しました。NANOに引き続き、Arduino UNO互換機を壊しました。しかし、前回と違い、今回は壊れた理由がはっきりしています。壊れた理由、それは不適切にブートローダーを書き換えたためです。
ボードマネージャーとして、MiniCoreを使用しています。このボードマネージャーでは、ブートローダー書き込み時に、クロック周波数を変更できます。しかし、クロック周波数を1MHzに設定してブートローダーを書き込むと、二度と起動しなくなります。つまり、ヒューズ設定が不適切であったため、Arduinoを壊してしまったわけです。
Arduinoは壊れていない
原因は分かりました。しかし、MCUのヒューズピットを正しい値に戻してあげれば、Arduino(互換機)は復活するはずです。調べてみると、ハイボルテージ パラレル プログラミングという手法を使うと、ヒューズビットを強制的に書き換えることが出来るらしいです。
これが上手くいけば、壊れたArduino(互換機)が復活するかも知れません。
壊したUNO – 復活のカギはリセット信号
ハイボルテージ パラレル プログラミングで何とか復活できそうです。しかし、問題点も発覚しました。それはリセット信号線の取り扱いです。


リセット信号は負論理ですので、通常時はプルアップされています。ハイボルテージ パラレル プログラミングでは、リセット信号線を12Vにプルアップします。回路図を見ると、NANOは1kΩの抵抗で、Vccにプルアップされています。UNOについては、プルアップ抵抗と並列に、ダイオードが設置されています。リセット信号がアノードですので、リセットに12Vを加えたら、Vccに12V-Vfがダダ漏れになります。
このままの状態で、リセット端子に12Vの電圧を加えると、マズイことになるはずです。したがって、NANOではプルアップ抵抗の取り外しが必要です。また、UNOに関しては、プルアップ抵抗とダイオードの取り外しが必要となります。
どちらの部品も小さなチップ部品ですので、取り外しには難航しそうです。
壊したUNOを治す為の信号はヘッダーに出ている
ハイボルテージ パラレル プログラミングに使用する回路の図面は、本家Arduino.ccで公開されていました。

この回路図を見る限り、リセット信号線以外は、Arduinoのヘッダーに出ています。したがって、リセット信号線に取り付けてあるプルアップ抵抗とダイオード(UNOの場合)の取り外しが上手くいけば、あとは何とかなりそうです。
見落としがあった
しかし、回路図をよーく見ると、決定的な問題点が見つかりました。それは、クロック信号です。プログラマー側のA2ピンを、ATmega328PのXTAL1に接続しなければなりません。XTAL1信号は、Arduinoのピンヘッダーに出ていません。

試しに、XTAL1端子にファンクションジェネレーターで生成した、16MHzの矩形波を入れてみました。しかし、Arduinoは動作しませんでした。
壊したUNOの復旧断念
ネットを検索してみましたが、QFP(表面実装)パッケージのATmegaを復活させた事例は見つかりませんでした。DIPパッケージなら、なんとかなりそうです。しかし、QFPのATmegaを基板から外して作業するのは困難です。ということで。壊れたArduinoの復旧は断念しました。
壊れたArduinoを活用する道はないか?
今回は、Arduino(互換機)のMCUだけが動作しなくなりました。それ以外の部品は生きています。したがって、USB-シリアルコンバーターとして、使用することを考えてみました。しかし、残念なことに肝心のDTR端子がピンヘッダーに出ていません。DTR信号線無しでは、ブートローダーが起動しませんので、Arduinoの書き込み機としては使えません。(※例外あり。詳しくは後述。)
無理やりチップから信号線を取り出せば何とかなるでしょう。しかし、Pro Miniと一緒に買ったUSB-シリアルコンバーターがあります。便利なものを横において、無理やり壊れたArduinoを使う意味はありません。
Arduino(互換機)を壊さないために
Arduino(互換機)を壊してしまったのは、不適切な設定でブートローダーを書き換えたためです。ブートローダー自体に問題はありません。安物ではありますが、Arduino互換機にも問題はありません。偏にクロック設定を誤ったことが原因です。
教訓として、Arduino(互換機)を壊さない為の注意点を以下にまとめました。
- ブートローダー書き換えで冒険しない
- 内部クロックならクロック周波数8MHz
- 外部クロックならクロック周波数16MHz
以上、三つの注意点を挙げておきます。この三つの注意を守れば、不動Arduino(互換機)を作ることはないでしょう。
優れた機能のOptiboot
後述の理由で、Urbootというブートローダーを使用しています。しかし、Arduinoに標準で書き込まれているブートローダー(Optiboot)は非常によくできています。例えば、スケッチが暴走状態になっても、リセットボタンを素早く二回押せば、ブートローダーに制御が移ります。この時、ArduinoのLED(L)が点滅し、ブートローダーが待ち受け状態になっていることを示してくれます。この状態では、DTR信号なしでスケッチを書き込めます。
互換機でのOptiboot使用には注意が必要
しかし、「互換機では」注意すべきことがあります。Optiboot+互換機では、ArduinoIDEのシリアルモニター起動状態でのスケッチの書き込みに失敗します。これは、Optibootでは、DTR信号による、ブートローダへの制御移行が上手く行われないためです。慌てずに、シリアルモニターを終了させれば、スケッチを書き込めます。しかし、この仕組みを理解するまでは、けっこう慌てました。
その一方、Urbootは、DTR信号で起動されます。そのため、「互換機であっても」シリアルモニター起動状態でのスケッチの書き込みができます。もちろん、スケッチの書き込みが終われば、「互換機でも」勝手にシリアルモニターに制御が戻ります。しかし、DTR信号なしでは、スケッチの書き込みができないという弱点もあります。
これらの事象は、「互換機」でのみ発生します。そのため、Arduinoの互換機では、OptibootよりもUrbootの方が使いやすいと思っています。
※この記事でいう互換機は、USB-シリアルコンバーターに、FT232やCH340を使用したものです。例外として、Arduino DiecimilaにはFT232が搭載されていました。そのため、Arduino DuemilanoveとArduino Diecimilaは、他とは異なるブートローダーを使用していました。