ESP8266の起動時に”to station err”が出るときの対策

esp8266で無線LANルーターに接続しようと思ったのですが、なかなかうまくいかない…そんなときに使えそうなソフトウェア側の対策を一つ紹介します。

使用したもの

SainSmart製のArduinoは純正のArduinoよりも供給できる電流量が多いため今回は利用しています。esp8266などの無線通信系のモジュールは大きな電流を必要とするため、安定した通信を実現するためには電流を確保する必要があります。

 

そして使ったesp8266はこの画像のタイプです

ライブラリはzipをダウンロードしてArduinoのライブラリ用のディレクトリへ配置してください。

今回の目標はとりあえずWiFiと接続できるようにするのを目標にします。

スケッチはこれ(ConnectWiFi.ino)

#include "ESP8266.h"

#define SSID        "yourSSID"
#define PASSWORD    "yourPASSWORD"

ESP8266 wifi(Serial);

void setup(void)
{
    Serial.begin(115200);
    Serial.print("setup begin\r\n");

    Serial.print("FW Version: ");
    Serial.println(wifi.getVersion().c_str());
    
    
    if (wifi.setOprToStation()) {
        Serial.print("to station ok\r\n");
    } else {
        Serial.print("to station err\r\n");
    }

    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print("Join AP success\r\n");
        Serial.print("IP: ");       
        Serial.println(wifi.getLocalIP().c_str());
    } else {
        Serial.print("Join AP failure\r\n");
    }
    
    Serial.print("setup end\r\n");
}

void loop(void)
{
}

Arduino Unoを使うということで

  • Serial1->Serialへ変更(Serial1はArduino Mega用だったはず)
  • baud rateを9600->115200へ変更

私が実行したときは”to station err”というエラーのせいで途中でコケました…。

しかし、このエラーはアクセスポイント関連のエラーではなく、esp8266の立ち上げに関するエラーのようなので、立ち上がるまで繰り返せばええやん!とおもって調べてみるとよさそうな記述を発見

#include "ESP8266.h"

#define SSID        "yourSSID"
#define PASSWORD    "yourPASSWORD"

ESP8266 wifi(Serial);

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

setupESP8266()関数ではステーションモードでesp8266が立ち上がるまで立ち上げの処理を繰り返しています。

個人的にはそれだけでよかったのですが、アクセスポイントにつなぐ処理もつながるまでループ処理が行われています。

この関数を使うことで僕の環境ではほぼ確実に”ステーションモードで立ち上げ->アクセスポイントと接続”の処理が成功しました。

WiFiにつなぐまでがなかなかうまくいかない人は試してみるといいと思います。

最後にスケッチ全体

#include "ESP8266.h"

#define SSID        "yourSSID"
#define PASSWORD    "yourPASSWORD"

ESP8266 wifi(Serial);

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() {
  Serial.begin(115200);
  setupESP8266();
}

void loop(void)
{
}

今回はこれにておしまいです。

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