Check! IoT ができるようになるまで ～ ESP-WROOM-02 にプログラムを焼く

こんにちは、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
====
IoT ができるようになるまで、一歩一歩勉強していきます。

今回は、`ESP-WROOM-02` という WiFi モジュールに Arduino 互換のプログラムを書き込んで動作させます。

これにより、`ESP-WROOM-02` を使って、WiFi経由でインターネットにアクセスするプログラムを書き込む環境が準備できることとなります。

それではさっそく！

ESP-WROOM-02 の設定値を確認しておく
====

まず、注意したいのは、ESP-WROOM-02 に一度プログラムを書き込むと、ATコマンドでの接続はできなくなるそうです。（「[ESP-WROOM-02 を使った リモート温度・湿度・気圧計の製作](http://www.e-risingstar.com/wordpress/?p=777 "ESP-WROOM-02 を使った リモート温度・湿度・気圧計の製作 | 興味本位の Trial 安堵 Error")」を拝見しました。）

ですので、念のため、AT コマンドで `ESP-WROOM-02` の情報を確認しておきましょう。ATコマンドについては、こちら「[ESP8266 （ESP-WROOM-02）を使う](http://www.mkbtm.jp/?p=618 "ESP8266 （ESP-WROOM-02）を使う - mkbtm")」を参考にさせていただきました。

```
AT+GMR

AT version:0.25.0.0(Jun  5 2015 16:27:16)
SDK version:1.1.1
compile time:Jun  5 2015 21:03:10

OK
```
```
AT+CIFSR

+CIFSR:STAIP,"192.168.0.1"
+CIFSR:STAMAC,"xx:xx:xx:xx:xx:xx"

OK
```

なお、戻したい場合は、「[ESP-WROOM-02を使ってみる2　-外付けSPIフラッシュの書き換え-](http://nemuisan.blog.bai.ne.jp/?eid=215341 "ねむいさんのぶろぐ | ESP-WROOM-02を使ってみる2　-外付けSPIフラッシュの書き換え-")」を参考に、SDK を焼き直すやり方があるようです。私はまだこれは実施していないので、実施される方は自己責任でお願いいたします。

Arduino IDE に ESP8266 環境を準備する
====
さて、それでは、Arduino IDE で ESP8266 に書き込めるように準備します。

Arduino IDE は[公式サイト](https://www.arduino.cc/en/Main/Software "Arduino - Software")から入手して、インストールしてください。

ボードマネージャーを設定する
----
[Installing with Boards Manager | esp8266/Arduino](https://github.com/esp8266/Arduino "Installing with Boards Manager | esp8266/Arduino") の手順を参考に、ボードマネージャーを設定します。

Arduino の「環境設定」を開きます。
![20151212_arduino_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c8022e36-f0cc-2da7-386d-20aa77476afa.png)

「Adding Boards Manager URLs」に `http://arduino.esp8266.com/stable/package_esp8266com_index.json` と入力して、「OK」でウィンドウを閉じます。（複数URLがある場合、コンマ区切りで追加できます。）
![20151212_arduino_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/16a6b0a9-9bf9-0752-12e6-fceae090e68a.png)

「ツール」>「マイコンボード」>「ボードマネージャー」を開きます。
![20151212_arduino_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/92d1bda6-3a96-fb74-595b-378f16e3306e.png)

`esp8266 by ESP8266 Community` が追加されています。クリックすると「インストール」が表示されるので、バージョンを確認してインストールしてください。私は `2.0.0` をインストールしました。
![20151212_arduino_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9b93b1f7-6b52-4aec-a5c1-d7b67a7fa405.png)

「ツール」>「マイコンボード」>「ESP8266 Modules」に、ESP8266 系のボードが追加されました。 `Generic EAP8266b Module` を選択します。
![20151212_arduino_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/e5fd8a0f-7c50-2ed2-a264-787b77e5da72.png)


シリアルモニターを設定する
----
Arduino IDE のシリアルモニターの設定値を以下で設定しておきます。

- 速度: `115200 bps`
- 改行: `CRおよびLF`

ESP-WROOM-02 に書き込む
====
まずは(?)書き込めないことを実験
----
`ESP-WROOM-02` は、そのままだとプログラムを焼けません。

本当か？ということで、やってみました。案の定、エラーで書き込めません。

```
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
warning: espcomm_sync failed
error: espcomm_open failed
```

UART ブートローダーモードに切り替える
----

では `ESP-WROOM-02` にプログラムを書き込むにはどうしたらいいのかというと、「UART ブートローダーモード」に切り替える必要があります。

このドキュメント「[Boot Messages and Modes | Supported Hardware · ESP8266 Arduino Core](http://esp8266.github.io/Arduino/versions/2.0.0/doc/boards.html#boot-messages-and-modes "Boot Messages and Modes | Supported Hardware · ESP8266 Arduino Core")」を参考に、UART ブートローダーモードに切り替えてみましょう。

UART ブートローダーモードに切り替えるためには、ピンを以下の状態にしてリセットします。リセットするには、 `RST` を1度 `GND` に落とします。 

|モード|GPIO15|GPIO0|GPIO2|
|------|:----:|:---:|:---:|
|通常  | 0V  | 3.3V | 3.3V |  
|UART Bootloarder| 0V | **0V** | 3.3V |

※ それぞれ、10kΩの抵抗経由の配線です。

実際に配線してみます。

### リセット、UARTブートローダーモード切替用スイッチの配線

基本の配線に加え、モード切替用の構成を配線します。必要なときのみ切り替えられるように、スイッチを組み込みました。

スイッチの配線は、「[ESP-WROOM-02 の Arduino 環境で I2C 制御](http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b "ESP-WROOM-02 の Arduino 環境で I2C 制御")」 を参考にさせていただきました！この記事に回路図があるので、それを見て配線したほうがわかりやすいです。

|ピン|説明|
|---|----|
| IO0 | 分岐させ、スイッチを挟んで GND へ |
| RST | 分岐させ、スイッチを挟んで GND へ |

私の配線は下図のようになりました。これは、スイッチサイエンスさんの [ESP-WROOM-02ピッチ変換済みモジュール《フル版》](https://www.switch-science.com/catalog/2347/ "ESP-WROOM-02ピッチ変換済みモジュール《フル版》 - スイッチサイエンス") を使っています。（例によって素人の配線ですし、配線が基板の裏を通っていてわかりにくかったりしますので、ご参考までに。）

![20151213_arduino_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f7ea9618-9eab-0b02-1f56-c09ab24ff816.png)

UART ブートローダーモードに切り替える
----
それでは、このスイッチを利用してモードを切り替えます。

1. `IO0 スイッチ` を押しつづける（IO0 を GND につなぐ）
2. `RST スイッチ` を押して離す（リセット）
3. `IO0 スイッチ` を離す

これで、プログラムを書き込む準備ができました！

プログラムを書き込む
----
準備万端、改めてプログラムの書き込みを実行してみると…

```
最大434,160バイトのフラッシュメモリのうち、スケッチが203,948バイト（46%）を使っています。
最大81,920バイトのRAMのうち、グローバル変数が33,206バイト（40%）を使っていて、ローカル変数で48,714バイト使うことができます。
Uploading 208096 bytes from C:\Users\dz\AppData\Local\Temp\builda90113b6da60df6c8d58aadfa9e1c363.tmp/esp_arduino_test.ino.bin to flash at 0x00000000
............................................................................................................................................................................................................
```

書けましたーーーー！！！(*ﾉωﾉ)

以下は `loop()` でシリアル出力に "OK..." を表示し続けるテストプログラムを書き込んだ直後です。
![20151212_arduino_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/046ca0b6-ccac-a999-06db-834b9b732d3a.png)


尚、書き込みが終わるとモードが元に戻るので、再度書き込む場合も UART ブートローダーモードに切り替えてから書き込んでください。

Epilogue - おわりに
====
さぁ、ここまでできたら、あとはプログラムを書くだけです！

これであれにつなげられるぞー！

がつがつ進みましょう！！(/・ω・)/

[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"