Help us understand the problem. What is going on with this article?

ESP-WROOM-02で鉄道模型を遠隔制御(第3回)

More than 5 years have passed since last update.

概要

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

 本シリーズの過去記事は以下を参照してください。
 第1回
 第2回

構成

ハードウェア構成

 今回は第2回で製作した構成をそのまま使います。

ソフトウェア構成

 今回構築するソフトウェアの構成を簡単なイラストで示します。
image1.png

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

準備

 前回同様、ESP-WROOM-02をArduino化して使用します。そのため、Arduino core for ESP8266をあらかじめArduino IDEに組み込んでおきます。
 今回は、ESP-WROOM-02にWebサーバを構築するためにArduino core for ESP8266に含まれるライブラリ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で公開されています。今回、互換性を持たせるAPIは、command.cgi内の以下のAPIです。

参考資料

最後に宣伝

 今夜、印刷所に入稿します!事故がなければ、新刊出ますよ〜。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away