ArduinoでESP8266(ESP-01)を制御+通信する #2

前回はESP8266とArduinoを接続するときにソフトウェアシリアルを使う利点(デバッグ用のメッセージと無線で送るメッセージを分けることができる)と欠点(高いボーレートでの通信ができない)をざっくりと説明しました。

今回は、ESP8266とArduinoのハードウェアの特性を考えながら無理のない通信を考えていきます。

Arduinoにはシリアル通信(他の機器と通信)をするためのハードウェアシリアル(RX、TX)があります。(RX:通信内容を聞くための耳、TX:しゃべるための口 といった役割となります)

しかし、ハードウェアシリアルはArduino Unoには一つしか搭載されていません。さらに、このハードウェアシリアルはUSBで行うシリアル通信(シリアルモニタ)と共有されています。

例えば1Arduinoに対して1つの機器と通信する際にはあまり問題ないのですが、1Arduinoに対して複数の機器と通信する際(PCとESP8266と通信する際など)にはPC用のメッセージがESP8266に飛んだりして少し気持ち悪いことになります。

(さらに言うと、PCでのデバッグ用のメッセージが無線で飛ぶと電力が消費されます。バッテリーで駆動させることを考えると、この電力がばかにならないのです…)

 

そこで、ハードウェアシリアルを仮想的に作る方法があります。これがソフトウェアシリアルと呼ばれるものです。

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(2, 3); /* RX:D2 TX:D3 */

Arduinoのスケッチに上のように記述することでソフトウェアシリアルを理由することができます。

これを使うことで2ピン→RX:0ピン、3ピン→TX:1ピンとして扱うことができます。ただし、仮想的にハードウェアシリアルを作っているだけなのであまり早い通信速度で通信しようとすると安定しません。

 

それでは、ここまでをまとめます(安定して使えるボーレートは経験則です)

ハードウェアシリアル

利点

  • 早い通信速度(高いボーレート)で通信ができる。安定して使えるボーレートは115200bps

欠点

  • Arduinoに2つ以上の機器をつなぐと予想外のデータの衝突が起こる

ソフトウェアシリアル

利点

  • Arduinoに複数の機器を接続しても、別々にデータを裁くことができる

欠点

  • 遅い通信速度(低いボーレート)を使わないと安定して通信できない。安定して使えるボーレートは9600bps

今回はソフトウェアシリアルを使うため9600bpsで通信を行います。

 

次にESP8266です

 

ESP8266はデフォルトの通信速度(ボーレート)は115200bpsです。(昨年の夏ごろより後(2015年7月)に発売されたモジュールはほぼ115200bpsだったのでこのボーレートだと思っていいです)

さっきから時々出ているボーレート(○○bps)ですが、これは簡単に言うとArduinoやESP8266がしゃべるスピードです。このスピードがずれていると正常に通信ができません。(通信はできるのですがしゃべった内容を正確に聴き取れなくて文字化けを起こします)

今回はソフトウェアシリアルを使いたいのでESP8266の通信速度(ボーレート)を9600bpsに下げる必要があります。ということでESP8266の設定を行うためのスケッチと配線の一例を載せておきます。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(11,10); // 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());
}

 

このスケッチはPCのシリアルモニタで送信した情報をソフトウェアシリアルに流すものです。

ATコマンドとはESP8266を操作するコマンドでESP8266の設定を確認したり、設定を変更したりできます。(ESP8266を介したTCP/IPの通信も実はこのコマンドを通して行われています)

シリアルモニタにAT+CIOBAUD=9600と入力し、送信するとボーレートを9600bpsに変更することができます。(返り値としてerrorが返ってきますが変更されるみたいです)

AT+CIOBAUD=9600というコマンドはファームウェアが古いESP8266にも対応しているみたいです。(手持ちのAT 0.21.0.0 + SDK 0.95.0という古いファームウェアのESP8266にも対応していました)

しかし、新しいファームウェアを使っている場合はAT+UART_DEF=9600,8,1,0,0というコマンドが推奨されているみたいです。(こちらは手持ちのAT 0.25.0.0 + SDK 0.95.0というファームウェアのESP8266に対応していました)

基本的にはAT+UART_DEF=9600,8,1,0,0コマンドを使い、成功しない場合はAT+CIOBAUD=9600を使えばいいと思います。

(ちなみに、ファームウェアを確認するコマンドはAT+GMRです)

とりあえずこれで無理のない通信を行う準備ができました。

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