2017年1月29日日曜日

ESP-WROOM-02 を Arduino 化して Wifi に接続してみる

概要

前回 WROOM が Mac で動作するところまで実施しました
今回は Arduino IDE で Wifi に接続するスケッチを作成して WROOM に書き込み実際に Wifi に接続するところまで確認してみます
また、この作業を実施すると WROOM が Arduino 化され前回実施した AT コマンドでの操作ができなくなるので注意してください

環境

Arduino core for ESP8266 のインストール

まずは Arduino IDE に ESP8266 を開発するためのボードタイプを追加します

Arduino -> Preferences -> Settings -> Additional Boards Manager URLs

に以下を記載します

http://arduino.esp8266.com/stable/package_esp8266com_index.json

OK で追加した

ツール -> マイコンボード -> ボードマネージャー

から esp8266 で検索して新規のボードタイプをインストールします
wroom_con_wifi_install_esp8266_board.png

インストールボタンをクリックするとダウンロードが始まります
プログレスバーが 100% になりダウンロードが完了すればインストール完了です

Arduino core for ESP8266 の設定

各種設定していきます
「ツール」から以下のように設定しましょう

wroom_con_wifi_settings_esp8266.png

  • マイコンボード -> Generic ESP8266 Module
  • Flash Mode -> QIO
  • Flash Frequency -> 80MHz
  • Upload Using -> Serial
  • CPU Frequency -> 160MHz
  • Flash Size -> 4M (3M SPIFFS)
  • Debug port -> Disabled
  • Debug Level -> None
  • Reset Method -> nodemcu
  • Upload Speed -> 115200
  • シリアルポート -> それぞれの環境に合わせてポートを選択してください
  • 書き込み装置 -> USBasp

を設定しました
細かい設定の意味までは確認できていませんが、とりあえず上記の設定で普通の Arduino スケッチを書き込むように WROOM にスケッチを書き込むことができるのを確認しています

スケッチの作成

Arduino IDE の設定ができたらスケッチを作成しましょう
全体は以下の通りです

#include <Arduino.h>
#include <ESP8266WiFi.h>

const char* ssid = "Please input your SSID";
const char* password = "Please input your SSID's password";

boolean continuousResponseFlag = true;

WiFiServer server(80);
WiFiClient client;

void responseHTML() {
  client = server.available();
  delay(1);
  String req;

  while (client) {
    if (client.available()) {
      req = client.readStringUntil('\n');
      Serial.println(req);
      if (req.indexOf("GET / HTTP") != -1) {
        Serial.println("-----from Browser FirstTime HTTP Request---------");
        Serial.println(req);
        while (req.indexOf("\r") != 0) {
          req = client.readStringUntil('\n');
          Serial.println(req);
        }
        req = "";
        delay(10);

        // Headers
        client.print(F("HTTP/1.1 200 OK\r\n"));
        client.print(F("Content-Type:text/html\r\n"));
        client.print(F("Connection:close\r\n\r\n"));
        // Body
        client.println(F("<!DOCTYPE html>"));
        client.println(F("<html>"));
        client.println(F("<font size=30>"));
        client.println(F("Hello World"));
        client.println(F("</html>\r\n"));

        delay(1);
        client.stop();

        Serial.println("\nGET HTTP client stop--------------------");
        req = "";
        continuousResponseFlag = true;
      }
    }
  }
}

void setup() {
  Serial.begin(115200);
  // Connect to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  if (continuousResponseFlag == true) {
      responseHTML();
  } else if (client.available()) {
    Serial.print(client.read());
  }
  delay(1);
}

スケッチを作成したら検証が成功するか確認しましょう

ポイント説明

setup() で指定した SSID への Wifi 接続を試みます
接続が成功すると取得できた IP アドレスをシリアルモニタに出力します
指定した SSID やパスワードが間違っている場合はここで IP が表示されないので、SSID やパスワードがあっているかと、Wifi ルータの設定があっているかなど確認してください

loop() でメインの処理を実行します
loop()responseHTML メソッドを呼び続けます
responseHTML はレスポンス用のクライアントオブジェクトを生成し HTTP のヘッダとボディを生成してレスポンスを返却します

今回は GET / HTTP で GET アクセスのみレスポンスを返却するようにしています
GET リクエストがきたら、リクエスト情報をシリアルに 1 行ずつ出力し、その後 client.print でヘッダ情報とボディ情報を返却します

1 リクエストごとにレスポンス用のクライアントオブジェクトは stop され、すぐに次のクライアントオブジェクトが生成されます

動作確認

検証が成功したら WROOM にアプリを書き込みます
書き込みは普通の Arduino スケッチと同じような書き込みます
シリアルモニタを起動しておきましょう

書き込み中は WROOM の TX と RX 用の LED が点滅します
点滅が終了しシリアルモニタに WROOM が取得した IP アドレスが表示されれば OK です
wroom_con_wifi_get_ip.png

今回は WROOM にアクセスすると HTML を返却するようなアプリにしたので実際にブラウザでアクセスしてみましょう
wroom_con_wifi_responsing.png

こんな感じで「Hello World」が表示されば OK です
もちろんブラウザではなく curl コマンドなどでも OK です
シリアルモニタには以下のように表示されていると思います
wroom_con_wifi_debug_response.png

最後に

ESP-WROOM-02 を Arduino 化してスケッチを作成し、そのスケッチを書き込むことで Wifi につながるところまで確認しました
あとは開発ボード上のピン情報を使って、センサなどと連携し、データが取得できたらクラウドに保存するなどができるといいなと思っています

あと、今回の作業をすると AT コマンドが使えなくなると記載しました
確かに起動すると Arduino スケッチが自動で起動してしまうので、シリアルモニタで AT コマンドは実行できなくなります
AT コマンドでも Wifi の設定などを WROOM に書き込めるので頑張ればできますが、プログラマブルに WROOM を操作できたほうが断然楽だし応用が効くので Arduino 化することをオススメします

Arduino 化を解除して出荷時の状態に戻すことってできるのだろうか・・・

Tips

ハマった点があるので紹介します

  • ESP-WROOM-02 を Mac の USB ポートに接続してもシリアルポートとして認識しない

原因は不明ですが接続しても /dev/cu.usbserial-DA01OF0S が現れずハマリました
解決できた方法は Mac の再起動だけでした
とりあえず発生したら再起動してみてください
なおシリアルポートとして認識していなくても WROOM 自体に書き込んだスケッチは問題なく動作していることは確認しました

参考サイト

0 件のコメント:

コメントを投稿