ESP8266 (ESP-WROOM-02) のセットアップ・nodemcuのテスト

# ESP8266とは

![esp8266.jpg](https://qiita-image-store.s3.amazonaws.com/0/3985/25276eaf-8dc5-5375-2812-d177eb177738.jpeg)

昨年から話題になっている、技適マークを取得しているWifiモジュール。
詳しくは以下の記事が詳しい。

[技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)

自分の環境については、ホストマシンはMac Book Pro。Mac OS X El Capitanである。

# 用意するもの

秋月電子で手に入れる。

- [Wi-Fiモジュール ESP-WROOM-02 DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758/)
- [ブレッドボード](http://akizukidenshi.com/catalog/g/gP-00315/)
- [抵抗 10kΩ](http://akizukidenshi.com/catalog/g/gR-03399/)
- [ブレッドボード・ジャンパーコード(オス－オス) (10cm)20本セット](http://akizukidenshi.com/catalog/g/gC-05371/)

以下は千石電商で。

- [FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)](https://www.switch-science.com/catalog/1032/)

あとは、ハンダゴテとハンダが必要。

# ESP8266をブレッドボードで使えるようにする

DIPの部分をハンダ付けする

![esp8266.png](https://qiita-image-store.s3.amazonaws.com/0/3985/f5a1fbb8-a6ce-899d-36cc-56572f15e00e.png)

# ATコマンドを発行する動作チェック

## ESP8266や抵抗を繋いでいく

以下の記事を参考に抵抗とESP8266、及びUSBシリアル変換アダプターを繋いでみた。

[ESP-WROOM-02で抵抗けちって動かなかった件](http://qiita.com/shibatchii/items/930fcd90fded76866483)

![ESP8266___FT232RL_AT_Command_2.png](https://qiita-image-store.s3.amazonaws.com/0/3985/f6b551e4-3bfb-2e5a-420c-c360f3957d40.png)

|ESP 8266(ESP WROOM 02)のピン|接続先|
|:--------------------------|:----|
|3V3|3.3V|
|EN|3.3V(10kΩ抵抗を挟む)|
|IO15|GND(10kΩ抵抗を挟む)|
|IO2|3.3V(10kΩ抵抗を挟む)|
|IO0|3.3V(10kΩ抵抗を挟む)|
|RST|3.3V(10kΩ抵抗を挟む)|
|TXD|RX(USBシリアル変換アダプター)|
|RXD|TX(USBシリアル変換アダプター)|
|GND|GND(USBシリアル変換アダプター|

## USBシリアル変換アダプターのドライバインストール

スイッチサイエンスさんが示している[オフィシャルサイトよりドライバを落とす](http://www.ftdichip.com/Drivers/VCP.htm)。

![Screen Shot 2016-01-13 at 21.56.49.png](https://qiita-image-store.s3.amazonaws.com/0/3985/db2f0b21-8e72-f9f2-93dc-1fe432d98a87.png)

ドライバダウンロード後、ダウンロードしたパッケージをインストールする。

## Arduino IDEよりホストからESP8266に対しシリアル接続を試す

Arduino IDEを立ち上げる。マシンにインストールしていないひとは以下よりインストールする。

[Download the Arduino Software](https://www.arduino.cc/en/Main/Software)

![Screen Shot 2016-01-13 at 21.59.15.png](https://qiita-image-store.s3.amazonaws.com/0/3985/3346dbf2-21c1-1244-6802-fce8ebd8c876.png)

動作確認したArduino IDEのバージョンは1.6.7。

Toolsからポートを選択し、接続したESP8266(USBシリアル変換アダプタ)を選択する。

<img width="580" alt="Screen Shot 2016-01-13 at 22.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/3985/b85d8e83-a122-cc68-4415-e7f4dc2ddbc8.png">

その後、IDEの右上にあるアイコンを押して、シリアルモニタを表示する。

<img width="500" alt="IDE_SerialMonitor.png" src="https://qiita-image-store.s3.amazonaws.com/0/3985/4c4f065c-ca4e-849f-dea7-3b81718d697a.png">

シリアルモニタから、**AT**コマンドを実行する。

<img width="568" alt="AT_Command.png" src="https://qiita-image-store.s3.amazonaws.com/0/3985/1b424d91-0ae8-eade-6d25-1ab89969356b.png">

通った。ATコマンドではWifiの設定などが行える。

[ESP8266をUSB-TTLシリアル変換してWi-Fiを確認する](http://qiita.com/matobaa/items/f8787ca6a8daf45f299d)から。

# nodemcuを試す

[nodemcu](http://nodemcu.com/index_en.html)を入れて遊んでいる社員が居て、興味もったので入れてみる。
luaでロジックを書けるようになる。

## firmwareをビルドする。

[README.md](https://github.com/nodemcu/nodemcu-firmware#docker-containerised-build)の手順にある中で、docker containerを利用したファームウェアのビルド方法が書かれていたのでやってみた。

### Docker toolboxをダウンロード

する。自分の環境はMac OS Xである。

[Docker Toolbox](https://www.docker.com/docker-toolbox)

### Docker Quick Start Terminalを立ち上げる

![Screen Shot 2016-01-16 at 04.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/3985/4779d277-0c87-c2da-913c-e2038c24649c.png)

### Docker machine (default)を立ち上げる

```
> docker-machine start default
```

### docker daemonとの接続を可能にするため、以下のコマンドを実行する

自分は$SHELLに[fish shell](http://fishshell.com/)を利用しているので、以下のコマンドを実行する

```
> eval (docker-machine env default)
```

bashとかなら以下。

```
> eval "$(docker-machine env default)"
```

### nodemcu-firmwareのリポジトリをclone

する。

```
> mkdir ~/Sandbox
> cd ~/Sandbox
> git clone https://github.com/nodemcu/nodemcu-firmware.git
```

### Docker containerを利用してビルドする

README.mdにリンクが貼られている[コンテナページ](https://hub.docker.com/r/marcelstoer/nodemcu-build/)に記載されているコマンドを実行してビルドを行う。

```
> cd ~/Sandbox/nodemcu-firmware
> docker run --rm -ti -v (pwd):/opt/nodemcu-firmware marcelstoer/nodemcu-build
```

### ビルドされたバイナリをESP 8266へ

#### ブレッドボード上の一部配線を変更する。

![esp8266_write_mode.png](https://qiita-image-store.s3.amazonaws.com/0/3985/d316c8d7-4d56-7956-9b54-4d5547dd0210.png)

|ESP 8266(ESP WROOM 02)のピン|接続先|
|:--------------------------|:----|
|3V3|3.3V|
|EN|3.3V(10kΩ抵抗を挟む)|
|IO15|GND(10kΩ抵抗を挟む)|
|IO2|3.3V(10kΩ抵抗を挟む)|
|IO0|GND|
|RST|3.3V(10kΩ抵抗を挟む)|
|TXD|RX(USBシリアル変換アダプター)|
|RXD|TX(USBシリアル変換アダプター)|
|GND|GND(USBシリアル変換アダプター|

#### esptoolをインストールする

[esptool](https://github.com/themadinventor/esptool)を利用し、USBシリアル変換アダプタ経由でESP 8266のFlashにバイナリを転送する。
pyenvを利用し、pythonの環境を構築するところから。

```
> brew install pyenv
> pyenv install 2.7.11
> pyenv rehash
> pyenv global 2.7.11
> cd ~/Sandbox
> git clone https://github.com/themadinventor/esptool.git
> cd esptool
> python setup.py install
> pyenv rehash
```

esptoolを利用し、ビルドしたバイナリをFlashに書き込む。
[Getting Started on OSX](https://github.com/nodemcu/nodemcu-devkit/wiki/Getting-Started-on-OSX)を参考にした。

ttyとして設定するUSBシリアル変換アダプタは環境によって異なる(はず)。

```
> cd ~/Sandbox/nodemcu-firmware/bin
> sudo esptool.py --port=/dev/tty.usbserial-AI02RJQZ write_flash 0x00000 nodemcu_float_master_20160115-1942.bin
Connecting...
Erasing flash...
Took 2.44s to erase flash block
Wrote 530432 bytes at 0x00000000 in 57.8 seconds (73.4 kbit/s)...

Leaving...
```

### nodemcuを試す

ブレッドボードの接続状態を切り替え、
Flashに書き込んだnodemcuを立ち上げる状態にする

![ESP8266___FT232RL_AT_Command_2.png](https://qiita-image-store.s3.amazonaws.com/0/3985/f6b551e4-3bfb-2e5a-420c-c360f3957d40.png)

|ESP 8266(ESP WROOM 02)のピン|接続先|
|:--------------------------|:----|
|3V3|3.3V|
|EN|3.3V(10kΩ抵抗を挟む)|
|IO15|GND(10kΩ抵抗を挟む)|
|IO2|3.3V(10kΩ抵抗を挟む)|
|IO0|3.3V(10kΩ抵抗を挟む)|
|RST|3.3V(10kΩ抵抗を挟む)|
|TXD|RX(USBシリアル変換アダプター)|
|RXD|TX(USBシリアル変換アダプター)|
|GND|GND(USBシリアル変換アダプター|

変更後、screenでシリアル接続する。

```
> screen /dev/tty.usbserial-AI02RJQZ 9600
NodeMCU 1.4.0 build 20151006 powered by Lua 5.1.4 on SDK 1.4.0
lua: cannot open init.lua
> 
```

起動した！起動しないままの場合は、RSTをGNDに接続して、リセットしてあげると良い。

#### luaコマンドを実行する

[NodeMCU API Instruction](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en)を見つつ。

```
> print("hello world")
hello world
> print(wifi.sta.getmac())
XX:XX:XX:XX:XX:XX
> wifi.setmode(wifi.STATION)
> wifi.sta.config("SSID", "pass")
> ip = wifi.sta.getip()
> print(ip)
192.168.10.16
```

インターネッツにも繋がる。

ファームについて[MQTTのモジュール](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#mqtt-module)などもある。
今後そっちもいじっていく。