ESP8266 を CUI で開発する

本エントリーは ESP8266 アドベントカレンダー2015 の一日目の記事です。というわけで一日目らしく ESP8266 についてのまとめ記事を書こうと思ったのですが、

- [ESP8266(ESP-WROOM-02)自分的まとめ](http://mactkg.hateblo.jp/entry/esp-wroom-02/summary)

にしっかりとまとめられていたので、↑を読んで下さい。= 完 =

![20151128-DSC04654.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/da988797-9416-5e19-7bb9-6c61e587be02.jpeg "20151128-DSC04654.jpg")


だけではさすがにアレなので最低限のまとめを。ESP8266 は WiFi 機能を内蔵した SoC で、[Arduino 環境で開発する](https://github.com/esp8266/Arduino)ことができます。

またスペック(ESP-WROOM-02 の場合)もCPUクロックが80Mhz, フラッシュメモリがハードウエア上は 4M で RAM が 36KB とそれなりに高スペックのため、[Lua(NodeMCU)](http://nodemcu.com/index_en.html) や組み込み用 Python の [MicroPython](https://learn.adafruit.com/building-and-running-micropython-on-the-esp8266/overview) や [JavaScript](https://github.com/cesanta/smart.js) などいろいろな言語で動くような開発が進んでいます。(mruby を動かすには RAM がﾁｮｯﾄｷﾋﾞｼｲ…。)

そして特筆すべきはお値段。技適取得済みで日本で問題なく使える、ESP8266 を使ったモジュール ESP-WROOM-02 が[1個550円！なお10個買えば一個450円！](http://akizukidenshi.com/catalog/g/gM-09607/)という大変お安い価格なので大人気なのです。

また人気ということで、ネット上に様々なライブラリや情報が溢れているため、いろいろな情報を探しやすいという所も利点でしょう。

# ESP-WROOM-02 を動かすまで

しかしながら、ESP-WROOM-02 を動かすまでには、以下のことを考慮する必要があり、電子工作に慣れている人ならなんてこと無いんですが、そうで無い人にとっては割と大変。

- そのままブレッドボードにさして使うことが出来ないので、ピッチ変換基板への取り付けが必要
- 自分でシリアルUSB変換機からROMを書き込む必要がある
- 電源が 3.3V のため USB (5V)から電源をとると降圧が必要。また WiFi 通信時に一時的に電力消費が上がるため、適当に 3.3V 持ってくると動かなかったり不安定になる
- 起動時のモードが二つあり、どちらのモードにしたいかをピンを繋いだりショートさせる必要がある

ESP-WROOM-02 を買ってみたけど動かすまで一苦労した人も多いのでは無いでしょうか。私もそんな一人でした。

## ESP-WROOM-02開発ボードの登場

そんなめんどくささを全部取っ払った物が、スイッチサイエンスから先日発売になった、ESP-WROOM-02開発ボードです。

- https://www.switch-science.com/catalog/2500/

お値段は 2160 円と、モジュール単体の 500 円前後の価格と比べると高いですが、それでも純正 Arduino に比べたら安いですし、USB に刺せば即座に開発できるお手軽さは非常に便利です。こちらのボードでまず開発になれてから、モジュール単体を使った方が良いでしょう。

欲を言えば別途ピンヘッダを購入しハンダ付けが必要なので、そこも最初から実装されているとハンダ付け無しで開発できるので、さらに開発の敷居が下がりますね。

# CUI で開発する

やっと本題です。ESP8266 は [Arduino IDE から開発が出来る](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)のですが、ちょこっとめんどくさいです。しかしながら [PlatformIO](http://platformio.org/) を使うことで CUI から簡単に開発を行うことができます。

## PlatformIO とは

PlatformIO とは、様々な開発のツールチェインを抽象化し、コマンドラインから同一の手法で開発が行える、組み込み開発用のツールです。さらにライブラリマネージャーも独自に持っているのでライブラリの管理にも便利。

セットアップも python のライブラリマネージャの pip から簡単に行えます。

```
# 必要に応じて sudo で入れてください
$ pip install -U pip setuptools
$ pip install -U platformio
```

対応ボード一覧を見てみましょう。

```bash
$ platformio boards |grep ESP8266
...
esp_wroom_02          esp8266        80Mhz     4096kB  50kB   ESP-WROOM-02
espduino              esp8266        80Mhz     4096kB  80kB   ESPDuino (ESP-13 Module)
espino                esp8266        80Mhz     4096kB  80kB   ESPino
espresso_lite_v1      esp8266        80Mhz     4096kB  80kB   ESPresso Lite 1.0
...
```

WROOM-02 の esp_wroom_02 を選んでプロジェクトを生成します。なお、対応ボードに出てこない人は、platformio を最新版にしてみてください。

```
$ mkdir wroom02test
$ cd wroom02test
# 全部 y で答える
$ yes y|platformio init -b esp_wroom_02
$ tree .
.
├── lib
│   └── readme.txt
├── platformio.ini
└── src
```

さてこれで準備完了です。src 以下に適当に Arduino 開発でおなじみの ino ファイルを作りLチカしてみましょう。

```cpp
// src/test.ino

#define LED_PIN 13

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}
```

こちらのファイルをコンパイルして WROOM-02 に書き込んでみます。ESP-WROOM-02開発ボードを USB に繋いだ状態でコンパイル&転送します。なお一回目の実行では、ESP8266 関係の開発に必要なツールチェイン一式が自動でインストールされるため、もうちょっと時間がかかると思います。

```
$ platformio run
...
// それなりにプログラムのサイズがあるので転送に時間がかかる
=== [SUCCESS] Took 26.63 seconds ===
```

はいLチカできましたね！ふつうの Arduino っぽい開発はこれで行えるでしょう。

![20151128-DSC04651.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/cb5e8fa5-f16e-8c1d-3a77-eb6c0597e374.jpeg "20151128-DSC04651.jpg")

# WiFi に繋いで http get してみる

続いて WiFi のアクセスポイントに繋いで、http を叩いてみましょう。Arduino 互換 API を持ってるので、Arduino ライブラリがすんなり動く事が多いです。

```bash
$ platormio lib search HttpClient
Found 3 libraries:

[ ID  ] Name             Compatibility         "Authors": Description
--------------------------------------------------------------------------------------------------------------
[ 46  ] HttpClient       energia, timsp430, titiva "Zack Lalanne": HttpClient is a library to make it easier to interact with web servers
[ 66  ] HttpClient       arduino, atmelavr     "Adrian McEwen": HttpClient is a library to make it easier to interact with web servers
[ 65  ] WiFlyHQ          arduino, atmelavr     "Harlequin": The library provides functions for setting up and managing the WiFly module (Roving Networks WiFly RN-XV), sending UDP packets, opening TCP connections and sending and receiving data over the TCP connection
```

このなかで ID 66 の HttpClient を今回は使います。

```
$ platformio lib install 66
```

これで HttpClient を使う準備が出来ました。

以下のコードは WiFi に繋いで、HttpClient 経由で example.com を叩いて結果をシリアルコンソールに表示するサンプルコードです。

```cpp

#include <ESP8266WiFi.h>
#include <HttpClient.h>

const char ssid[] = "XXX";
const char passwd[] = "YYY";

bool connected() {
  return WiFi.status() == WL_CONNECTED;
}

void waitConnect() {
  Serial.println("now waiting");
  while(!connected()) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("connected!");
  WiFi.printDiag(Serial);
  Serial.print("IPAddress: ");
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, passwd);
  waitConnect();

  WiFiClient wifiClient;
  HttpClient http(wifiClient);
  bool err = http.get("www.example.com", "/");
  delay(1000);
  if (!err) {
    char c;
    while (http.connected() || http.available() ) {
      c = http.read();
      Serial.print(c);
    }
  }
}

void loop() {
}

```

これを platformio run で実行し、シリアルモニターで見てみましょう。

```
$ platformio run && platformio serialports monitor
...
--- Miniterm on /dev/cu.usbserial-DA01219J: 9600,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
...connected!
Mode: STA
PHY mode: N
Channel: 9
AP id: 0
Status: 5
...
    <h1>Example Domain</h1>
...
</html>
```

簡単に繋がりましたね!

## まとめ

ESP8266 を使うと、WiFi に繋がる開発が安価に出来、PlatformIO を使うとコマンドラインからサクサクと開発していくことが可能です。また最近ではESP-WROOM-02開発ボードの登場により、さらに入門しやすくなりました。

冒頭で触れたとおり、Arduino 互換 API を使う意外にも Lua などの言語で開発を行ったり、WiFi のアクセスポイントとなって振る舞ったり、OTA アップデートをかけつつ開発したりと、様々なことが出来るでしょう。

また、PlatformIO を使うことで ESP8266 も CUI から簡単に開発を行うことができるため、CUI が好きなら利用してみましょう。

本エントリーが ESP8266 の入門のきっかけになれば幸いです。