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

こんにちは

今回はPCを経由せずにArduino間で通信する際に引っかかったことなどを段階を踏んでチュートリアル形式で紹介したいと思います。(初心者向けじゃないかもしれない…ごめんね)

まず、今回の目標

  • 2台のArduino間で無線LAN経由で通信をする!!

なぜこんなことをしようと思ったのかといいますと、

Web上でよく見る構成はこんな感じ↓

センサー <—>   Arduino   <—>  ESP8266   <–(無線通信)->   PC

しかし、「それ、PCじゃなくてArduinoでもできるんじゃない?」という疑問が浮かびました。

そもそも、「1つのセンサーに1つのPCはちょっとリソースの無駄遣いじゃない?」という疑問も浮かびます。

そこで、「PC」をもっとミニマムな構成…例えば「ESP8266+Arduino」に取り替えてみようという思い立ったわけです。

今回考えた構成はこんな感じ↓

センサー <—> Arduino <—>ESP8266 <–(無線通信)-> ESP8266 <—> Arduino

とりあえずPCをArduinoとESP8266を合体させたモジュールにおきかえてみました。

説明の順序はこんな感じ、少し遠回りですが順を追っていきます。

  1. Arduinoのソフトウェアシリアルとハードウェアシリアル
  2. ESP8266のハードウェアの予備知識
  3. 安定して通信するには?
  4. ESP8266のボーレートとArduinoのボーレートの違いと設定
  5. TCPとUDP
  6. Arduinoをサーバ、クライアントにして通信してみよう

それじゃ行きますよ

  • Arduinoのソフトウェアシリアルとハードウェアシリアル

ArduinoのピンにはRX、TXと書かれたものがあります。Arduino UNO R3では0ピンと1ピンです。このピンは他のピンとは違い、シリアル通信を用いてほかのピンとデータのやり取りができます。(USBや0、1ピンはハードウェアシリアルと呼ばれます)

データのやり取りとしては、例えばスケッチのアップロードなどがシリアル通信を用いています。

スケッチのアップロードはUSBだから0ピンと1ピンは関係ないじゃないか!!という声も聞こえそうですが、ArduinoのUSBを使ったシリアル通信と0ピン1ピンを使ったシリアル通信は回路的に共有されています。

どういうことかというと、試しに0ピンにデータを送りながらスケッチをアップロードするとアップロードエラーが起こるはずです。これは、USBから送られたデータをArduinoに書き込む際に、0ピンから送られてきたデータが衝突を起こして邪魔をするためです。

今回この話をしたのはESP8266とArduinoを通信させる際にこのピンを使っている人が結構たくさんいると感じたからです。

しかし、このピンの特性上、Arduinoのデバッグ用のメッセージとESP8266を動作させるコマンドがごちゃ混ぜになる恐れがあるため個人的にはあまり使いたくありません。(ESP8266に送られるべきデータがPCへ飛んだり、PCに送られるべきデータがESP8266に飛ぶ可能性が否定できない)

これをなくしたい

そこで、0(RX)ピン1(TX)ピンの役割をほかのピンで担当できるようにするために作られた機能であるソフトウェアシリアルを使おうと思います。

使い方は簡単

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

これでArduinoのSerialと区別されます。使い方の例は過去記事

しかし、ソフトウェアシリアルにも欠点があります。それは通信速度(ボーレート)です。ハードウェアシリアルでは115200bps(結構早い)が使える一方でソフトウェアシリアルは9600bps(比較的遅い、でも十分使える)までしか安定して使えません。

今回はソフトウェアシリアルを使ってプログラムしていきますが、ソフトウェアシリアルで使えるボーレート9600bpsに対してESP8266がデフォルトで使えるボーレートは115200bps…。これではボーレートが違いすぎてモジュール間の通信が成り立ちません!

まずはこの問題を解決する必要があります。これについては、ATコマンドというESP8266に命令を送るコマンドを使ってESP8266側の通信スピードを変更(115200bps -> 9600bps)する必要があります。これについては難しくはありません、があとで説明しようと思います。

1.「Arduinoのソフトウェアシリアルとハードウェアシリアル」のまとめ

  • どのモジュールとどのモジュールが通信しているかを明確にするためにソフトウェアシリアルを使う
  • ソフトウェアシリアルはハードウェアシリアルに比べて早い速度で通信できないためESP8266からのデータを受け取り損ねることがある。
  • これを解決するためにESP8266の通信速度を遅くしてArduinoでも安定して読み取れるようにする必要がある。

長くなったので次の話は別のエントリーで話したいと思います。

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