素のAVRマイコンに安価に書き込む

## 概要
* AVR の安価な書き込み環境を作る
* Arduino IDE と連携させる

## FT232RL とは
FT232RLは安価なUSBシリアル変換ICで、秋月等で入手可能。
今回は、同じく秋月で手に入る[コネクタ搭載済みモジュール](http://akizukidenshi.com/catalog/g/gK-01977/ "FT232RL USBシリアル変換モジュール")を使う。
書き込みに必要な機材はこのモジュール(950円)と配線だけ。

FT232RL には BitBang モードというものが用意されており
USB を汎用の入出力端子として使うことができる。

今回はこのモードにに対応した avrdude である、avrdude-serjtag を用いる。


## avrdude-serjtag を用いた書き込み
### avrdude-serjtag
下記サイトより avrdude-serjtag04n をダウンロードする。
[FT245R/FT232R で avrdude (2) - すｚのAVR研究](http://suz-avr.sblo.jp/category/780472-1.html "FT245R/FT232R で avrdude (2)")

### 接続
FT232RL と AVR の接続は、avrdude.conf に合わせて行う。
avrdude-serjtag の avrdude.conf には、 ft232r0 と ft232r1 という2種類のピン割り当てが記述されている。
本記事では ft232r1 を用いる。


``` avrdude.conf
programmer
  id    = "ft232r1";
  desc  = "Synchronous BitBang channel 1";
  type  = ft245r;
  miso  = 3;  # D3/CTS  (AVR の miso を FT232RL の CTS に接続。以下同様)
  sck   = 5;  # D5/DSR
  mosi  = 6;  # D6/DCD
  reset = 7;  # D7/RI
;
```

### 接続テスト
配線後、下記コマンドを実行する。

``` 
# Windows 以外の環境では .exe 不要
$ avrdude.exe -n -p m328p -C avrdude.conf  -c ft232r1 -P ft0
avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 1 sck 2 mosi 0 reset 4
avrdude.exe: drain OK

 ft245r:  bitclk 230400 -> ft baud 115200
avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e950f

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.
```



## Arduino IDEとの連携
avrdude-serjtag によって書き込みやヒューズの設定は可能だが、せっかくなので
Arduino IDE と連携させたい。

Arduino IDE 標準の avrdude に対して avrdude-serjtag のバージョンが古いため
単純に置き換えると他の書き込み器への対応が怪しくなる。
そのため、標準の avrdude と avrdude-serjtag を GUI 上で切り替えて利用できるように導入し、素の AVR マイコンに書き込む際だけ avrdude-serjtag を呼び出すようにする。

Arduino IDE のインストールディレクトリ (Windows では C:\Program Files (x86)\Arduino)　をカレントディレクトリとして、以下の設定を行う。

* hardware/arduino/avr/programmers.txt の末尾に追記

``` programmers.txt
bitbang.name=FTDI Bitbang
bitbang.protocol=ft232r1 -Pft0 -p m328p
bitbang.program.tool=avrdude_ftdi
bitbang.speed=115200
```

* hardware/arduino/avr/platform.txt の末尾に追記

``` platform.txt
# avrdude_ftdi
tools.avrdude_ftdi.program.params.verbose=-v -v -v -v
tools.avrdude_ftdi.program.params.quiet=-q -q
tools.avrdude_ftdi.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.hex:i"

tools.avrdude_ftdi.erase.params.verbose=-v -v -v -v
tools.avrdude_ftdi.erase.params.quiet=-q -q
tools.avrdude_ftdi.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m

tools.avrdude_ftdi.bootloader.params.verbose=-v -v -v -v
tools.avrdude_ftdi.bootloader.params.quiet=-q -q
tools.avrdude_ftdi.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m
```

* hardware/arduino/avr/boards.txt の末尾に追記
    * 利用する AVR マイコンの種類に合わせる
    * 下記は ATmega328P の例

``` boards.txt
atmega328p.name=Arduino ATmega328p (20MHz)

atmega328p.vid.0=0x2341
atmega328p.pid.0=0x0043
atmega328p.vid.1=0x2341
atmega328p.pid.1=0x0001

atmega328p.upload.tool=avrdude_ftdi
atmega328p.upload.protocol=arduino
atmega328p.upload.maximum_size=32256
atmega328p.upload.maximum_data_size=2048
atmega328p.upload.speed=115200

atmega328p.bootloader.tool=avrdude_ftdi
atmega328p.bootloader.low_fuses=0xFF
atmega328p.bootloader.high_fuses=0xDE
atmega328p.bootloader.extended_fuses=0x05
atmega328p.bootloader.unlock_bits=0x3F
atmega328p.bootloader.lock_bits=0x0F
atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex

atmega328p.build.mcu=atmega328p
atmega328p.build.f_cpu=20000000L
atmega328p.build.board=AVR_naked
atmega328p.build.core=arduino
atmega328p.build.variant=standard
```

* avrdude-serjtag04n の avrdude.exe を hardware/tools/avr/bin に avrdude_ftdi.exe とリネームして配置 (Win以外は .exe 不要)
* avrdude-serjtag04n の avrdude.conf を hardware/tools/avr/etc に avrdude_ftdi.conf とリネームして配置

ここまで実行して Arduino IDE を起動すると、下記が追加されている

* ボード: Arduino ATmega328P
* 書込装置: FTDI Bitbang

これで、Arduino IDE 上でブートローダやスケッチの書き込みができる。

### ブートローダの書き込み
ツールから下記を選択し、ツール > ブートローダを書き込む を実行

* ボード: Arduino ATmega328P
* 書込装置: FTDI Bitbang

ブートローダを書き込む場合は、忘れずに外部クロックを取り付けること。

### スケッチの書き込み
ツールから下記を選択し、ファイル > 書込装置を使って書き込む を実行

* ボード: Arduino ATmega328P
* 書込装置: FTDI Bitbang

書き込み後、AVR の RESET 端子と FT232RL の RI を接続している線を外すと
スケッチが実行される。

## 課題
### シリアル通信
FT232RL を AVR とのシリアル通信にも使う場合
一度 USB ケーブルを抜かないと動作しない?

### avrdude のバージョン
最新の Arduino IDE に付属する avrdude は 6.0.1 だが
今回利用した avrdude-serjtag04n は 5.10 とだいぶ古い。

Windows 環境で bitbang 対応の avrdude 最新版が正しくビルドでき次第
avrdude-serjtag から乗り換え予定。