Digisparkのブートローダーを復活させる（修正・追記あり ついでに Pro Micro も修復）

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」ではない）
```

「シリアルポート」は母機のシリアルポート。

結果，私の環境では以下のコマンドが得られた。（行分割した）

```bash
/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`を作業場所にダウンロードする。

https://github.com/ArminJo/micronucleus-firmware/tree/master/firmware/releases

私の環境では以下のコマンドで書き込みを行った。

```bash
/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秒待たないブートローダ」**は有効ではないか？

https://qiita.com/nak435/items/67aca33ca49b6f328faa

私の環境ではアタリだったようだ。PB0とGNDをきっちり短絡して，しっかりと書き込めるようになった。それ以降，ブートローダーは壊れていない。Macでも。感謝！

手順は上と同じ，ArduinoISPとなった母機を経由して，直接これを書き込んだ。

https://github.com/overfl0/NocInformatykaBoard/blob/master/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex

# 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と同様の方法で書き込んだ。

https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/caterina/Caterina-Micro.hex

**Arduino Micro** として Blink 程度のスケッチの書き込み，実行までは確認した。さすがに混乱しそうなので，SparkFunのブートローダーに戻したが。

ほか，DFUブートローダーとかあるようなので，さらに興味を持った方は調べてみると良いだろう。その時は今回の「試しのスケッチを書き込んでみて書き込み方法を確認する」手法が役に立つだろう。

# さらに補足

今回の件でたまたま以下の記事を見つけた。

https://synapse.kyoto/tips/ArduinoISP_AVRWriter/page001.html

ArduinoISPは手元にある。Arduinoではなくてもっと低レベルでAVRマイコンを使ってみるのも面白そうなネタである。今後時間があるときにでも試してみたい。