Arduino UNOでATmega328 生DIPにbootloaderを書き込む

# はじめに

[Arduinoで冷凍庫半開き検出ブザーを作ってみた 前編](http://qiita.com/isop/items/ed4aa2e77ed0d684fc2e) で原理確認をした後でArduino Nanoを使って実際に使える状態のものを作ろうとしていたのですが、発注したArduino Nanoがいつまで経っても届かないので、ATmega328 DIPを使う方針に切り替えました。
ただ、生DIPを買ってきてもbootloaderを書き込まないとArduino IDEからは使えない+スケッチを書き込めないとわかったので、その手順をまとめておきます。

参考にしたのは、Arduino公式の [From Arduino to a Microcontroller on a Breadboard](https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard) です。

## 必要なもの

* Arduino UNO
* ATmega328P-PU (Arduino UNOに乗っているものと同じ)
* 水晶 16 MHz
* 抵抗 10kΩ
* コンデンサ 22pF
* IC引き抜き工具
* ブレッドボード
* ジャンパ線

## 生DIPとArduino UNOの接続

生DIPにbootloaderを書き込むために、ブレッドボードに生DIPと周辺回路を作ります。
ATmega328P-PUのPIN配置は以下のようになっています。(http://www.atmel.com/Images/8161s.pdf より引用)

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/35314/ce13419a-e300-86fb-83af-673e1fbc3d11.jpeg)

接続が必要なピンは以下の通りです。

|Arduino UNO|ATmega328P-PU           |Other                    |
|:----------|:------------           |:-------                 |
|D13        |PB5 (SCK/PCINT5)        |抵抗 10kΩ                 |
|D12        |PB4 (MISO/PCINT4)       |-                        |
|D11        |PB3 (MOSI/OC2A/PCINT3)  |-                        |
|D10        |PC6 (PCINT14/RESET)     |-                        |
|5V         |VCC, AVCC               |-                        |
|GND        |GND                     |-                        |
|-          |PB6 (PCINT6/XTAL1/TOSC1)|水晶 16MHz、コンデンサ 22pF|
|-          |PB7 (PCINT7/XTAL2/TOSC2)|水晶 16MHz、コンデンサ 22pF|

接続イメージは [From Arduino to a Microcontroller on a Breadboard](https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard) を参照してください。

実際の接続は以下のような感じになります。

![2015-10-22 00.43.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/35314/26367719-8854-3196-6bb3-d89e048e7dba.jpeg)

## 生DIPにbootloader書き込み

bootloaderが書かれていないATmega328PをArduinoで扱うためには、1度bootloaderを書き込む必要があります。
手順は [From Arduino to a Microcontroller on a Breadboard](https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard) の通りです。

Arduino IDEで以下の操作を行います。

1. メニューバー → ファイル → スケッチの例 → ArduinoISP を選択
2. "マイコンボードに書き込む" を選択し、ArduinoISPをArduino UNOに書き込む
2. メニューバー → ツール → ボード → "Arduino Duemilanove or Diecimila" を選択
3. メニューバー → ツール → ボード → "ATmega328" を選択
4. メニューバー → ツール → ポート → Arduino/Genuino Uno のシリアルポートを選択
5. メニューバー → ツール → 書込装置 → "Arduino as ISP" を選択
6. メニューバー → ツール → "ブートローダを書き込む" を選択

以下の状態になっているのが正しいです。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/35314/568cc04e-0079-5a8d-7b20-46f679a69c5e.jpeg)

これでエラーが発生しなければ、bootloaderの書き込みは成功です。
bootloaderは一度書き込めば、再度書き込む必要はないとのことなので、後はArduino IDEからスケッチを書き込んでいろいろできるようになります。

## スケッチの書き込み

[From Arduino to a Microcontroller on a Breadboard](https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard) ではスケッチの書き込みを行う際には、ブレッドボードの配線を変えて、さらにArduino UNO上のATmega328Pも外さないといけない、と書いていました。
ただ、Arduino UNOのATmega328Pを外す必要があるなら、Arduino UNOにbootloaderを書いたATmega328Pを差し替えてスケッチを書き込んだほうがよくないか？と思って試してみたら、問題なくスケッチの内容を焼いて動作させることができました。(Arduino UNO上のLチカで確認)
Lチカのスケッチが書かれたATmega328Pをスタンドアローンで動作させると、以下のような感じになります。

![2015-10-22 23.46.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/35314/68785b1f-53ee-777b-b53b-d3e987815fa8.jpeg)

Arduino UNOからATmega328Pを引っこ抜くときにはIC引き抜き工具が必要になると思うので、こちらのほうが個人的にはやりやすいと感じました。
もちろん、ICを交換するときは、ACアダプタとUSBは接続しないようにしましょう。

このとき、ボードの種類をArduino UNOに戻すと書き込みに失敗します。
ボードの種類は"Arduino Duemilanove or Diecimila"のままにしておきましょう。
書込装置は"AVRISP mkII"に戻しました。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/35314/032a6ba7-316b-e9e8-3ea2-99094ed745d9.jpeg)

# そして後半へ

これでATmega328Pを単体で使えるようになったので、ユニバーサル基板に回路を実装することができます。
[Arduinoで冷凍庫半開き検出ブザーを作ってみた 前編](http://qiita.com/isop/items/ed4aa2e77ed0d684fc2e) でやってしまった失敗を繰り返さないように、回路図、配線図のチェックはちゃんとやって実装に取り掛かろうと思います。