ブートローダーを戻しました

Spread the love

ブートローダーを戻しました。これまで、ArduinoにURbootを書き込んで使用していました。URbootはブートローダで、主にArduinoへのスケッチ書き込みに使用されます。URbootは、GitHubのMiniCoreに含まれています。設定の自由度が高く、サイズが小さいため、気に入って使っていました。しかし、ある問題が起きました。その問題は、再現性がありました。そして、ブートローダーを標準のOptibootに戻したところ、不具合は解消しました。

ブートローダーが消える

Arduinoを電池駆動すると、突然動作しなくなる事象が頻発しました。起動しなくなった後は、スケッチの書き込みも受け付けません。しかし、書き込み機を使用したスケッチの書き込みはできます。スケッチが起動しなくなり、UARTからの書き込みができなくなったわけです。

しかし、書き込み機を使った書き込みはできています。ということは、MCUは壊れていないわけです。これらの事象から、ブートローダーを含めた、フラッシュメモリの内容が壊れたと判断しました。

ブートローダーの動作確認

Arduino標準のOptibootなら、MCUリセット時にLEDが点滅します。例えば、電源接続時やリセットボタン押下時にボード上のLED(L)が2回点滅します。また、Arduinoでは、UARTのDTR信号がリセット端子につながっています。したがって、スケッチ書き込み時にもLEDが点滅します。

つまり、ブートローダーの起動をLEDの点滅で知ることが出来ます。しかし、URbootの場合、起動時のLED点滅がありません。そのため、リセットボタン押下での、ブートローダー起動確認は出来ません。

URbootの利点

Arduino互換機では、シリアルモニター起動状態でのスケッチ書き込みはできません。これは、OptibootがUARTの制御を引き取らないためです。本家Arduinoには二つのMCUが搭載されています。そのため、USBとUARTを司るもう一つのMCUによってUARTの制御移行が行われます。

互換機のブートローダーで注意すべき点:本家Arduinoの回路図(部分)
本家Arduinoの回路図(部分)

しかし、二つ目のMCUが無い互換機では、UARTの制御移行が行われません。つまり、互換機の場合はUARTの制御は、スケッチに渡されたままになります。

これは、MCUを二つ搭載した本家Arduino用に最適化されたブートローダーの盲点です。しかし、URbootはシンプルに、DTR信号だけでUARTの制御移行が行われます。したがって、URbootでは、互換機でもシリアルモニター起動状態での、スケッチ書き込みが可能です。

URbootとOptibootの互換性

URbootとOptibootに互換性があれば、かなり便利なはずです。例えば、ブートローダにURbootを使用したとします。そして、ボードマネージャーにはArduino AVRを使用します。この組み合わせはベストだと思います。しかし、現実にはURbootとOptibootには互換性がありません。

最も顕著なのは、スケッチ書き込みの際に、avrdudeに渡す引数です。Optibootの場合、avrdudeに指定するプログラマタイプは、arduinoです。しかし、URbootの場合、urclockと指定しなければなりません

ブートローダーによってavrdudeの使い方も変わる:avrdudeのV3.0以降はurclockに対応しているようです
URbootの場合、avrdudeのプログラマ指定が異なる

つまり、URbootとMiniCoreは、セットで使用しなければなりません。

ブートローダーを戻した本当の理由

正直なところ、URbootには沢山の利点があると感じています。また、URbootと対となるMiniCoreの自由度の高さにも魅力を感じています。しかし、Optibootに戻した本当の理由は、URbootの危険性です。

しかし、危険性といっても、URbootに欠陥があるということではありません。偏に私の使い方に問題がありました。例えば、URbootでクロック周波数を1MHzに設定すると、Arduinoは二度と起動しません。また、BODを無効、または、1.8Vに設定してURbootを書き込むことも避けるべきです。かなりの確率で、ブートローダーが消えてなくなります。ちなみに、OptiBootではBODは2.7Vに設定されています。

ブートローダー書き換えが原因で壊れたArduino互換機たち
誤った設定を行った結果、起動することが出来なくなったArduino互換機

これらの障害は、標準とは異なる設定をしたために、発生しました。したがって、設定で冒険をしなければ、Arduinoを壊すことはなかったはずです。

つまり、危険な設定が無いOptiBootを採ったというのが本音です。

互換機でよかった

今回は幸いブートローダーを再書き込みして事なきを得ました。しかし、これまでにブートローダーの設定で、冒険をした結果、Auduino互換機を壊してしまいました

URbootのヤバい設定
URbootのヤバい設定

ただし、壊してしまったのは互換機です。しかも、購入したのはアリエクです。購入時の価格は300円程度でした。したがって、精神的ダメージは、幸いにして限定的です。これが、本家Arduinoなら数千円の損失になっていたはずです。

あらためて、本家Arduinoに手を出さなくてよかったと思っています。

コメントを残す

This site uses Akismet to reduce spam. Learn how your comment data is processed.