USBaspでArduinoにブートローダーを書き込む

USBaspでArduinoにブートローダーを書き込みます。これまでは、Arduino(互換機)にArduinoISPスケッチを書き込んで書き込み機として使っていました。しかし、USBaspを導入すれば、面倒な結線作業はなくなります。さらに、ArduinoISPスケッチを書き込む作業もなくなります。ISCPコネクタに書き込み機を差し込めば、迅速にブートローダーを書き込めるはずです。
しかし、汎用の書き込み機は結構高価で、なかなか手がでませんでした。しかし、Arduinoに特化したUSBaspが200円台で販売されていました。この程度なら、なんとか工面できそうです。しかし、安いものには裏があるのは必定です。USBaspを動かすのがこんなに大変だとは思いませんでした。使用するための手順を、備忘録として残しておきます。
USBaspは安価なボードマイコンでした
いつものようにアリエクで、AVRプログラマを探していたら、USBaspという激安品を見つけました。

この時は、買ったらすぐに使えて、迅速にブートローダーを書き込めると思い込んでいました。しかし、この期待は、この後打ち砕かれてしまいます。

今回は、ArduinoのISCP端子に接続するためのアダプタが付属するものを購入しました。しかし、アダプタが無くても、ジャンパー線で代用可能です。しかし、迅速にブートローダーを書き込みたかったので、アダプタ付きを選びました。
USBaspにはATmega8AUというMCUが搭載されていました。つまり、書き込み機といっても、Arduinoのようなボードマイコンの親戚です。しかし、ボードマイコンの親戚ということは・・・。ちょっと嫌な予感がしてきました。
USBaspはそのままでは使えなかった
PCのUSBポートに差し込むと、”USBasp”として認識されます。認識されているので、早速Arduino IDEを立ち上げ、ブートローダーの書き込みをしてみたのですが、全くできません。デバイスマネージャーでよく見てみると、USBaspのアイコンに黄色い三角マークが表示されています。つまり、デバイスドライバーが無いということです。
ネット検索を繰り返し、デバイスドライバーを探しました。
PCにデバイスドライバをインストールする
デバイスドライバーは以下のサイトで配布されています。
Zadig – USB driver installation made easy

表示されたWebページの、Downloadのセクションにある、Zadig 2.9をダウンロードします。ダウンロードしたファイルは実行形式です。実行する前に、USBaspをPCのUSBポートに接続しておいてください。
USBaspを接続したら、ダウンロードしたZadigを起動します。

Zadigが起動したら、メニューの「Options」をクリックし、表示されたプルダウンメニューの「List All Devices」にチェックを入れます。
次に、表示されたUSBデバイスの中からUSBaspを選択し、インストールボタンをクリックします。

USBaspのファームウェアをダウンロード
PCにデバイスドライバーを入れれば、迅速にブートローダーを書き込めると思っていました。しかし、そんなに甘くありませんでした。デバイスドライバーを入れて、Arduino IDEからブートローダを書き込んでみました。しかし、残念なことにUSBaspのファームウェアが古い旨のエラーが表示され、書き込みできませんでした。
ファームウェア書き込み方法は、このウェブサイトに詳しく説明されていました。
まずは、書き込むファームウェアを用意します。ファームウェアはこのサイトにありました。

とりあえず、一番新しいファームウエア「usbasp.2011-05-28.tar.gz」をダウンロードしました。
ダウンロードしたファームウェアの展開と配置
ファイルはUNIX系のOSで使用される、tar.gz形式でした。しかし、Windowsのファイルエクスプローラで展開することができました。今回購入したUSBaspに使用されているMCUはATmega8AUでした。ATmega8AUに対応したファイルは、ダウンロードしたファイルの以下のパスに入っていました。
usbasp.2011-05-28.tar\usbasp.2011-05-28\bin\firmware\usbasp.atmega8.2011-05-28.hex
もし、使用されていたMCUがATmega48なら、
usbasp.2011-05-28.tar\usbasp.2011-05-28\bin\firmware\usbasp.atmega48.2011-05-28.hex
ATmega88なら、
usbasp.2011-05-28.tar\usbasp.2011-05-28\bin\firmware\usbasp.atmega88.2011-05-28.hex
となります。
このファイルをavrdude.exeと同じフォルダーにコピーしておくと作業がやりやすくなります。コピー先のフォルダーは、
C:\Users\ユーザー名\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\bin
です。
ファームウェア書き込み装置の準備
書き込み装置を使うのに、書き込み装置が必要になるとは思いませんでした。しかし、ここで用意する書き込み装置はArduino(互換機)です。今回はUNOの互換機を使用しました。
まずは、配線をしなければなりません。配線は以下の6本です。
書き込み側(UNOまたはNANO) | 書き込まれ側(USBasp) |
5V | VCC |
GND | GND |
D10 | RST |
D11 | MOSI |
D12 | MISO |
D13 | SCK |
以上の他に、USBaspのピンヘッダJP1をショートさせておく必要があります。(JP1でRESET信号がMCUに入らないように分断されています。JP1をショートすることで、リセット信号がMCUに送り込まれるようになります。)



ファームウェアの書き込み準備:書き込み機にArduinoISPを入れる
ようやくファームウエアの書き込みにこぎつけました。まず、書き込み機となるUNO(NANOでも互換機でもOK)にArduinoISPスケッチを書き込みます。

avrdudeでファームウェアを書き込む
ArduinoISPを書き込んだら、Windowsのコマンドプロンプトを立ち上げます。コマンドプロンプトで、cdコマンドを使い、以下のフォルダーにカレントを移します。
C:\Users\ユーザー名\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\bin
次にavrdude.exeでファームウェアを書き込みます。コマンドラインは以下の通りです。
avrdude.exe -C ..\etc\avrdude.conf -p m8 -c avrisp -P com4 -b 9600 -U flash:w:usbasp.atmega8.2011-05-28.hex:i
なお、上記コマンドラインは、書き込み機がcom4に接続されている場合です。接続されているポートは、Arduino IDEまたはデバイスマネージャーで調べることができます。

avrdudeを実行すると、ファームウェアの書き込みが実行されます。

書き込みと、ベリファイが行われ、ファームウエア書き込みは完了です。
迅速なブートローダー書き込み
USBaspは安く手に入れることができました。しかし、こんなに苦労するとは思いませんでした。
では、早速ブートローダーを書き込んでみましょう。しかし、これまでの様に、ジャンパー線でちまちま結線する必要はありません。
まずは、UNO(互換機)のブートローダーをMiniCoreプロジェクトのブートローダに書き換えてみます。設定はこんな感じです。

MiniCoreのブートローダーは小さく、380バイトほどしかありません。そのため、ブートローダーの書き込みは一瞬で終わりました。苦労しましたが、迅速なブートローダーの書き込みが可能になりました。