FT232RLでAVRライターを自作してATtiny85をDigispark互換にするまで

FT232RLでAVRライターを自作してATtiny85をDigispark互換にするまで

今回は二つの内容が含まれていると思ってください。一つはFT232RLを使ったAVRライターの記事で、これに関しては巷に古い情報があふれすぎているので今の情報を書いてみる事にしました。もう一つは、ATtiny85にmicronuclesとlittlewireを焼き込むことで、Digispark互換を仕立て上げるという二点になります。

## FT232RL (AE-UM232R)を使ったAVRライター

たとえばArduino Unoに乗っているCPU(ATmega328P)を買ってきてそのまま動かせば、Arduinoのスケッチが動くかというと残念ながら、ブートローダーというものが入っておらずそのままでは無理です。生のCPUにブートローダーを焼き込む為のハードウェアが必要になります。Arduino Unoを既に持っている人であればプラスアルファでAVRライターを作る事もできますし、Unoを二つ持っている人は繋げればそれが可能になります。他にも、AVRライターと呼ばれるモノ自体売られています。

僕はESP-WROOM-02を動かす為に[AW-UM232R](http://akizukidenshi.com/catalog/g/gK-06693/)を既に買っていたものの余ってる状態でした (ラズパイを使ったらうまくいったのでAW-UM232Rは不要だった)。なので、これを使ってAVRライターを作成しました。さて、このネタ自体はもう9年も前からあるとても古い話です。古すぎて、情報が錯綜している状態だったので、現在におけるFT232RLを使ったAVRライターの話をまとめてみます。

簡単に言うとFT232RLというUSB-serial変換器はBitBangモードという特殊なモードでhackすることでAVRに書き込むことができるというのがおそらく2007年に[すｚのAVR研究](http://suz-avr.sblo.jp/archives/20070621-1.html)に登場して、AVRライターソフトであるavrdudeの私家版が出回っていました。後ほどそれは本家avrdudeに取り込まれているため、今となっては私家版を入れる必要はありません。

### 回路

回路に関しては巷にある情報で問題は特にありません。

FT232DL|CPU側|ATtiny85|ATmega328P
-------|-----|--------|----------
CTS    |MISO |6       |18
DCD    |MOSI |5       |17
DSR    |SCK  |7       |19
RI     |RESET|1       |1
VCC    |VCC  |8       |7
GND    |GND  |4       |8, 22

CPU側のピン番号は[Arduino IDEでATtiny他の開発（Arduino-ISP編） | Make | kosakalab](http://make.kosakalab.com/make/electronic-work/arduino-ide-arduinoisp/)を参考にしました。

ぶっちゃけこれらを結線するだけでも動きます。VCCにLEDを入れてわかりやすくしたりする人もいます (僕も一応入れてみた)。あと、外部クロックを必要とする石(とモード)の場合、セラロック(セラミック製クロック)を入れたりしている人の回路図もよく見つかります。

### ソフトウェア (Mac)

これがいくつか微妙にハマりました。僕がMacを使っている都合上Macの情報だけですがWindowsでもさほど状況は変わらないかなと思います。

```
$ brew install avrdude
```

まずavrdudeをbrewでインストールします。

```
$ avrdude -c diecimila -p t85
can't open ftdi device 0. (unable to claim usb device. Make sure the default FTDI driver is not in use)

avrdude done.  Thank you.
```

次に、avrdudeを叩いてみます。`-c diecimila` はFT232Rを使った方式の指定で、`-p t85`はATtiny85の指定です。他の石の場合は適当に指定方法を見つけてください。たぶんATmega328Pなら`-p m328`とかです。でたらめに指定するとリストが出てくるのでそれを見るといいと思います。

さてオプションはいいとして、エラーが出ています。USBを挿していても同じエラーが出ることと思います。なぜか。OSにインストールされたFTDI社のUSB-serialドライバ(以前は自前でインストールする必要があったようだけど、Marvericksからは既にOSに入っているらしい)とかち合ってるらしいです。OSのドライバではなく自前で読み書きする都合上のようです。そこで、カーネルモジュールからアンロードしてみましょう。

```
$ kextstat | grep -i ftdi
(省略) com.FTDI.driver.FTDIUSBSerialDriver (省略)
$ sudo kextunload -bundle-id com.FTDI.driver.FTDIUSBSerialDriver
```
最初のkexstatで、FTDIのドライバが含まれてるか名前を確認します。その名前のbundle idのドライバをkextunloadでアンロードしてしまいます。

この時名前をどこかにメモしておきましょう。アンロードした状態だとそれはそれで問題がでる(USB-SerialをOSからは見つけられなくなる)ので。元に戻したい場合はloadすればいいです。

```
$ sudo kextload -bundle-id com.FTDI.driver.FTDIUSBSerialDriver
```

FTDIのドライバをunloadしたらもう一度同じコマンドを実行します。

```
$ avrdude -c diecimila -p t85

avrdude: Device is not responding to program enable. Check connection.
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.


avrdude done.  Thank you.
```

今度はエラーの性質が変化しました。FT232DLは正しく動いているっぽいですが、ターゲットのデバイスが反応していません。実は、ボーレートを直接指定しないとダメなようです。(今回は9600を指定していますが4800推奨みたいな話も見かけた気がします)。

```
$ avrdude -c diecimila -p t85 -B9600

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.15s

avrdude: Device signature = 0x1e930b (probably t85)

avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)

avrdude done.  Thank you.
```

ここまで来れば、もう大丈夫です。フューズの書き換えや、ブートローダーを焼き込めます。

Fusesは、CPUの起動オプションを焼き込んだ情報になります。たとえばクロックは内部クロックを使うのか、外部クロックを使うのか、リセットピンをリセットに使うか、リセットではなくGPIOに使うのか。ちなみにEは拡張フューズ、Hはフューズの上位ビット、Lはフューズの下位ビットらしいです。このフューズはCPUの種類によって設定内容が違うっぽいので、詳細は調べてみてください。


### ちなみに

エラーが出ているからと言って「CPUを逆に挿しちゃったかなぁ？試しに逆に挿してみよう(謎)」とか考えて逆に挿してはいけません。ATtiny85の場合、GNDとVCCが逆側になるようについているので悲惨な事になります。香ばしい臭いがしてるなぁと思ったらCPUがとても熱かったです。間抜けな事をやらかした代償は一部溶けたブレッドボードと、水ぶくれが約束された僕の人差し指でした。

**_逆指し絶対ダメ！注意！_**

## ATtiny85と抵抗とツェナーダイオードで作るDigispark互換機

[安価なUSB直挿しマイコンDigisparkのススメ - Qiita](http://qiita.com/erukiti/items/74a848489ec102841b66)にも書いたDigisparkは回路的にはすごく簡単なので作ってみました。本来USBをドライブする能力を持たないATtiny85にソフトウェアでUSBをドライブさせるというコンセプトのボードです。クローン品であれば200円未満で入手できますが、自分で組むことによって回路の自由度を上げることができます。たとえばMicroUSBで作りたいケースだったりでしょうか。また、実際に組んでみるとDigisparkほどとは言えないもののとてもコンパクトにくむことができるので色々使い勝手はいいでしょう。あとeBayからクローン品を入手する場合は発送がそれなりに時間がかかるので、イラチな人なんかも組んでみるといいかもしれません。

### 回路図

[Digispark clone by erukiti d0281ae274aef149 - Upverter](https://upverter.com/erukiti/d0281ae274aef149/Digispark-clone/)

<img width="904" alt="スクリーンショット 2016-02-10 15.59.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/3134/e7ef49ee-56fc-3769-fa73-50131fbcc43e.png">

#### 補足

USB側のVCC(5V)をいったん、三端子レギュレータなどを使って、たとえば3.3Vなどに落とせば3.3Vで駆動することも可能です。その場合、ツェナーダイオードは省略可能です。

3.3Vで駆動すると何がうれしいかというと、3.3Vにしか対応してない機器とつなぐケース、たとえばESP-WROOM-02, LPCシリーズ、BME-280などですね。


#### 参考

* [V-USB - A Firmware-Only USB Driver for Atmel AVR Microcontrollers](https://www.obdev.at/products/vusb/index.html) の Hardware の回路図
* [>> Little Wire](http://littlewire.cc/downloads.html) の回路図
* https://s3.amazonaws.com/digispark/DigisparkSchematicFinal.pdf

### ソフトウェア

Digisparkはソフトウェア的に言えば、[micronucleus](https://github.com/micronucleus/micronucleus)と[Little Wire](http://littlewire.cc/)で構成されています。まずはmicronucleusを焼き込みましょう。

### micronucleusのCLIをインストールする

```
$ git clone https://github.com/micronucleus/micronucleus.git
$ cd micronucleus/commandline/
$ make
$ sudo make install
```

### micronucleusを焼く

これは先ほどのAVRライターを使います。

```
$ avrdude -c diecimila -p t85 -B9600 -U flash:w:micronucleus/firmware/releases/t85_default.hex -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m
```

ここで注意なんですが、FuseはLittleWireのページを見ると`-U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m` と書かれていますが、[digispark:tutorials:programming [Digistump Wiki]](http://digistump.com/wiki/digispark/tutorials/programming)を見ると

```
attiny85-RESET-enabled.bootloader.low_fuses=0xf1
attiny85-RESET-enabled.bootloader.high_fuses=0xdf
attiny85-RESET-enabled.bootloader.extended_fuses=0xfe
attiny85-RESET-disabled.bootloader.low_fuses=0xf1
attiny85-RESET-disabled.bootloader.high_fuses=0x5f
attiny85-RESET-disabled.bootloader.extended_fuses=0xfe
```

などと書かれています。三種類のパターンがあるわけですが、Digispark互換を考えるなら、f1, 5f, fe のパターン(RESET-disabled)でしょうか。

もう一つ注意点は一度micronucleusを焼いてしまうと、AVRライターに反応しない石ができあがります。Fuseやmicronucleusの変更ができなくなってしまうのでご注意ください。試してないですがReset-enableバージョンであれば問題なかったりするかもしれません。

対策としては12Vともう一つ別のArduinoを用意できるなら[ATTiny Fuse Reset - Wayne's Tinkering Page](https://sites.google.com/site/wayneholder/attiny-fuse-reset)というやり方がどうもあるっぽいです。まだ試していませんが、これでフューズのリセットはできるようです。

### little Wireを焼く

ここからはATtiny85を新しい回路の方に差し替えてください。

まずは http://littlewire.cc/downloads.html から、Little-Wire Firmware をダウンロードします。たとえば、[littlewire_v13.hex](http://littlewire.cc/resources/littlewire_v13.hex) です。

```
micronucleus --run littlewire_v13.hex
> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 33% complete
> Device has firmware version 2.2
> Device signature: 0x1e930b 
> Available space for user applications: 6522 bytes
> Suggested sleep time between sending pages: 7ms
> Whole page count: 102  page size: 64
> Erase function sleep duration: 714ms
parsing: 50% complete
> Erasing the memory ...
erasing: 66% complete
> Starting to upload ...
writing: 83% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
```

`> Please plug in the device ... `のタイミングで、抜き差ししてください。そのあと、無反応だったりすると、USBとして正しく認識していないかもしれません。

### platformioでスケッチを焼く

ここまでで、既にDigispark互換になっているので、Digisparkを焼くのと同じ手順で焼けるはずです。[安価なUSB直挿しマイコンDigisparkのススメ - Qiita](http://qiita.com/erukiti/items/74a848489ec102841b66) のplatformioで開発するを参考にしてください。

ただ、ここまでの手順でやった人はエラーがでると思います。

```
Warning: device with unknown new version of Micronucleus detected.
This tool doesn't know how to upload to this new device. Updates may be available.
Device reports version as: 2.2
```

`~/.platformio/packages/tool-micronucleus/micronucleus` を、最新の micronucleusに置き換えましょう。

```
$ mv ~/.platformio/packages/tool-micronucleus/micronucleus ~/.platformio/packages/tool-micronucleus/micronucleus.old
$ cp /usr/local/bin/micronucleus ~/.platformio/packages/tool-micronucleus/
```

これで問題なく動いたはずです。