Amazon で売ってる Digispark クローンの 5 ピンめを使えるようにしたメモ

タイトルの通り、Amazon で 1 こあたりアホみたいな安値でまとめ売りしてる Digispark(の中華クローン) を買った。

USB Type-A に直挿しできるものもあるが、PC 側にダメージとかあると嫌だし何かに組込むには逆に不便かなって思ったので今回は MicroUSB 版にした。

https://amzn.to/2MzoMFJ

電源まわり以外で 6 ピン(HID デバイスとして利用するときは 4 ピン)ほど使えて、ソフト的には Pro Micro だとか Arduino なんかと同じように気軽に書けて焼けて使えるってんでとっても魅力的だ。なによりアホみたいに安い。しかも prime なので注文翌日には届く。

うんで動作確認がてらこんな感じで各ピンにそれぞれ繋いだ LED を順番に光らせるスケッチを書いて動かそうとしたんだけど、

```c
void setup() {
  pinMode(0, OUTPUT); digitalWrite(0, LOW);
  pinMode(1, OUTPUT); digitalWrite(1, LOW);
  pinMode(2, OUTPUT); digitalWrite(2, LOW);
  pinMode(3, OUTPUT); digitalWrite(3, LOW);
  pinMode(4, OUTPUT); digitalWrite(4, LOW);
  pinMode(5, OUTPUT); digitalWrite(5, LOW);
}

void loop() {
  delay(500); digitalWrite(0, HIGH);
  delay(500); digitalWrite(0, LOW);
  delay(500); digitalWrite(1, HIGH);
  delay(500); digitalWrite(1, LOW);
  delay(500); digitalWrite(2, HIGH);
  delay(500); digitalWrite(2, LOW);
  delay(500); digitalWrite(3, HIGH);
  delay(500); digitalWrite(3, LOW);
  delay(500); digitalWrite(4, HIGH);
  delay(500); digitalWrite(4, LOW);
  delay(500); digitalWrite(5, HIGH);
  delay(500); digitalWrite(5, LOW);
}
```

まずアップロードができない。これは Arduino IDE のプリセットに DigiSpark のボード情報がないからで、

1. Preferences → 追加のボードマネージャの URL に以下を追記
  - http://digistump.com/package_digistump_index.json
1. ツール → ボード → ボードマネージャ を開き、`Digistump AVR Boards by Digistump` をインストール
1. ツール → ボード で `Digispark (Default - 16.5mhz)` を選択
1. ツール → 書き込み装置 で `Micronucleus` を選択
1. ツール → シリアルポート には Digispark が表示されないので、何でもいいので適当に選んどく
1. Digispark から USB ケーブルを抜く
1. 書き込みを開始
1. Digispark に USB ケーブルを差す

で良いらしい。PlatformIO を使うなら `pio init --board digispark-tiny` で OK.

ということで上記スケッチを動かしてみたんだが、

![ezgif.com-video-to-gif(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57111/be1e19e1-91a8-f40b-b693-6cc744a5ec90.gif)

P6 が点かねえ。いやこれうっすら点きっぱなしになってるのか。とにかく意図した通りに動作しない。

これは Digispark のクローン品の独自仕様で、P5 がリセットピンにアサインされてるらしい。いらねえ。
このままだと 2x2 のキーマトリクスすら作れなくて非常に悲しいので、ファームウェアの書き換えをして P5 を本来の ADC0 として使えるようにする。

やりかたは色々あるが、今回はどこのご家庭にでもある Arduino UNO を書き込み装置として使用する方法にした。

1. Arduino IDE を開き、ファイル → スケッチ例 → 11. Arduino ISP → Arduino ISP を開く
1. でてきたスケッチをそのまま UNO に書き込む
    - 上記で変更した書き込み先ボードとかの設定を戻すのを忘れないこと
1. UNO と Digispark を下表のとおりに接続する
    - UNO 側にて、RESET と GND の間に 10μF のコンデンサを挟むべしとの記載があるものもあったが、入れなくても問題なかった。

|UNO側ピン|Digispark側ピン|
|---|---|
|GND|GND|
|5V|5V|
|10|P5|
|11|P0|
|12|P1|
|13|P2|

1. UNO が刺さってるシリアルポートの名前 (`/dev/なんちゃら` みたいな名前) を控える
2. コマンドラインで以下を実行 (`/dev/なんちゃら` 部分は上記で控えた値に差し替え)

```console
$ avrdude -P /dev/なんちゃら -b 19200 -c avrisp -p attiny85 -n

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e930b (probably t85)

avrdude: safemode: Fuses OK (E:FE, H:DD, L:E1)

avrdude done.  Thank you.
```

```console
$ avrdude -P /dev/なんちゃら -b 19200 -p attiny85 -c avrisp  -U hfuse:w:0x5F:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: reading input file "0x5F"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0x5F:
avrdude: load data hfuse data from input file 0x5F:
avrdude: input file 0x5F contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK (E:FE, H:5F, L:E1)

avrdude done.  Thank you.
```

これでファームウェアの書き換えが済み、P5 が使えるようになったはず。

ということで再度 LED つないでスケッチを書き込んで・・・

![ezgif.com-video-to-gif(2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57111/f7f149f4-16f9-eb20-2b03-7fbbb20f7eb2.gif)

イエー! やったぜ!