Thanks to:
https://qiita.com/nak435/items/d8caed1cd29f5e67dcd7
https://ht-deko.com/arduino/bootloader.html
https://qiita.com/nak435/items/67aca33ca49b6f328faa
はじめに
Digisparkをプラグインして,書き込みプログラムがBootloaderを見つけるまでが微妙すぎるのではないか? おかげで何度かブートローダーを書き込む機会があったので,自分用に手順をまとめておく。
一度記事を投稿したが,自分でもあまりにも読みにくかったので,記述変更しました。
Arduino機を書き込み装置にする
正常に動作するArduio機を準備。ht-dekoさんの記事に詳しく記載があるので便利!
私はPro Micro(互換機),micro:bit および 秋月のATMEGA互換機で経験できた。
以下母機と書く。
- Arduino IDE で,スケッチ例 - ArduinoISP - ArduinoISP を選ぶ。
- 母機により,スケッチに修正が必要なので要注意。ht-dekoさんのページ参照。たとえば micro:bit ならRESETを2ピンに修正する。
- 母機にスケッチArduinoISPを書き込む。設定が混乱するので注意!
「ボード」母機のボードを選ぶ
「プロセッサ」「クロック」母機に合わせる
「シリアルポート」母機に合わせる
「書き込み装置」母機に合わせる。たとえば標準のArduino機なら AVRISP mkII になろう。
Digispark を接続
いったんPCから取り外し,Digisparkと母機を接続する。
// -- DigiSpark --
// PB5 ADC0 RESET <<---- ここ
// PB4 ADC2 PWM4 USB-
// PB3 ADC3 USB+
// PB2 ADC1 SCL PWM2 SCLK <<---- ここ
// PB1 PWM1 MISO <<---- ここ
// PB0 SDA PWM0 MOSI <<---- ここ
// -- DigiSpark --
// 5V <<---- ここ
// GND <<---- ここ
// VIN
合計6か所を接続。ht-dekoさんの記事を参照,ArduinoISP状態の時のピンアサインで接続する。
micro:bit は 3.3V で,Digisparkの5V端子に接続するのは少し気持ちが悪いが,とくに問題なく書き込みできた。
電位差が大きめなレギュレータを持つ基板は要注意だが,私のDigispark(の互換品)は大丈夫だったようだ。
試しのスケッチを書き込み,書き込みコマンドを記録
ATtiny85として,blink的なスケッチを書き込み,そのコマンドを記録。@nak435 さんの投稿参照。大事なので引用させていただきます。
「ツール」→「ボード」→「ATtiny Microcontrollers」→「ATtiny25/45/85」を選択する
「ツール」→「プロセッサ」→「ATtiny85」を選択する
「ツール」→「クロック」→「Internal 1 MHz」を選択する
「ツール」→「シリアルポート」→ 適切なArduinoポートを選択する
「ツール」→「書込装置」→「Arduino as ISP」を選択する (注意「ArduinoISP」ではない)
「シリアルポート」は母機のシリアルポート。
結果,私の環境では以下のコマンドが得られた。(行分割した)
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude \
-C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf \
-v -pattiny85 -cstk500v1 -P/dev/cu.usbmodem14102 -b19200 \
-Uflash:w:/var/folders/r0/8kh304s9751ctrm2x_5wfpl40000gn/T/arduino_build_272089/digispark_blink.ino.hex:i
ヒューズ値の設定とファームの書き込み
@nak435 さんの投稿参照。以下からt85_default.hex
を作業場所にダウンロードする。
私の環境では以下のコマンドで書き込みを行った。
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude \
-C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf \
-v -pattiny85 -cstk500v1 -P/dev/cu.usbmodem14102 -b19200 -Uflash:w:t85_default.hex:i \
-U lfuse:w:0xf1:m -U hfuse:w:0xdf:m -U efuse:w:0xfe:m
無事復活と思ったが...
新ブートローダで書き込めるようになった... と思ったのは,1〜2回であった。どのような環境依存なのかよくわからないが,少なくとも私が持っている2枚のDigiSparkは同じような症状だった。
冒頭でも書いたが...
そもそもプラグインして,書き込みプログラムがBootloaderを見つけるまでが微妙すぎるのではないか。
であれば,回路的にポートを固定して,必ず書き込みモードに入る**「5秒待たないブートローダ」**は有効ではないか?
私の環境ではアタリだったようだ。PB0とGNDをきっちり短絡して,しっかりと書き込めるようになった。それ以降,ブートローダーは壊れていない。Macでも。感謝!
手順は上と同じ,ArduinoISPとなった母機を経由して,直接これを書き込んだ。
Fuse設定について
@nak435 さんの記事と,いわゆる「公式」に書かれているヒューズ設定値と微妙に違う。
違うが,データシートで確認したところ,「まあどちらでもいいだろう」と私は考える。
箇所 | @nak435さん記事 | 公式 | 備考 |
---|---|---|---|
Fuse High Byte | 0xdf BODLEVEL1=1 | 0xdd BODLEVEL1=0 | Brown-out Detector trigger level |
Fuse Low Byte | 0xf1 SUT0=1 | 0xe1 SUT0=0 | Start-up time setting |
ついでにPro Micro(互換品)も修復
書き込めなくなった Pro Micro(互換品)も,同様の手順で修復できた。
さらに,この Pro Micro(互換品)の場合は,もっと楽な手順でも回復できた。概要としては
- Arduino ISPを書き込んだ母機と接続。母機をPCに接続。
- Arduino IDEで,「ブートローダを書き込み」を選ぶ。
これだけ。ただし,
- ボードマネージャーの設定等で Sparkfun Pro Micro を選べるようにする。
- ボード:SparkFun Pro Micro
- プロセッサ:ATmega32U4 (5V, 16MHz)(私の場合)
- シリアルポート:母機のポート
- 書き込み装置:Arduino as ISP
となることに注意。
補足
この場合,ブートローダーそのものが
~/Library/Arduino15/packages/SparkFun/hardware/avr/1.1.13/bootloaders
に保存されていて,今回の場合は caterina/Caterina-promicro16.hex
が書き込まれた。(ログで確認した)
ht-dekoさんの記事にさらりと [ツール | ボード] でボードを "目的の Arduino" に変更します。
と書かれているが,CPU,電源,クロック周波数が同じで,周囲回路に問題がなければそこそこ動くのであろう。実際私は知らずに Arduino Micro のブートローダーを,Digisparkと同様の方法で書き込んだ。
Arduino Micro として Blink 程度のスケッチの書き込み,実行までは確認した。さすがに混乱しそうなので,SparkFunのブートローダーに戻したが。
ほか,DFUブートローダーとかあるようなので,さらに興味を持った方は調べてみると良いだろう。その時は今回の「試しのスケッチを書き込んでみて書き込み方法を確認する」手法が役に立つだろう。
さらに補足
今回の件でたまたま以下の記事を見つけた。
ArduinoISPは手元にある。Arduinoではなくてもっと低レベルでAVRマイコンを使ってみるのも面白そうなネタである。今後時間があるときにでも試してみたい。