Arduinoのブートローダー書き込み(2種類)

#はじめに
2018/03/05現在、[aitendo](http://www.aitendo.com/)の「[あちゃんでいいの(実装済)](http://www.aitendo.com/product/12175)」が39円で特売されていました。この基板の他にマイコンや水晶やソケット等が必要で、総額350円くらいでArduino互換機ができます。AliExpressでNano互換機が250円くらいで買えるのであまりお得ではありませんが、特売というので思わず買ってしまいました。

そこでマイコン(ATMEGA328P-PU)が必要なのですが、ブートローダーが書き込まれている物は書き込まれている物より少しだけ値段が高い(90～150円くらい高い？)です。よってブートローダーが書き込まれていない物を購入。ということで、ここからが本題です。

#ATMEGA328P-PUにブートローダーを書き込む方法。

色々と調べてみると、間違った配線図が紹介されていたり、情報が古かったりで少々つまずきました。最終的にはArduinoISPを使う方法とOptifixを使う2種類の方法があるらしく、そのどちらでもブートローダーを書き込めたので忘備録的に記載します。
ただし、IDEのバージョン等で挙動が違うかもしれません。2018/03/05現在、IDEの最新バージョンは1.8.5です。諸事情あって私の環境はArudino IDEバージョン1.6.9ですから、最新バージョンでは違う事もあるかもしれません。

ArduinoISPは最初からスケッチの例にありました。まずはArduinoISPを使う方法から。

#ArduinoISP編
必要な物

* Arduino UNO
* 水晶(16MHz)1個
* セラミックコンデンサ(22pF)2個
* 抵抗(10kΩ)1個
* ブレッドボード
* ジャンプワイヤー

実体配線　参考：[Arduino公式](https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard)
![ブートローダー書込配線_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/241992/4347c7f7-2c7f-eea1-38d1-e53d59370617.jpeg)
回路図
![ブートローダー書込配線.png](https://qiita-image-store.s3.amazonaws.com/0/241992/bdd8c63d-7671-14e0-b72b-bb6657547e69.png)

#手順(準備編)
まずはArduino UNOにスケッチを書き込みます。Arduino IDEのメニューで、

1. ファイル＞スケッチの例＞"ArduinoISP"を選択
2. ツール＞ボード＞"Arduino/Genuino UNO"を選択
3. ツール＞シリアルポートで"UNOが繋がっているポート"を選択
4. スケッチ＞"マイコンボードに書き込む"

これでコンパイルとスケッチの書き込みが正常終了すると、ブートローダーの書き込み準備が完了します。

#手順(ブートローダー書込み編)
ここでブレッドボード
Arduino IDEのメニューで、

1. ツール＞書込装置＞"Arduino as ISP" を選択
2. ツール＞"ブートローダーを書き込む"を選択

![IDE画像.jpg](https://qiita-image-store.s3.amazonaws.com/0/241992/b78fc851-6668-cc3d-97b7-3db29f032c2c.jpeg)
こんな感じ

これでエラーが出なければ完了です。
以下のエラーが発生した場合は、
` avrdude: stk500_getsync(): not in sync: resp=0x00` 
ポートの設定が間違っているか、一度USBコネクターを抜き差ししてみてください。
` Double check connections and try again, or use -F to override this check.` 
配線等が間違っています。私はジャンプワイヤーメスのコンタクトピンが抜け掛かっていて配線が正しいのにエラーが出て嵌りました。

#Optifix編
次にOptifixを使用する方法です。
まずはOptifixを[Arduinoフォーラム](http://forum.arduino.cc/index.php/topic,28733.0.html)よりダウンロードしてください。ダウンロードしたzipファイルを解凍して、ライブラリフォルダーにコピーしてください。
配線等はArduinoISPと同じで問題ありません。フォーラムの解説では水晶やコンデンサ等の部品が不要みたいです(実体配線図に無い。試していません)。

そして、ダウンロードしたファイルの一部を修正します(コンパイルエラーが出るので)。
optiLoader.h の1行目

```c
#include <WProgram.h>
↓
#include <Arduino.h>
```

optiLoader.h の19行目

```c
extern image_t PROGMEM image_328;
↓
extern const PROGMEM image_t image_328;
```

optifix.pde 74行目

```c
image_t *images[] = {
  &image_328, 0
};
↓
image_t *images[] = {
  const_cast<image_t*>(&image_328), 0
};
```

optifix.pde 74行目

```c
image_t PROGMEM image_328 = {
↓
const PROGMEM image_t image_328 = {
```

#手順(準備編)
まずはArduino UNOの5Vから出ているジャンプワイヤーを外しておきます。
![ブートローダー書込配線_ブレッドボード2.jpg](https://qiita-image-store.s3.amazonaws.com/0/241992/968ddf13-93fe-2ce1-61d3-af1c094578f0.jpeg)

Arduino UNOにスケッチを書き込みます。Arduino IDEのメニューで、

1. ファイル＞スケッチの例＞"Optifix"を選択
2. ツール＞ボード＞"Arduino/Genuino UNO"を選択
3. ツール＞シリアルポートで"UNOが繋がっているポート"を選択
4. ツール＞書込装置＞"AVRISP mkⅡ"を選択
5. ツール＞"シリアルモニタ"を選択
6. シリアルモニタの通信速度を"19200bps"を選択
![IDE画像2.jpg](https://qiita-image-store.s3.amazonaws.com/0/241992/175ce3f9-3e40-a263-0d06-e51012586310.jpeg)

7. スケッチ＞"マイコンボードに書き込む"

これでコンパイルとスケッチの書き込みが正常終了すると、ブートローダーの書き込み準備が完了します。

#手順(ブートローダー書込み編)
シリアルモニタには下記のメッセージが出ていると思います。

``` 
OptiFix Bootstrap programmer.
2011 by Bill Westfield (WestfW)

Starting Program Mode [OK]

Reading signature: Bad value: 0
(no target attached?)

Type 'G' or hit RESET for next chip
```

これはエラーですが、書き込むマイコンが接続されていない、またはブートローダーが書き込み済の時にでます。
ここで、Arduino UNOの5Vから出ているジャンプワイヤーを接続します。
次にシリアルモニターのコマンド入力欄に"G"を入力して"送信"ボタンを押します。

```
OptiFix Bootstrap programmer.
2011 by Bill Westfield (WestfW)

Starting Program Mode [OK]

Reading signature:950F
Searching for image...
Found "optiboot_atmega328.hex" for atmega328
Start address at 7E00
Total bytes read: 508

Setting fuses for programming
Lock: 3F FFE000 Low: FF FFA000 High: DE FFA800 Ext: 5 FFA400

Programming bootloader: 512 bytes at 0x3F00
Commit Page: 3F00:3F00
Commit Page: 3F40:3F40
Commit Page: 3F80:3F80
Commit Page: 3FC0:3FC0

Restoring normal fuses
Lock: F FFE000

Type 'G' or hit RESET for next chip
```

上記のようなメッセージが返ってくればブートローダーの書き込みが完了です。

以上。