ESP-WROOM-02でWeb Serverを動かす


# はじめに

Arduinoを触るようになって、低コストでネット接続する環境を模索しています。
先日、980円のBLEモジュール[koshian](http://www.m-pression.com/ja/solutions/boards/koshian)で[ピッコロボを動かすデモを公開](https://www.facebook.com/snumano/videos/vb.607758985/10154086683548986/?type=2&theater)しましたが、900円を切るWiFiモジュールESP-WROOM-02が日本で販売されたので試してみました。
ネット上の情報を参考にしましたが、情報が断片的だったのでまとめてみました。(特に、配線や電源の扱いについては自分に知識がないので参考にさせていただきましたが、前提条件が少し変わるだけでも、分からなくなるので苦労しました)


# ESP-WROOM-02とは?

> ＥＳＰ８２６６ＥＸ（ＳｏＣ、３２ｂｉｔ　ＭＣＵ）を搭載したＷｉＦｉモジュールです。 ＳＰＩ、ＵＡＲＴ、Ｉ２Ｃ、Ｉ２Ｓ、ＩｒＤＡ、ＰＷＭ、ＧＰＩＯ、ＳＤＩＯ、１０ビットＡＤコンバータなど、多彩なインターフェースが内蔵されています。ＴＣＰ、ＵＤＰをサポートしています。
> [秋月電子通商](http://akizukidenshi.com/catalog/g/gM-09607/)

要は、Arduino IDEでSketchを書き込めるWiFiモジュールです。
技適付きなので、日本でも安心して使えます。
CEREVOで販売している[約900円のピッチ変換のブレークアウトボード付き](http://cerevo.shop-pro.jp/?pid=91592223)がおすすめです。

![91592223.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/a5917464-0d00-ca26-6620-6684f7011b69.jpeg "91592223.jpg")

# 環境

* MacBookAir & MacOSX 10.10
* [Arduino v1.6.5](https://www.arduino.cc/en/Main/Software)
* [ESP-WROOM-02](http://cerevo.shop-pro.jp/?pid=91592223)
* [FT232RL](http://www.amazon.co.jp/dp/B00HSX3GT4)


# 配線
## 必要な部品と配線

こちらを参考にしました。
[ESP-WROOM-02を動かしてみた](http://qiita.com/hnw/items/3869f435405054511fda)

USBシリアル変換にFT232RLを利用しているのですが、FT232RLの3.3V電源をそのまま使うと電流値が低いようで安定給電のため三端子レギュレータを使うのがポイントのようです。(ここでハマりました。必要な電流値が得られれば外部電源も可、実際に後で乾電池でも動作確認しました。)

## 回路

手元のブレッドボードを使った配線は下記の通りです。

![IMG_5226.JPG](https://qiita-image-store.s3.amazonaws.com/0/4779/fff2c6c3-cd85-c03a-9924-2110791b2bd2.jpeg "IMG_5226.JPG")


# Arduino IDEからSketchを書き込む

## Arduino IDEをinstall

[こちら](https://www.arduino.cc/en/Main/Software)からinstallします。
MacOSX版のv1.6.5をinstallしました。

## VCP driverをinstall

FT232RLを認識できるようにVCP driverをinstallします。
今回は、[こちら](http://www.ftdichip.com/Drivers/VCP.htm)から、MacOS10.10用driverをinstallしました。

## Arduinoで使えるようにする

ESP-WROOM-02のWiFiモジュールであるESP8266をArduinoのボードマネージャで登録します。下記の「3.Arduino IDEのボードマネージャーにESP8266をインストール」を参考に設定します。
[WROOM(ESP8266)単体にArduinoスケッチを書き込み、スマホブラウザとWi-Fiストリーミング通信](http://mgotec.blog.fc2.com/blog-entry-50.html)

最後に、Arduino IDEの[ツール]-[ボード]にて「Generic ESP8266 Module」を、[ツール]-[ポート]にて、[/dev/cu.usbserial-*]を選択できる事を確認します。

![arduino_dev_cu_usbserial-A50285BI.png](https://qiita-image-store.s3.amazonaws.com/0/4779/a253f165-3314-ddc7-d8fc-3908f08e8a77.png "arduino_dev_cu_usbserial-A50285BI.png")

## Sketchをinstall

動作確認のため、空のSketchを書き込んでみます。

1. まずは、Sketch書き込み可能にするために、ESP-WROOM-02のJP1のジャンパーピンをD側に接続します。 
![IMG_5227.png](https://qiita-image-store.s3.amazonaws.com/0/4779/c5a02848-ab65-1312-10ce-21224145a44f.png "IMG_5227.png")

2. Arduino IDEにて[ファイル]-[新規ファイル]で、空のSketchを用意します。
3. [スケッチ]-[検証・コンパイル]実行後、[スケッチ]-[マイコンボードに書き込む]を実行し、下記のように書き込み完了を確認します。

![Arduino_upload.png](https://qiita-image-store.s3.amazonaws.com/0/4779/60b5deaa-44af-9e53-9616-f3f7868c0cff.png "Arduino_upload.png")


これで、ESP-WROOM-02が、Arduinoと同様にプログラム書き込みできるようになりました。
[スペックシート](http://akizukidenshi.com/download/ds/espressifsystems/0C-ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.3.pdf)をみると、前述のようにいろいろな通信プロトコルを扱えます。GPIOの数は、少ないですがUARTやI2Cを使う事で、各種センサーや他ICとの連携ができます。わくわくしますね。

# ATコマンド

それでは、いよいよ、ESP-WROOM-02を自宅のWiFiに接続します。Wifiに接続できないと、ただの安いArduino互換ですからね。

再び下記の「動作確認」以下を参考に、Arduinoでシリアモニタを起動し、ATコマンドを入力します。
[ESP-WROOM-02を動かしてみた](http://qiita.com/hnw/items/3869f435405054511fda)

、、、が、反応がない。ATを入力しても、OKがでてこない。。。

![Arduino-AT1.png](https://qiita-image-store.s3.amazonaws.com/0/4779/53e52607-18b7-d5ac-c8aa-83640220715f.png "Arduino-AT1.png")

![Arduino-AT2.png](https://qiita-image-store.s3.amazonaws.com/0/4779/acd15b9e-1eb3-f065-64d5-90e5956d05f9.png "Arduino-AT2.png")


## ATコマンド反応ない場合の対応

仕方ないので、ESP firmwareの上書き方法を探します。Macのpython環境で試してみたところ、動作しないので、下記を参考にWindows環境で試しました。
[ESP-WROOM-02を使ってみる2　-外付けSPIフラッシュの書き換え-](http://nemuisan.blog.bai.ne.jp/?cid=8886)

Flash download toolは[v1.2](http://bbs.espressif.com/viewtopic.php?f=5&t=433)を使用します。
Firmwareは[esp_iot_sdk v1.3](http://espressif.com/new-sdk-release/)を使用します。

下記を参考に、「blank.bin, boot_v1.4(b1).bin, user1.1024.new.2.bin, esp_init_date_default.bin」にチェックを付け、書き込みます。
[ESP-WROOM-02を使ってみる2　-外付けSPIフラッシュの書き換え-](http://nemuisan.blog.bai.ne.jp/?cid=8886)

firmwareを書き込む際にも、上述の通り、ESP-WROOM-02のJP1のジャンパーピンはD側に接続します。 

### 注意事項
* esp_init_date_default.binを上書きすると、MACアドレスも変わってしまします。現状の値をメモしておいて、後でAT+CIPSTAMAC、AT+CIPSAPMACコマンドで再度元の値に上書きしてください。
* MACアドレスの上書きがいやなら、最低限必要なboot_v1.4(b1).bin, user1.1024.new.2.binだけ書き込むのもありです。

## ATコマンドで自宅WiFiに接続

それでは再度ATコマンドを入力してみます。
注意事項として、ATコマンド入力の際は、ESP-WROOM-02のJP1のジャンパーピンはB側に接続した上で、電源接続する必要があるようです。 

![IMG_5228.png](https://qiita-image-store.s3.amazonaws.com/0/4779/bbd80483-8b70-3c11-d751-d49c7e621081.png "IMG_5228.png")


下記のATコマンド入力例を参考に、入力します。
[ESP-WROOM-02を動かしてみた](http://qiita.com/hnw/items/3869f435405054511fda)

WiFiのAPにてMACアドレス制御をしていれば、`AT+CIPSTAMAC?`にて確認したMACアドレスを許可対象として登録します。
`AT+CWJAP=”SSID”,”Password"`にて、WiFi接続します。その後`AT+CIPSTA?`にて、IPが割り当てられた事を確認します。

![arduino-console.png](https://qiita-image-store.s3.amazonaws.com/0/4779/0a590536-7357-43ab-f79c-97cd339c4c60.png "arduino-console.png")

# Web Serverを動かす

再び、ESP-WROOM-02のJP1のジャンパーピンをD側に接続します。 
Arduino IDEにて[ファイル]-[スケッチの例]-[ESP8266WebServer]-[AdvancedWebServer]を起動します。
下記2行を、自分の環境にあわせて変更します。

```
const char *ssid = "********";
const char *password = "********";

```

上記変更後、[スケッチ]-[検証・コンパイル]実行後、[スケッチ]-[マイコンボードに書き込む]を実行し、書き込み完了を確認します。
ESP-WROOM-02のJP1のジャンパーピンをB側に接続し、電源を入れ直します。
先に確認したIPにブラウザでアクセスします。

![browser.png](https://qiita-image-store.s3.amazonaws.com/0/4779/ec5727a1-e6ed-b26b-6d69-197ff9a19bd8.png "browser.png")


# ESP-WROOM-02単体でWeb Serverを動かす

ESP-WROOM-02にSketch(プログラム)を書き込んだので、単体で動かしてみました。
下記写真のように接続しているのは乾電池のみ。
この小ささでWiFiでネット接続し、内部でWeb Serverが動作している事が確認できました。

![11938865_10154205808538986_717865293_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/c0be333f-fffa-72f6-7e5b-a748b6bfba64.jpeg "11938865_10154205808538986_717865293_n.jpg")

# まとめ

koshianも、JSで操作できて便利だなと思っていましたが、Arduino IDEでSketch書くことができるESP-WROOM-02はさらに便利です。(Arduinoの方が参考にできる情報が多いってだけですが)

今後の課題は下記の通りです。

* ESP-WROOM-02にセンサーを接続し、値をクラウド側に渡してみます。
	* まずは、[IFTTT](https://ifttt.com/maker)で、その次に[myThings](http://mythings.yahoo.co.jp/)でって感じで。

* もちろん、ロボのコントロールもESP-WROOM-02で。
	* ロボ側のマイコンかサーボコントローラと、UARTかI2Cで通信する感じかな。