ESP-WROOM-02で鉄道模型を遠隔制御（第３回）

#概要
　鉄道模型をマイコン制御してやろうと思われている皆さん、こんにちは。綾瀬です。ESP-WROOM-02を使って鉄道模型を制御してきたことをまとめていくシリーズの第３回の今回は、無線LANで接続したデバイス（タブレット端末やスマートフォンなど）から鉄道模型車両を遠隔制御するために、まずはESP-WROOM-02にWebAPIを実装するためのWebサーバを構築してみたいと思います。

　本シリーズの過去記事は以下を参照してください。
　[第１回](http://qiita.com/ayasehiro/items/8cab78a938299d5e6594)
　[第２回](http://qiita.com/ayasehiro/items/50394987324e63f665cd)

#構成

###ハードウェア構成
　今回は[第２回](http://qiita.com/ayasehiro/items/50394987324e63f665cd)で製作した構成をそのまま使います。

###ソフトウェア構成
　今回構築するソフトウェアの構成を簡単なイラストで示します。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/89137/60f6c3f6-a5e9-f597-ef8c-88f7a62d55de.png)

　第２回の記事で作成したのは、このイラストのPWM出力処理になります。今回は、このPWM出力処理を外部から制御するためにWebAPIを作成するための土台であるWebサーバを構築します。

#準備
　前回同様、ESP-WROOM-02をArduino化して使用します。そのため、[Arduino core for ESP8266](https://github.com/esp8266/Arduino)をあらかじめArduino IDEに組み込んでおきます。
　今回は、ESP-WROOM-02にWebサーバを構築するためにArduino core for ESP8266に含まれるライブラリ[ESP8266WebServer](https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer)を利用します。

#ソースコード
　ESP-WROOM-02において、WebサーバはESP8266WebServerライブラリを利用することで簡単に構築することができます。

```webserver_parts.ino
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80); //Webサーバの待ち受けポートを標準的な80番として定義します

/*---------------------------------------------------------------------------
//サーバリクエスト受信時の正常処理 ルート
---------------------------------------------------------------------------*/
void handleRoot() {
　//ルートにアクセスされた時の処理を書く。
  //ここではESP8266で応答していることと、ESP8266が接続しているアクセスポイントから取得したIPアドレスを返す。
  //DHCPでIPを取得している場合に便利。
  IPAddress myAddr = WiFi.localIP();  
  String mes = "hello from esp8266! IP address:" + String(myAddr[0]) + "." + String(myAddr[1]) +"." +  String(myAddr[2]) +"." +  String(myAddr[3]) + "\n";
  server.send(200, "text/plain", mes);
}
/*---------------------------------------------------------------------------
//サーバリクエスト受信時の正常処理 command.cgi
---------------------------------------------------------------------------*/
void handleCommand() {
　//ここにFlashAirのWebAPI:command.cgi?op=130または131の互換処理を書く
}
/*---------------------------------------------------------------------------
//サーバリクエスト受信時の異常処理
---------------------------------------------------------------------------*/
void handleNotFound(){
　//定義されたURI以外にアクセスされた場合の処理を書く
}
/*---------------------------------------------------------------------------
//初期化処理
---------------------------------------------------------------------------*/
void setup() {
  Serial.begin(115200);
  delay(10);

  //自分のSSIDとパスコードを設定する
　//mySSIDとmyPassは任意のものに書き換えること
  Serial.println("WiFi module setting... ");
  WiFi.softAP("mySSID", "myPass");
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());

  //アクセスポイント（myAPSSID）に接続する（20回接続要求して失敗したらエラー表示）
　//myAPSSIDとmyAPPassは自分の環境のものに書き換えること
  Serial.print("Connecting to ");
  WiFi.begin("myAPSSID", "myAPPass");
  int retry_sum = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    retry_sum++;
    if(retry_sum > 20) break;
  }
  if(WiFi.status() == WL_CONNECTED){
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else{
    Serial.println("WiFi not connected");
  }

  //Webサーバの設定を行い、サーバを起動する
  server.on("/", handleRoot);               //ルートに接続要求があった時の処理を指定
  server.on("/command.cgi", handleCommand); //command.cgiに接続要求があった時の処理を指定
  server.onNotFound(handleNotFound);        //設定外に接続要求があった時の処理を指定
  server.begin();                           //Webサーバを起動
  Serial.println("HTTP server started");
}
/*---------------------------------------------------------------------------
//本体処理
---------------------------------------------------------------------------*/
void loop() {
  server.handleClient(); //Webサーバの接続要求待ち
}
```

#まとめ
　以上の通り、ESP-WROOM-02をArduino化してESP8266WebServerライブラリを利用すると、簡単にWebサーバが構築できることがわかりました。

#次回予告
　次回は、今回作成したWebサーバに、WebAPIを実装します。
　WebAPIは、自作の鉄道模型遠隔制御用クライアントアプリのインターフェース共通化のため、FlashAirのWebAPI互換とします。
　FlashAirのAPIリファレンスは、[FlashAir Developers](https://flashair-developers.com/ja/documents/api/)で公開されています。今回、互換性を持たせるAPIは、command.cgi内の以下のAPIです。

- [共有メモリからのデータの取得 (op=130)](https://flashair-developers.com/ja/documents/api/commandcgi/#130)
- [共有メモリへのデータの書き込み (op=131)](https://flashair-developers.com/ja/documents/api/commandcgi/#131)

#参考資料

- [Arduino core for ESP8266](https://github.com/esp8266/Arduino)
- [ESP8266 Temperature / Humidity Webserver](https://learn.adafruit.com/esp8266-temperature-slash-humidity-webserver/)

#最後に宣伝
　今夜、印刷所に入稿します！事故がなければ、新刊出ますよ〜。

　コミックマーケット89において、ESP-WROOM-02とFlashAirの電子工作における比較記事を掲載した電子工作（と酒）の同人誌を頒布します。ESP-WROOM-02とFlashAirで比較製作したGゲージ鉄道模型車両の遠隔制御装置の回路図も掲載しています。冬コミにお越しの際は、ぜひお寄りください。また、冬コミ後には通販でも入手できると思います。
**12/31(木) ３日目 東メ－08a「空と月」**
![サ－クルカット.png](https://qiita-image-store.s3.amazonaws.com/0/89137/15a2c023-0a31-4688-69ec-69c9be008981.png)