レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

AVRプログラマにしているLeonardoのブートローダーが壊れた

2020年03月13日 | 電子工作

いつもArduinoやAVRのスケッチ書き込みに、Arduino ISPを書き込んだLeonardo (互換機)を使っています。



USBシリアルで書き込みが出来るSparkFun Pro Micro (互換機)もLeonardoのICSP書き込みを使っていて、 Pro Microのブートローダーはスケッチの上書きで消えてしまっています。

ICSPを使うのは、Arduinoの場合ブートローダー関連トラブルと無縁になり安定して書き込めることやプログラム用メモリが若干増える(4Kくらい?)、AVRはブートローダーを書き換えられる = ヒューズビットが書き換わる(クロック周波数が変更出来る)といったメリットがあるためです。

特にPro Microは、開発環境にしているUbuntuで使う時に認識されるのが遅かったりHIDの複合デバイスに仕立てても認識されなかったりするのですが、ICSPでLeonardoのブートローダーを書き込んでデバイスIDをLeonardoにすると、Ubuntuでも問題なく使用できるようになるといった利点があります。

そんなわけで、先日もLeonardoにみせかけたPro Microのスケッチ書き込みを行っていたのですが、何かの拍子にArduino ISPとなっているLeonardoのスケッチを上書きしてしまいました。たぶん動作確認でPro MicroとLeonardoのUSBを抜き差していて間違えたのでしょう。
初めのうちはそのことに気が付かずLeonardoの不具合かと思い、リセットボタン押してスケッチやらブートローダーの上書きなどゴチャゴチャいじっていたら、ブートローダーが壊れてスケッチが全く書き込めない状態になってしまいました。

しかたがないのでICSPでブートローダーを書き込もうと思った時、事の重大さに気が付きました。手持ちのPro Microは全てブートローダー領域を上書きしてしまっていて、Leonardoに書き込みが出来るArduinoがひとつもなかったのです。

Leonardoが使えなくなることを全く想定してなかったんですね。これには、ホント頭を抱えました。こうなったらもう新しいLeonardoかPro Micro、もしくはUSBaspを購入するしかありません。

なにかいい手がないか色々考えている内に、ふとPICでAVRライターが作れないかと思いつきました。すぐにネットで調べてみると製作事例がありました。少し希望が見えてきたところで、とても重要なことを思い出しました。
たしかMicrochip社のMPLAB XはAVRの開発に対応していたはずです。PICのメーカーであるMicrochip社がAVRのAtmel社を買収していたので開発環境が統合されていたんですね。
ということはPICプログラマとして購入したPICkit4でAVR書き込みが出来るかもしれません。すぐにMPLABを起動して確認すると、確かにAVRに対応していて、ATmega328PやATmega32U4にも書き込みが出来るようです。



さっそくテストしてみました。まず、Arduino IDEの「スケッチ例」でArduino ISPを読み込みます。ボードをLeonardoにして「スケッチ」→「コンパイルしたバイナリを出力」でArduino ISPのHEXファイルを取り出します。
LeonardoとPICkit4をICSP接続して、MPLAB Xと一緒にインストールされるMPLAB IPEというHEXファイル書き込みソフトに作成したHEXファイルを読み込みます。

PICkit4 ISP接続端子(マニュアルではICSPでなくAVR ISPとなっていました)はこうなっています。
2 VTG
3 GND
4 MISO
5 SCK
6 RESET
7 MOSI

PICの時と違いPICkit4から書き込みの電力を与えることが出来ない(たぶん)ようなので、Leonardo側に5V電源をつなげてMPLAB IPEでATmega32U4を選択しプログラム書き込んでみました。しかし、残念ながらLeonardoを認識してくれずエラーになります。設定や配線なども確認しましたが、上手く行きません。

しかたがないので、今度は生のATmega328Pで試してみました。上記の内容をLeonardoからATmega328Pに替えてMPLAB IPEでHEXファイルを書き込んでみると、ありがたいことにちゃんと書き込んでくれました。

今度はこのATmega328Pを使ってLeonardoにブートローダーを書き込んでみます。
ATmega328PとLeonardoの接続は以下のようにします。

ATmega328P  → Leonardo ICSP端子
13 SCK  → SCK
12 MISO → MISO
11 MOSI → MOSI
10 SS   → RESET
   VCC  → VCC
   GND  → GND

ATmega328PとPCの接続ですが、昔作ったRS232Cレベルコンバーターが常にPCのシリアルポート(Ubuntuだと/dev/ttyS0)につながっていますので、ここにATmega328PのTXDとRXDをつなぎました。



Arduino IDEを立ち上げて「ボード」をLeonardoに「シリアルポート」を/dev/ttyS0にしたら、「ブートローダを書き込む」を選択します。すると、普通に書き込んでくれました。
試しにArduino IDEの「スケッチ例」からArduino ISPを読み込んで「書込装置を使って書き込む」で書き込んでみたところ、問題なく書き込めます。これでLeonardoが書込装置に戻りました。一安心です。

テストの為に、このLeonardoを使ってPro MiniにBlinkを書き込んでみると、正常に書き込めました。

ところで書込装置に戻ったLeonardoですが、ブートローダーをスケッチで上書きしているのでUSBからの書き込みは出来ません。もう一度ブートローダーを書き込もうと思いましたが、よくよく考えてみるとこの方が間違えてスケッチを書き込むこともなくなり安全なので、このまま利用することにしました。

これで元通りです。でもPICkit4を買っておいて本当によかった。秋月電子のお楽しみ袋に入っていた古いPICだけのために使うのはもったいないような気がしていたので、今回活用できてとても満足です。しかも最近のAVRで使われているUPDIという書き込み方式にも対応できるようなので、今後も活躍してくれることでしょう。

ちなみに上記でArduino ISPを書き込んだATmega328Pは、今後Leonardoが故障などで使えなくなっても大丈夫なようにAVRライターにしてしまいました。



AVRのICSPのピンは型番によって場所が違うので、配線しやすいようにICSP用ピンソケットを左右につけてみました。
検証も兼ねて、しばらくはこちらを使ってみましょう。



最新の画像もっと見る

コメントを投稿