SoftwareSerialを使ってESP8266とArduinoをつなぐ

今までESP8266を使う際にはHardwareSerial(0ピンと1ピン)を使って通信を行ってきましたが、0ピン(RX)1ピン(TX)の役割をほかのピンでも仮想的に利用することができるみたいなので試してみました。

SoftwareSerial.hのヘッダーを読み込むことで利用することができます。ソースコードはこんな感じ

#include <SoftwareSerial.h>

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

void setup()
{
  Serial.begin(115200);
  mySerial.begin(115200);
}
void loop()
{

}

これでArduinoの2ピンと3ピンを使ってESP8266と通信を行うことができます。

そもそもなぜこんなことをしようかというと

HardwareSerial(0ピン1ピン)を使ってESP8266と通信を行うときにATコマンド以外の情報も無線で飛ばしてるので(デバッグ用のメッセージとか)、もしかしたらバグのもとかもなーと疑問に思っていたのです。

できればArduinoとESP8266間の通信とArduinoとPC間の通信を分けれたらいいよねーというコンセプトでこんなことをしています。

 

しかし、ここで問題が!

ArduinoのSoftwareSerialが対応しているボーレート(通信速度みたいなもの)は9600~115200とはドキュメントには書いてあるのですが、ググってみると大多数の人が「高いレート(115200)は実質安定して使えないので9600あたりを使いましょう」とのこと。

でもESP8266のデフォルトの通信速度は115200…。(ボーレートが違うとデータのやり取りができない)

 

Arduino(ボーレート9600(通信遅い)) ≠ ESP8266(ボーレート115200(通信早い)) → 使えない?

 

いや、実際に通信している人が世の中にいるからできるはず…。ここで見つけたのがATコマンド「AT+UART_DEF」

このコマンドを使うとESP8266がデフォルトで通信に使うボーレートを変更できます。Arduino側がだめならESP8266側を変えればええやん!つまりESP8266側のボーレートを115200から9600に落としちゃおうと考えました。

 

ということでESP8266にATコマンドを送るために次のようなコードを書きました。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); // RX, TX
void setup()
{
  Serial.begin(115200);
  mySerial.begin(115200);
}
void loop()
{
  if(mySerial.available())
  Serial.write(mySerial.read());
  if (Serial.available())
  mySerial.write(Serial.read());
}

ちなみにSerialがPCとの接続を担当するシリアル通信、mySerialがESP8266との通信を担当するシリアル通信です。

そして、SoftwareSerialで115200もレートを上げられないといった矢先のこのコードです。

いくつかのATコマンド(AT、AT+GMR)を試したところ不安定さはあれど成功したので行けると判断しました。

使い方はいたって簡単、Arduinoの2ピン3ピンにESP8266のRXとTXをつないでシリアルモニタを使ってATコマンドを送信するだけ。

 

しかし、肝心のATコマンド、AT+UART_DEF=9600,8,1,0,0(ESP8266のデフォルトのボーレートを115200から9600に変更するコマンド)はerrorを返されてしまいました。

なぜこのようになるか予想してみます。

  • ボーレート115200での通信が不安定なためESP8266側が正確にコマンドを受け取れていない
  • ESP8266のファームウェアが古すぎてこのコマンドに対応していない

こんなところでしょうか。

ファームウェアに関しては確認してみたのですが

私が使っているヴァージョンは

AT 0.21.0.0 + SDK 0.95.0

AT+UARTコマンドに関してはAT 0.21からサポートしているみたいなのですが、これは非常に怪しいです。(さらに言うとこの情報のソースのドキュメントがロシア語だったので私の解読能力的にも正しいか怪しいところです)

他にも理由があります。

別の手持ちのファームのヴァージョンが少し新しいESP8266(AT 0.25.0.0 + SDK 0.95.0)ではコマンドが正常に受け取られたためです。

ということで私の中では、ファームウェアの問題ではなかろうかという説が濃厚です。

でもファーム書き換えるのめんどいし(めんどい)、新しいの一つ買った方が早いのでは?説も急速に浮上

とりあえず問題点を吐き出しておいて、あとでじっくり考えてみることにします。

今回はこんなところがわからなかったよ!という内容でした。

 

ちなみにESP8266の中でも黒いモジュールの方がフラッシュの容量が多いみたいです。よく見る青いモジュールでは失敗していたのですが、黒いモジュールでは成功したのでそこらへんも関係あるのかも?

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