ESP-WROOM-02を2台使って通信してみる(サーバー側の設定)

今回は「ESP-WROOM-02の配線をまとめてみる」「ESP-WROOM-02のボーレートを変更する」で配線と設定を行ったArduinoにつないだESP-WROOM-02を2台使って文字列の送受信を行わせてみます。

構成

無題のプレゼンテーション (1)

ESP-WROOM-02を1台はサーバー、もう1台をクライアントにして通信を行います。また、間にルーターを入れることで通信距離を稼ぎます。

 

サーバーの設定

今回は赤枠で囲ったサーバーの設定を行います。サーバーのスケッチには以下の3つの要素を設定する必要があります。

  1. 無線LANルーターのSSID
  2. 無線LANルーターのパスワード
  3. 通信に使うポート番号

今回使用するサーバー用のスケッチにこれらの設定を記述します。

ライブラリ

今回は以下のライブラリを使用します。

ライブラリ:An easy-to-use Arduino ESP8266 library besed on AT firmware.

スケッチ

サーバー用のスケッチは以下の通りです。クライアントから送られた文字列をそのままクライアントに送り返すという動作をします。

先に説明したサーバーの設定のための変更箇所は後で説明します。

#include "ESP8266.h"

#define SSID        "yourSSID"//今回はルーターのSSID
#define PASSWORD    "yourPASS"//ルーターのパスワード
#define BAUD_RATE   9600
#define HOST_PORT (8090)

SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 自分が使うピンに合わせて設定*/
ESP8266 wifi(mySerial);

void setupESP8266()
{
  while (1) {
    Serial.print("restaring esp8266...");
    if (wifi.restart()) {
      Serial.print("ok\r\n");
      break;
    }
    else {
      Serial.print("not ok...\r\n");
      Serial.print("Trying to kick...");
      while (1) {
        if (wifi.kick()) {
          Serial.print("ok\r\n");
          break;
        }
        else {
          Serial.print("not ok... Wait 5 sec and retry...\r\n");
          delay(5000);
        }
      }
    }
  }

  Serial.print("setup begin\r\n");
  Serial.print("FW Version:");
  Serial.println(wifi.getVersion().c_str());

  while (1) {
    if (wifi.setOprToStation()) {
      Serial.print("to station ok\r\n");
      break;
    }
    else {
      Serial.print("to station err\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }

  while (1) {
    if (wifi.joinAP(SSID, PASSWORD)) {
      Serial.print("Join AP success\r\n");
      break;
    }
    else {
      Serial.print("Join AP failure\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }
  Serial.print("setup end\r\n");
}

void setup(void)
{
  Serial.begin(BAUD_RATE);
  setupESP8266();
  
  if (wifi.enableMUX()) {
    Serial.print("multiple ok\r\n");
  } else {
    Serial.print("multiple err\r\n");
  }

  if (wifi.startTCPServer(HOST_PORT)) {
    Serial.print("start tcp server ok\r\n");
  } else {
    Serial.print("start tcp server err\r\n");
  }

  if (wifi.setTCPServerTimeout(600)) {
    Serial.print("set tcp server timout 10 seconds\r\n");
  } else {
    Serial.print("set tcp server timout err\r\n");
  }

  Serial.print("setup end\r\n");
}

void loop(void)
{
  uint8_t buffer[128] = {0};
  uint8_t mux_id;
  uint32_t len;
  len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
  if (len > 0) {
    Serial.print("Status:[");
    Serial.print(wifi.getIPStatus().c_str());
    Serial.println("]");

    Serial.print("Received from :");
    Serial.print(mux_id);
    Serial.print("[");
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    Serial.print("]\r\n");

    if (wifi.send(mux_id, buffer, len)) {
      delay(3000);
      Serial.print("send back ok\r\n");
    } else {
      delay(3000);
      Serial.print("send back err\r\n");
    }

    if (wifi.releaseTCP(mux_id)) {
      Serial.print("release tcp ");
      Serial.print(mux_id);
      Serial.println(" ok");
    } else {
      Serial.print("release tcp");
      Serial.print(mux_id);
      Serial.println(" err");
    }

    Serial.print("Status:[");
    Serial.print(wifi.getIPStatus().c_str());
    Serial.println("]");
  }
}

これが今回使用するスケッチの全体です。次に変更箇所について説明します。

 

スケッチ前半の#define部がサーバーの設定に対応しているので変更してください。

#include "ESP8266.h"

#define SSID        "yourSSID"//今回はルーターのSSID
#define PASSWORD    "yourPASS"//ルーターのパスワード
#define BAUD_RATE   9600
#define HOST_PORT (8090)

SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 自分が使うピンに合わせて設定*/
ESP8266 wifi(mySerial);

それぞれ

  1. SSID ->無線LANルーターのSSID
  2. PASSWORD -> 無線LANルーターのパスワード
  3. BAUD_RATE -> ボーレート(前回変更した9600に設定)
  4. HOST_PORT -> 使用するポート番号(今回は8090番に設定)

となっています。

関数の説明

ここからは使用している関数についてざっくりと説明していきます。

無線の接続を確立する関数

  • setupESP8266()関数:おまじないなのでいじらなくてもいいです。

文字列の送受信の際に使用する関数

  • wifi.recv()関数:TCP通信を使って文字列を受け取る関数です。
  • wifi.send()関数:TCP通信を使って文字列を送信する関数です。

(利用している変数)

  • buffer:受け取った文字列を格納する配列
  • len:bufferで受け取った文字列の長さ

うまく動作させるコツ

通信はArduinoの動作スピードに比べて重い処理なのでスピードを合わせてやらないと通信が不安定になることがあります。loop関数内に適切にdelayをかけてやることで通信が円滑に進みます。私はloop関数1回りする間に合計で10秒のdelayをかけています。

過去の記事でESP-WROOM-02の旧版であるESP8266を使って同じことをしているのでこちらも参考にしてみてください

次回

クライアント側のプログラムを組んでいきます。

装置の全体(詳しくは「ESP-WROOM-02の配線をまとめてみる」)

2017_3_11_

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top