ESP-WROOM-02を2台使って通信してみる(クライアント側の設定)

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

 

前回の記事「ESP-WROOM-02を2台使って通信してみる(サーバーの設定)」の続きとなっています。

 

構成

titi

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

 

クライアントの設定

今回は赤枠で囲ったクライアントの設定を行います。クライアントのスケッチには以下の4つの要素を設定する必要があります。

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

今回使用するクライアント用のスケッチにこれらの設定を記述します。

ライブラリ

前回と同じ以下のライブラリを使用します。

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

スケッチ

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

先に説明したクライアントの設定のための変更箇所は後で説明します。

#include "ESP8266.h"
#include <SoftwareSerial.h>

#define SSID        "yourSSID"//使用する無線ルーターのSSID
#define PASSWORD    "yourPASS"//ルーターのパスワード
#define HOST_NAME   "192.168.X.XXX"//サーバーの役割をしているESP-WROOM-02のIPアドレス
#define HOST_PORT   (8090)
#define BAUD_RATE   9600

SoftwareSerial mySerial(2, 3); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial,BAUD_RATE);

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");
  }

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

void loop(void)
{
  uint8_t buffer[128] = {0};
  static uint8_t mux_id = 0;

  if (wifi.createTCP(mux_id, HOST_NAME, HOST_PORT)) {
    Serial.print("create tcp ");
    Serial.print(mux_id);
    Serial.println(" ok");
  } else {
    Serial.print("create tcp ");
    Serial.print(mux_id);
    Serial.println(" err");
  }


  char *hello = "Hello, this is client!";
  if (wifi.send(mux_id, (const uint8_t*)hello, strlen(hello))) {
    delay(1000);
    Serial.println("send ok");
  } else {
    delay(1000);
    Serial.println("send err");
  }

  uint32_t len = wifi.recv(mux_id, buffer, sizeof(buffer), 10000);
  if (len > 0) {
    Serial.print("Received:[");
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    Serial.print("]\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");
  }

  delay(3000);
  mux_id++;
  if (mux_id >= 1) {
    mux_id = 0;
  }
}

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

 

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

#define SSID        "yourSSID"//使用する無線ルーターのSSID
#define PASSWORD    "yourPASS"//ルーターのパスワード
#define HOST_NAME   "192.168.X.XXX"//サーバーの役割をしているESP-WROOM-02のIPアドレス
#define HOST_PORT   (8090)
#define BAUD_RATE   9600

SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial,BAUD_RATE);

それぞれ

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

となっています。

 


 

ここでサーバーの設定では出てこなかったHOST_NAMEのパラメータについて説明します。今回は無線ルーターを介して通信するつもりなので、無線ルーターのIP割り振り機能を使って使用するESP-WROOM-02それぞれにIPアドレスを割り振ります。

このときサーバー役、クライアント役両方のESP-WROOM-02にIPアドレスを割り振るのですが、クライアントからサーバーに通信する際にはどのサーバーにアクセスするか明示しないといけないのでサーバーのIPアドレスが必要になります。(逆に言うとサーバーは自分にめがけてやってきたクライアントの処理をするだけなのでIPアドレスは必要ないみたいです)


 

関数の説明

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

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

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

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

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

(利用している変数)

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

うまく動作させるコツ

サーバー編でも説明しましたが、通信という処理はArduinoにとって重いものです。なので送信、受信の処理の後には数秒のdelayをかけてスピード調整を行うことが肝心です。通信を滑らかに行い、かつ1ループにかかる時間を最小限にする調整が腕の見せ所となりそうですね。

次回

ESP-WROOM-02を中継する無線ルーターの設定について軽く触れたいと思います。

装置の全体(詳しくは「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