ESP-WROOM-02 ✕ myThings = ？

# ESP-WROOM-02って何？ 
サイズも小さく、Wifi通信ができて、Arduinoのプログラムも書き込めるというもジールです。しかも、１個¥950とかなりお買い得です。

今回は、

![ESP-WROOM02](http://www.microtechnica-shop.jp/shopimages/microtshop/000000000039.jpg)

[WiFi-UARTモジュール ブレークアウトボード実装済み [BB-ESP-WROOM02]](http://www.microtechnica-shop.jp/shopdetail/000000000039/)

これを購入しました。

# ESP-WROOM-02の準備
## 決死のハンダ付け

これだけでは使えません。
ブレッドボードで使用するためには、ビンヘッダをハンダ付けする必要があります。

#### 必要なもの

- ピンヘッダ　2.54mmピッチ
- ピンヘッダ　2mmピッチ
- ジャンパーピン　2mmピッチ　✕　4個
- スイッチ（リセットスイッチ用）　✕　１個
- ハンダの技術

![ピンのピッチ](https://qiita-image-store.s3.amazonaws.com/0/87230/0c3ade27-1d52-82c9-4e6b-a7ce0af61179.jpeg)

ハンダ付け完了
３０分奮闘の結果、みごとにガッタガタ・・・ :sob:
![IMG_1036.JPG](https://qiita-image-store.s3.amazonaws.com/0/87230/7a7acff3-a462-ab1e-288a-b6e6801395a7.jpeg)
ゆがんでしまった時の修復方法（テクニック）がわからないので、、、とりあえずこのままいきます。

## ブードモード
**ESP-WROOM-02**にはブードモードが２種類あります

| モード | GPIO15 | GPIO2 | GPIO0 |
|:------------:|:-----------:|:------------:|:------------:|
|UART Download Mode(書き込みモード)|LOW|HIGH|LOW|
|Flash Boot Mode(実行モード)|LOW|HIGH|HIGH|

目的のモードに合わせて、2mmピッチのジャンパーピンで接続して下さい。

## PCとの接続
Arduinoのプログラムを書き込めるとはいえど、microUSBなどの端子はないので、UART通信で接続しないといけません。たまたまショップで見つけたUSB-シリアル変換モジュールで接続します。

[小型USB-シリアル変換モジュール](http://eleshop.jp/shop/g/gFBO411/)

![小型USB-シリアル変換モジュール](https://qiita-image-store.s3.amazonaws.com/0/87230/ac22f9da-c7f8-2fc6-7015-24ae35ea03da.jpeg)

配線はこんな感じになりました。
![IMG_1040.JPG.jpeg](https://qiita-image-store.s3.amazonaws.com/0/87230/2aedee7d-ba2d-b777-6d82-bca230714b7d.jpeg)

<img width="500" alt="haisen.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/16149d87-5a99-7fb0-774a-d07e6c3074a0.png">

## PCとの接続確認
PCと**ESP-WROOM-02**の通信テストを行います

小型USB-シリアル変換モジュールのデバイスドライバはProlific社よりダウンロードしてインストールしておきます。

- [Mac用デバイスドライバ](http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41)

小型USB-シリアル変換モジュールをPCに挿入した状態で、アプリケーション＞ユーティリティ＞システム情報.app を起動して、ハードウェア＞USBをクリックします。
一覧に「USB-Serial Controller」が表示されていたら正常に認識されています。

<img width="600" alt="driver.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/3c4d3fa9-24f4-1fa4-c932-ac14c69c5daf.png">

ターミナルから以下のコマンドを実行します。
`ls /dev/tty.usbserial*`
/dev/tty.usbserial　が見えたらOKです。
<img width="600" alt="ls_command.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/263ea9f9-d0e1-6794-9a32-329428b27d6f.png">

<font color="red">認識されない時は何度も何度も抜き差しを繰り返してみてください</font>

## 動作確認
ArduinoIDEからシリアルモニタを起動します。
<img width="600" alt="serial_monitor.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/afa54682-d359-db75-bbd1-41748fbff082.png">
改行を「CRおよびLF」、通信速度115200bpsに設定し、入力エリアに「AT」と入力しENTERキーを押すと、図のような応答が返ります。
<img width="600" alt="at_.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/bb82ac3c-b8e9-f59e-69d0-ee84627bd049.png">
つぎは、バージョン情報を見てみましょう。
「AT+GMR」と入力して、ENTERを押します。
<img width="600" alt="at_mgr.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/b0b01bfc-0821-ad7b-226e-3344fa83f666.png">
つぎは、近くのアクセスポイントの一覧を見てみます。
「AT+CWLAP」と入力して、ENTERを押します。おー。リストが返ってきました。
<img width="600" alt="AT_CWLAP.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/d89b851a-b11d-f66f-dc57-a7c0aebb65a8.png">
「ERROR」が返ってくる場合は、WiFiモードを確認してみてください。
**ESP-WROOM-02**には、３つのWiFiモードがあります。

*マイクロテクニカのサイトより*
> 本モジュールは、周囲のWi-Fiアクセスポイントに接続するステーションモードと、本モジュールがアクセスポイントとなって他のデバイスを接続させるソフトAPモードを搭載しています。これらのモードは単独で動作させることも、両方どうささせることも可能です。DHCPサーバー搭載ですのでソフトAPモードに接続されたデバイスには自動的にIPアドレスが割り振られます。


「AT+CWMODE?」と入力して、Wifiモードを確認してみてください。

| Wifiモード | 値 | 説明 |
|:------------|:-----------:|:------------|
|Station mode|1|周囲のWi-Fiアクセスポイントに接続する|
|softAP mode|2|本モジュールがアクセスポイントとなって他のデバイスを接続させる|
|AP + Station mode|3|AP + Station モード|

wifiモードを設定するときは、「AT+CWMODE=値」と送信します。

## アクセスポイントへの接続

| コマンド | 説明 |
|:------------|:------------|
|AT+CWJAP_CUR=\<ssid>,\<pwd>[,\<bssid>]|アクセスポイントの設定。Flashに保存されません|
|AT+CWJAP_DEF=\<ssid>,\<pwd>[,\<bssid>]|アクセスポイントの設定。Flashに**保存されます**|
※ *AT+CWJAP*コマンドは非推奨のようです。

<img width="600" alt="ip_station.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/b3a0fcb9-4ac6-ee78-d176-17ae10e9dc2d.png">

IPが取得出来ているか確認してみましょう

| コマンド | 説明 |
|:------------|:------------|
|AT+CIPSTA_CUR?|IPの情報を表示します。|
|AT+CIPSTA_CUR=<IP>[,<gateway>,<netmask>]|静的IPを設定します。Flashに保存されません|
|AT+CIPSTA_CUR?|Flashに保存されているIPの情報を表示します。|
|AT+CIPSTA_CUR=<IP>[,<gateway>,<netmask>]|静的IPを設定します。Flashに**保存されます**|

<img width="600" alt="ip_sta.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/98f20af6-1ea2-d9a6-d54c-64f73108901f.png">

wifiに接続できているかPINGしてみます。
<img width="600" alt="ping_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/c8d3c1eb-a4ad-87aa-2e16-9447a5ce7bc3.png">
繋がった。:kissing_smiling_eyes:

# ESP-WROOM-02 プログラム
やっと使える準備ができたので、つぎはArduinoIDEからプログラムを作成し動かしてみたいと思います。
今回は単純に、**ESP-WROOM-02**をHTTPクライアントにし、APIにアクセスしてデータ取得すろところを試みたいと思います。

## ArduinoIDEの準備
**ESP-WROOM-02**にプログラムを転送するには、マイコンボード　に**ESP8266**を追加しなければいけません。

### 環境設定
まず、ArduinoIDEの環境設定（Arduino＞Preferences…）を開き、「Additional　Boards　Manager　URLｓの欄に、以下のURLを登録します。

http://arduino.esp8266.com/stable/package_esp8266com_index.json

<img width="600" alt="prefer.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/a0e0fb01-490d-db0c-dd1f-e5d29acdfcc6.png">

### マイコンボードの追加
ツール＞マイコンボード＞ボードマネージャー を起動します
**ESP8226 Community**をクリックするとInstallボタンがでてくるので押します。

<img width="600" alt="bord_mgr.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/64746e76-2abe-5c51-269b-27de395f9cd4.png">

インストールが終わって、再び、ツール＞マイコンボード＞ボードマネージャー を開くと「ESP8266 Modules」が追加されています。その中から**「Generic ESP8266 Module」**を選択します。

<img width="200" alt="bord_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/a4296763-c85b-6eec-12a3-761c9065222c.png">

## プログラムの書き込み
### 早速ハマる :weary:

**ESP-WROOM-02**をクライアントにしたかったので、ファイル＞スケッチの例＞ESP8266WiFi＞WiFiClientの例をロードし、SSIDなどを環境に合わせて変更して、「マイコンボードに書き込む」をクリックします。
すると・・・

```
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
warning: espcomm_send_command(FLASH_DOWNLOAD_BEGIN) failed
```

なんしかエラー。

先人の方々のページを探し、こちらのブログが大変参考になりました。
http://qiita.com/ksyundo/items/2ea2e846463aba004534
http://hpclab.blogspot.jp/2015/06/esp8266-arduino-ide-on-mac-os-x.html

:point_right: ポイント
「Step 3: Modify platform.txt file」 Change it like this wayの部分は、esptool.pyのバージョンによってパラメータの指定方法が異なるようなので、注意して下さい。
今回はこのように変更しました。

```
#tools.espota.upload.pattern="{cmd}" "{path}/espota.py" -i "{serial.port}" -p 8266 -f "{build.path}/{build.project_name}.bin"
tools.esptool.upload.pattern="/usr/local/bin/esptool.py" -p "{serial.port}" write_flash 0x00000 "{build.path}/{build.project_name}.bin"
```

### 書き込み
再び書き込みを行うと・・・

<img width="600" alt="write_chu.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/f2dccb4a-f591-d9ce-196b-e60b5b0364ed.png">

```
最大499,696バイトのフラッシュメモリのうち、スケッチが226,362バイト（45%）を使っています。
最大81,920バイトのRAMのうち、グローバル変数が31,749バイト（38%）を使っていて、ローカル変数で50,171バイト使うことができます。
esptool.py v1.0.2-dev
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0000
Writing 233472 @ 0x0... 0 (0 %)1024 (0 %)2048 (0 %)3072 (1 %)4096 ・・・省略・・・ (99 %)233472 (100 %)

Wrote 233472 bytes at 0x0 in 20.6 seconds (90.9 kbit/s)...
Leaving...
```
USBシリアル変換モジュールも煌々と輝き出しました:heart_eyes:

<img width="600" alt="bord_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/f69c4d7d-856b-b81b-d846-581b810dd220.png">

## プログラムの実行確認

書き込んだプログラムが正しく動いているかどうかを確認します。
AWSを使って、ダミーのJSONを返すAPIを作っておきます。

```:ダミーJSON
{
    "foo": "esp8266",
    "baz": [
        1,
        50,
        219
    ],
    "empty": null
}
```

ジャンパーピンを「Flash Boot Mode(実行モード)」に差し替えて、電源を投入します。
すると

<img width="600" alt="cosole_y.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/040536b8-0508-d553-f874-24c217cec54b.png">

やりました！！:heart_eyes:

# まとめ

今回は、**ESP-WROOM-02**の準備から、Arduinoとしてプログラムを実行するまでを試してみました。一番ハマったところはプログラムの書き込みのところでした、
もっと手軽に試してみたい人は
[PIC32MX534F064H搭載 PIC CLICKERベースボード [CLICK-32MX]](http://www.microtechnica-shop.jp/shopdetail/000000000064/)
素敵なボードも購入できますので、こちらでも試してみてはいかがでしょうか。
次回は、myThingsのIDCFチャンネルとの連携の仕方などを試してみます。