ちっこいArduino互換 Digisparkのクローンを作った

# Digispark?
ふた昔前くらいに流行った親指サイズのArduinoのクローン
基板の上に見える部品はレギュレータとマイコン本体のみ
マイコンの書き込みに一般的に必要とされるシリアル変換チップを載せていない
代わりにソフト(ブートローダ micronucleus)でUSBの機能を実装している

本家はもうすでに販売しておらず現在出回っているのは主にクローンらしい
ATTinyさえあれば作れそう

# Micronucleus?
USB接続の部分を実装するブートローダ
V-USBというプロジェクトをベースに開発されているらしい
これが電源投入時(設定で変えられる)に走る
専用ic無しでのUSB接続を可能にする
メリット: 部品点数の削減やそれに用小型化
デメリット: 書き込み時に都度さしなおす必要が生じる

# 作る
大まかな流れは
- 組み立て
- ブートローダ書き込み
- 完成
## 部品
### Arduino UNO x1
出落ちで申し訳ない
これは部品というより道具として必要
ISP書き込み機の代わりにArduino UNOが使える
UNOを名指しした理由については後述
### ATTiny85 x1
ATTinyであれば大体OKっぽい
メモリとサイズと値段と実績の関係で85を選んだ
### 47Ω x2
USBのデータ線に挟む抵抗
最初は電流制限だと思っていた
ダンピング抵抗というものらしくて波形のオーバーシュートを抑制するもの
ネットを漁った限り68Ω周辺が多かった
あまり重要ではなさそうだった(中途半端な値を新規で買いたくなかった)ので47Ωにした
### 1.5kΩ x1
USBのD-をプルアップする抵抗
ネットを漁った限りどれも1.5kΩで全くブレがなかったので怖くなって買ってきた
### 小信号用ダイオード
目的は整流ではなく電圧降下を使った降圧
V-USBのホームページに載っていた
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">えぇ… <a href="https://t.co/cij5Ente7u">pic.twitter.com/cij5Ente7u</a></p>&mdash; エリンギ/tokotokonatu (@McbeEringi) <a href="https://twitter.com/McbeEringi/status/1565175447393951744?ref_src=twsrc%5Etfw">September 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

あまりの荒業で驚いた
1N4148を2本使った
順電圧が1Vなので大体3.6Vくらいで落ち着くかなという思考
### 4.7uF x1
電源の平滑化とノイズの吸収?
本家基盤には並列に0.1uFもついていたがV-USBの回路図には4.7uFだけだったので信用した
コンデンサはチップだと安い(1/7くらい!)のでお勧め
### 基板とかUSBとかソケットとか
プリント基板は敬遠している
プリント基板にUSBごとプリントしたかった気持ちはある
ESP32用シリアル変換の時と同じ基板取り付けのUSBオスとFサイズ基盤(8x6穴)を買ってきた
マイコン部分は外せるようにソケットにした
### 縦型タクトスイッチ
やはりスイッチがあると便利なのでつけた
スペースの制約で縦型にした
押す力は後ろのソケットに受け止めてもらう
### 通電確認のLEDとビルトインLEDとそれらの電流制限抵抗
気分でつけた
赤と緑のチップLEDと10kΩの抵抗を使った

## 回路図
頑張って組み上げる
薄線はUEWで緑色部分はチップ部品
<blockquote class="twitter-tweet" data-conversation="none"><p lang="zxx" dir="ltr"><a href="https://t.co/YKFim0IpMD">pic.twitter.com/YKFim0IpMD</a></p>&mdash; エリンギ/tokotokonatu (@McbeEringi) <a href="https://twitter.com/McbeEringi/status/1578761947725504517?ref_src=twsrc%5Etfw">October 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

完成したのがこれ
実は3機目である
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">できた<br>スイッチとLEDが増えた<br>緑が想像以上に暗かった <a href="https://t.co/sL57OIenkm">pic.twitter.com/sL57OIenkm</a></p>&mdash; エリンギ/tokotokonatu (@McbeEringi) <a href="https://twitter.com/McbeEringi/status/1572900274423078912?ref_src=twsrc%5Etfw">September 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## ブートローダ―書き込み
https://qiita.com/nak435/items/d8caed1cd29f5e67dcd7

の記事を参考に進めさせていただいた
必要な箇所のみ以下に並べる
### Arduino UNOのISP化
ATTinyにブートローダを書き込むには専用の装置が必要
Arduino UNOを持っていれば代用可
手持ちのArduino Nano everyやESP32でも試したが上手くいかなかった
おとなしくArduino UNOを使うべし

Arduino IDEを開いて
ファイル>スケッチ例>ArduinoISP>ArduinoISP
を選択してそのままUNOに書き込む

### 配線
下表の通り繋ぐ
| UNO | ATTiny85 |
|:-:|:-:|
| 10 | PB5 |
| 11 | PB0 |
| 12 | PB1 |
| 13 | PB2 |
| 5V | VCC |
| GND | GND |

なおATTiny85の番号は物理的なピン番号ではなく内部的な番号なので注意

|  |  |  |  |  |
|:-:|:-:|:-:|:-:|:-:|
| PB5 |   | U |   | VCC |
| PB3 |   |   |   | PB2 |
| PB4 |   |   |   | PB1 |
| GND |   |   |   | PB0 |

### Arduino IDEにATTiny85を追加
環境設定>追加のボードマネージャーのURL
に
`http://drazzy.com/package_drazzy.com_index.json`
を追加

ツール>ボード>ボードマネージャ
で ATTinyCoreを検索してインストール
場合によってはエラーを吐かれるが無視
### 試しに書き込む
環境設定>より詳細な情報を表示する>書き込み
にチェックを入れて
ツール>ボード>ATTiny85(no bootloader)
ツール>Clock>1MHz(internal)
ツール>書込装置>Arduino as ISP
を選んで
ファイル>スケッチ例>Basic>Blink
を書き込む(別にこれである必要はないが)

Arduino IDE 2.0.0の場合
スケッチ>書き込み装置を使って書き込む
でないと上手くいかないので注意

適当にLEDをぶっさして動くことを確認する

3行目のパスから始まる長い長い一行をコピーする
(avrdude本体とそのcfgファイルのパスを含むコマンド)

### ブートローダ書き込む
https://github.com/micronucleus/micronucleus/blob/master/firmware/releases/t85_default.hex

これをダウンロードしたら
先ほどコピーした長いコマンドを書き換える
最初の方はそのままに
```
～～～ -b 19200 -U flash:w:path\to\t85_default.hex:i -U lfuse:w:0xf1:m -U hfuse:w:0xdf:m -U efuse:w:0xfe:m
```
path\to\t85_default.hexは適宜書き換えること

クロックと自己プログラムに関するヒューズを書き換えている
micronucleus公式は`LOW:e1 HIGH:dd EXT:fe`を勧めているがEEPROMを使わない限り`LOW:f1 HIGH:df EXT:fe`の方が省電力で良いはず

## ドライバのインストール(Windows)
https://github.com/micronucleus/micronucleus/tree/master/windows_driver_installer

の手順に従ってドライバをインストールする

# 完成
以後プログラムを書き込む際は
ツール>ボード>ATTiny85(micronucreus digispark)
を選択して
digisparkは差さずに普通の書き込みボタンを押下
差してねって言われたら差すと書き込まれる

<blockquote class="twitter-tweet"><p lang="und" dir="ltr">🥳 <a href="https://t.co/AgjiO4xU1l">pic.twitter.com/AgjiO4xU1l</a></p>&mdash; エリンギ/tokotokonatu (@McbeEringi) <a href="https://twitter.com/McbeEringi/status/1566425137552826368?ref_src=twsrc%5Etfw">September 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">起動時に5秒ブランクがあるのは仕様だそうで <a href="https://t.co/Rty72ebjzf">pic.twitter.com/Rty72ebjzf</a></p>&mdash; エリンギ/tokotokonatu (@McbeEringi) <a href="https://twitter.com/McbeEringi/status/1566430830754295809?ref_src=twsrc%5Etfw">September 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

これでポケットにArduino互換機を常備できますね
めでたしめでたし