ArduinoでESP-WROOM-02Uを使う その1(回路組立とテスト)

Arduino

ESP-WROOM-02 について

概要

ESP-WROOM-02 シリーズは、ESP8266 という 32bit マイクロコントローラを搭載した WiFiモジュールです。TCP/IP プロトコルスタックを実装しており、単体で TCP や UDP による通信を行うことができます。また SPI、UART などの通信インターフェイスを備えており、Arduino などのワンボードマイコンから簡単に使用することができます。さらに、A/Dコンバータ/PWM可な汎用IO端子も備え、単体でも Arduino のような制御を行うことができます(端子数が Arduino より少ないのでできることは限られますが)。

現在は主に後継機種の ESP-WROOM-02D や ESP-WROOM-02U が流通しています。ESP-WROOM-02U の場合、チップ単体で420円、DIP化モジュールが600円、ワンボードマイコン化した開発キットが1,280円(いずれも秋月電子通商での販売価格、2023年8月現在)と安価です。

上の写真は ESP-WROOM-02U のDIP化(端子の間隔を一般的なICと同じ 2.54mm にする)キットで、別売りのワイヤーアンテナも取り付けた状態です。チップ単体では端子の間隔が狭く配線が難しいので、このようなDIP化キットを使用するといいでしょう。

なお、ESP-WROOM-02U は日本での技術基準適合証明を取得しており、安心して実験を行うことができます。上の写真でもチップを覆う金属プレートに『技適マーク』と『技適番号(R211-171104)』が刻印されているのが見えます。

※技術基準適合証明=いわゆる『技適』です。これを取得していない『電波を発信する機材』を日本国内で使用すると、電波法違反となり1年以下の懲役又は100万円以下の罰金の対象となる恐れがあります。詳しくはこちら

※秋月電子通商で販売されている ESP-WROOM-02U の DIP化キットは、別売りのワイヤーアンテナ(320円)必要です

各端子の機能

ESP-WROOM-02U の各端子の機能は以下の通りです。

端子名役割
3V3ESP-WROOM-02 に電源を供給する端子です。
Arduino の 3.3V 端子から供給すればいいかと思いきや、電流量が不足しますので別電源が必要です。
ENイネーブル信号端子です。この端子が HIGH のときにチップが稼働状態になります。
今回の実験では常時稼働させるのでプルアップします。
IO14/
HSPI_CLK
SPI 通信を行う場合は CLK(クロック信号)端子になります。通信相手の SCLK 端子と接続します。
今回の実験では使用しません。
IO12/
HSPI_MISO
SPI 通信を行う場合は MISO(入力)端子になります通信相手の SDO 端子と接続します。
今回の実験では使用しません。
IO13/
HSPI_MOSI/
UART0_CTS
SPI 通信を行う場合は MOSI(出力)端子になります通信相手の SDI 端子と接続します。
UART 通信でフロー制御を行う場合は CTS(Clear to Send)端子となります。通信相手の RTS と接続します。
今回の実験では使用しません。
IO15/
HSPI_CS/
UART0_RTS
SPI 通信を行う場合は CS(チップセレクト)端子です。通信相手の CS 端子と接続します。
UART 通信でフロー制御をする場合は RTS
(Request to Send)端子となります。通信相手の CTS と接続します。
今回の実験では使用しませんが、プルダウンが必要でした。
IO2/
UART1_TxD
開放(内部プルアップ)またはプルアップ
開放でもいいのかと思いきや、プルアップしないと正常に動きません。
IO0UART download(ESP-WROOM-02 自体にプログラムを書き込むモード)の場合はプルダウン
Flash boot(Arduino から WiFi モジュールとして使用する場合の場合は開放またはプルアップ
今回は Flash boot モードですが、開放でもいいのかと思いきや、プルアップしないと正常に動きません。
IO4汎用入出力端子です。
今回の実験では使用しません。
IO3/
UART0_RxD
UART 通信を行う場合は RxD(受信)端子です。通信相手の TxD と接続します。
※Arduino とは電源電圧が違うので接続には 5 V → 3.3 V のロジックレベル変換を経由します
IO1/
URAT0_TxD
UART 通信を行う場合は TxD(送信)端子です。通信相手の RxD と接続します。
※Arduino とは電源電圧が違うので接続には 3.3 V → 5 V のロジックレベル変換を経由します
IO5汎用入出力端子です
今回の実験では使用しません。
RSTリセット信号端子です。この端子がLOWになるとリセットがかかります。
今回の実験では、ノイズでリセットがかかってしまうと困るのでプルアップします。
TOUTデータシートには電源電圧のテストに使用する…とありますが具体的な使用法はよく判りません。
今回の実験では使用しません。開放のままで大丈夫です。
IO16RST 端子と接続すると Deep-sleep wake-up に使用されます。
今回の実験では使用しません。プルアップした方がよいかな?とも思いましたが開放のままで大丈夫でした。
GNDGND (0V) の端子です。
信号の電位基準でもあるので、電源を外部供給する場合も Arduino の GND とも接続します。

配線

各端子の機能を見て、ESP-WROOM-02 を WiFiモジュールとして Arduino と接続する場合は、

3V3 と GND を電源に接続
TxD と RxD をロジックレベル変換ユニットを経由して Arduino の RxD と TxD に接続
EN と RST をプルアップ

ということまではすぐ判るのですが、これだけだと

Plaintext
ets Jan 8 2013,rst cause:1, boot mode:(7,0) waiting for host

というエラーが Arduino に送信されてきてそれ以上動かなくなりました。しかもこのエラーメッセージはそれまでの通信速度の設定とは無関係に、なぜか速度 74,880bps で送信されてきます。
(何か送られてきているようなのにうまく受信できなかったので、通信速度をいろいろ変えて試してようやく読めました…)

データシートの説明や参考回路を見ていろいろ試した結果、これ以外に、
IO0 をプルアップ(データシートを見ると開放でもよさそうなのに…)
IO2 をプルアップ(データシートを見ると開放でもよさそうなのに…)
IO15 をプルダウン
することが必要でした。

製作

使用部品

今回は高機能なモジュールを外付けするため、用意するものが多く、また加工が必要です。

品名(型番)数量備考参考単価
ESP-WROOM-02U
DIP化キット
1モジュール基板とピンヘッダのセット
(要半田付け)
600円
WROOM用ワイヤーアンテナ102Dを使用する場合は不要320円
ブレッドボード
EIC-3901
11列6穴のものなら別の製品でも可
(多くのボードは1列5穴しかない)
460円
抵抗器(10kΩ)44本帯なら茶黒橙+誤差、5本帯なら茶黒黒赤100円
(100本入り)
ロジックレベル変換モジュール1モジュール基板とピンヘッダのセット
(要半田付け)
200円
低損失三端子レギュレータ
LM2940T-3.3
1入力5V/出力3.3V、500mA以上のものなら60円
電解コンデンサ(10μF)210円
ジャンパ線
(オス-オス)
13赤×1、橙×4、黒×4、黄×2、緑×2
ESP-WROOM-02U DIP 化キット

参考リンク:秋月電子通商
参考単価:600円

本来の ESP8266 は端子間隔が非常に狭く、配線が困難です。もちろんブレッドボードも使用できません。しかし幸いなことに、端子間隔を IC ピッチに変換するモジュールが数社から発売されています。今回は秋月電子通商で発売されている ESP-WROOM-02U DIP化キットを使用しました。

これは基板とピンヘッダがセットになっているもので、自分で基板にピンヘッダを挿して半田付けする必要があります。まぁ ICピッチですし、熱に弱い半導体部品に直接半田付けするわけではないので、それほど難しい工作ではありません。

なお、ESP-WROOM-02(無印)でも ESP-WROOM-02D でも使用法はほぼ同じです。

ワイヤーアンテナ

参考リンク:秋月電子通商
参考単価:320円

ESP-WROOM-02U には外付けのアンテナが必要です。これは ESP-WROOM シリーズとセットで使用することができる 2.4GHz 帯用のワイヤーアンテナです。ESP-WROOM-02U のアンテナコネクタに直接接続することができます。

なお、ESP-WROOM-02(無印)や ESP-WROOM-02D の場合はオンボードアンテナのため、このワイヤーアンテナを接続する必要はありません。

ブレッドボード

参考リンク:秋月電子通商
参考単価:460円

ESP-WROOM-02U のDIP化キットは幅が広く、一般的な一列5穴のブレッドボードだと端から端までつかってしまって配線がしにくいです。できないことはないのですが、単芯ジャンパ線をモジュールの基板の下に先に接続する必要があります。

さてどうしたものか…と思っていたところ、秋月電子の棚に1列6穴のブレッドボードがあるのを見つけて早速購入しました。これで通常のジャンパ線を使って試行錯誤しながら配線することができます。

抵抗器

今回使用する抵抗器は、すべて ESP-WROOM-02U のいくつかの端子をプルアップ/プルダウンするためのものです。今回はデータシートの参考回路図に倣って 10kΩ のものを使用していますが、厳密にこの値である必要はないと思います。部品箱に数kΩ ~ 数十kΩ の抵抗が余っていたらそれを使ってしまっても大丈夫なのではないかと思います。

ロジックレベル変換モジュール

参考リンク:秋月電子通商
参考単価:200円

今回の実験では Arduino と ESP-WROOM-02U を接続しますが、Arduino の電源は 5V であるのに対して ESP-WROOM-02U の電源は 3.3V と電圧が異なります。ということは信号が HIGH の時の電圧も、Arduino は 5V・ESP-WROOM-02U は 3.3V と異なっています。

Arduino にとっては、ESP-WROOM-02U から来た HIGH の信号は電圧が低すぎ、ちょっとノイズが乗ってしまうだけで LOW と誤認する危険があります。

逆に ESP-WROOM-02U にとっては、Arduino からきた HIGH の信号は電圧が高すぎ、素子が破損する危険があります。

この問題を解決するためには、HIGH の電圧を相互変換する必要があります。そのために使われるのがロジックレベル変換モジュールです。

今回は、秋月電子通商で入手した 4bit 双方向ロジックレベル変換モジュールを使用しています。このモジュール1つで 4bit の信号ロジックレベルを変換できます。双方向なので高電圧→低電圧でも、低電圧→高電圧でも使えます。

半完成キットの形で販売されているので、ピンヘッダの半田付けが必要です。秋月電子通商の商品情報ページの写真とは基板が裏返しになるようにピンヘッダを取り付けた方が、ブレッドボードに挿した後もピンの名前が読めるので扱いやすいです。

4bit双方向ロジックレベル変換モジュール

各端子の名称と使用法は以下の通りです。

HV高電圧系の電源(+側)に接続します。可能な電圧は LV ~ 20V です。
今回の実験では Arduino の 5V に接続します。
LV低電圧系の電源(+側)に接続します。可能な電圧は 2.5 ~ 20V です。
今回の実験では Arduino の 3.3V に接続します。
GND接地(GND)に接続します。高電圧系と低電圧系で GND は共通です。
HV1~4高電圧系の信号を接続します。入力/出力どちらでも使用できます。
LV1~4低電圧系の信号を接続します。入力/出力どちらでも使用できます。
三端子レギュレータ LM2940T-3.3

参考リンク:秋月電子通商
参考単価:60円

今回使用したのは LM2940T-3.3 という型番の三端子レギュレータです。出力は 3.3V 、ドロップアウト電圧は 0.4V なので、入力側には 3.7V 以上の電圧を供給する必要があります。また、出力電流は最大 1 A を流す性能があります。ESP-WROOM-02U の消費電流は 120mA 程度のようなので性能は充分でしょう。他の型番でも、入力 5V で出力 3.3V・電流容量 120mA 以上が得られるものならなんでも使えます。

データシートによると、IN – GND 間には 1μF 以上、OUT – GND 間には 10μF 以上のコンデンサを挿入することが推奨されています。今回は両方とも 10μF の電解コンデンサを使用しています。

電解コンデンサ

三端子レギュレータの入力端子および出力端子に接続します。今回は 10μF 、耐圧 16V のものを2つ使用します。

電解コンデンサは比較的容量の大きなコンデンサですが、端子に+/-の極性があります。一般的な製品では-側のケース側面にマークが付いていたり、脚の長さが違っていたりして(長い方が+)、区別が付くようになっています。逆方向の電圧が加わるとコンデンサが破損することがあります。

また、コンデンサには『耐圧』があります。耐圧を超える電圧が加わるとコンデンサが破損します。今回は 5.0V または 3.3V の電源+ラインと GND ラインの間に挿入するので、耐圧は 5.0V より大きくなければいけません。といっても一般的なパーツショップで扱われているのは耐圧 16V 以上のものが多いので、探すのに苦労するということはないと思います。

回路

今回は下図の回路で実験を行います。

配線

配線例はこんな感じです。作図ソフトのブレッドボードが5穴のものしかないのですが、実際はもう1穴多いブレッドボードを使用しないとこのようなジャンパー線の繋ぎ方ができません。

なお、ESP-WROOM-02 もロジックレベル変換モジュールも図の左下が1番ピン(図を時計回りに90°回すと基板上の文字が読める向き)です。

Arduino の配線

端子接続
5V三端子レギュレータの IN 端子と接続
GNDGND ラインと接続
D2ロジックレベル変換モジュールの HV1 と接続
D3ロジックレベル変換モジュールの HV2 と接続

三端子レギュレータ

端子接続
INArduino の 5V 端子、ロジックレベル変換モジュールの HV と接続、
コンデンサ1を経由して GND と接続(コンデンサの極性注意)
GNDGND ラインと接続
OUT電源の+3.3V ラインと接続
コンデンサ2を経由して GND と接続(コンデンサの極性注意)

ロジックレベル変換モジュールの配線

端子接続
LV電源の+3.3V ラインに接続
GNDGND ラインに接続
※GND 端子は2つありますが内部で接続しているので一方だけの配線でも可です
LV1ESP-WROOM-02U の TxD 端子に接続
LV2ESP-WROOM-02U の RxD 端子に接続
HV三端子レギュレータの IN 端子に接続
HV1Arduino の D2 に接続
HV2Arduino の D3 に接続

ESP-WROOM-02 各端子の配線

端子接続
3V3電源の+3.3V ラインに接続
GNDGND ラインに接続
EN10 kΩ の抵抗を経由してプルアップ(電源の+3.3V ラインに接続)
RST10 kΩ の抵抗を経由してプルアップ(電源の+3.3V ラインに接続)
IO010 kΩ の抵抗を経由してプルアップ(電源の+3.3V ラインに接続)
IO210 kΩ の抵抗を経由してプルアップ(電源の+3.3V ラインに接続)
IO1510 kΩ の抵抗を経由してプルダウン(GND ラインに接続)
TxDロジックレベル変換モジュールの LV1 に接続
RxDロジックレベル変換モジュールの LV2 に接続

※プルアップ/プルダウンで 10kΩ の抵抗を経由しているのは、データシートの回路図を参考にしました
※上記の配線とは別に、外部ワイヤーアンテナをモジュールのアンテナ端子に接続します。

初期設定を行う

通信速度の設定

Arduino と ESP-WROOM-02 はソフトウェアシリアルで通信します。ESP-WROOM-02 のデフォルト(新規購入時)の通信速度は 115,200bps に設定されているのですが、残念ながら Arduino のソフトウェアシリアルは高速での通信が不安定なようで、この速度で Arduino が連続して送受信できるのは数十バイト程度のようです。たとえば後述のATコマンドでは、レスポンスが『 OK 』+改行の数バイト程度なら大丈夫ですが、AP 一覧(結果が複数行にわたる長い文字列になりがち)を取得する AT+CWLAP コマンドだと2~3行目あたりから文字化けして読めなくなる、という具合です。

技術系フォーラムの記事を拾い読みしていると、どうやらSoftwareSerialの実装に問題がある模様…

そこで、まず ESP-WROOM-02 のシリアル通信速度を、デフォルト値の 115,200bps から、安定して通信できる 9,600bps に変更します。アナログモデムのパソコン通信時代を彷彿とさせる遅さですが、ESP-WROOM-02 とは一度にせいぜい数百バイト程度のやり取りしかしないので実用上問題はないでしょう。

ESP-WROOM-02U を接続した Arduino と PC を USB ケーブルで接続し、Arduino IDE でシリアルモニタを開いた状態で、以下のスケッチをコンパイル&実行して下さい。

C++
#include <SoftwareSerial.h>

SoftwareSerial wifiSerial(2, 3); // RxD=2, TxD=3

void setup() {
  // PCとの通信の設定(USB virtual com port)
  Serial.begin(9600);
  Serial.println("com port connected.");

  // ESP-WROOM-02Uとの通信の設定
  wifiSerial.begin(115200);  // 最初は速度115200bpsでシリアル通信
  while(!wifiSerial){}
  wifiSerial.println("AT+UART_DEF=9600,8,1,0,0");  // 通信速度設定コマンド(この長さなら115200bpsでも送信できる)
  wifiSerial.end();
  wifiSerial.begin(9600);    // シリアル通信の速度を9600bpsに変更
  Serial.println("9600bps ok.");
}

void loop() {
  // 設定自体はsetup()だけで終了しているので、
  // オマケとしてシリアルモニタからESP-WROOM-02にコマンドを送れるようにしています。 

  // PCのシリアルモニタから送信されてきたデータがあったらESP-WROOM-02Uに転送する
  if (Serial.available()) {
    wifiSerial.write(Serial.read());
  }
  // ESP-WROOM-02Uから送信されてきたデータがあったらPCのシリアルモニタに転送する
  if (wifiSerial.available()) {
    Serial.write(wifiSerial.read());
  }
}

Serial(USB仮想シリアルポート)で PC と、wifiSerial(ソフトウェアシリアルポート)で ESP-WROOM-02U と通信しています。

このプログラムは自動的に速度を変更します。シリアルモニタで『9600bps ok.』と表示されたら設定完了です。

mySerial.println() で ESP-WROOM-02U に送信している

PowerShell
AT+UART_DEF=9600,8,1,0,0

という文字列は、多くの通信機器で使用されている『 AT コマンド』というものです。

『AT+UART_DEF』はシリアル通信のデフォルト状態を設定するコマンドです。『9600,8,1,0,0』というパラメータは『速度9600bps、データ長8bit、ストップビット長1、パリティなし、フロー制御なし』を表しています。

このコマンドを一度実行すれば、設定が保存され、次回電源投入または再起動したときには今回設定した状態で起動します。

※_DEFと付いているコマンドは、設定値をデフォルト値として保存します。

動作テスト

ATコマンドを打ち込む

先のプログラムでは、設定後にシリアルモニタから追加の AT コマンドを送信できるようになっています。せっかくなのでコマンドをいくつか試して動作テストを行いましょう。以下のコマンドを順に入力してみて下さい。

※コマンドはすべて半角英大文字・半角数字・半角記号です。

コマンド:AT

まずはコマンドとして『 AT 』とだけ入力してみましょう。

ESP-WROOM-02U がコマンドを受け付けられる状態ならば、

Plaintext
OK

とメッセージが返ってきます。なお、コマンド自体もエコーバックされるので、シリアルモニタの受信欄には

のように表示されます。これ以降のコマンドもエコーバックされますが、説明ではレスポンスメッセージ部分のみ表記します。

コマンド:AT+CWMODE

AT+CWMODE は、ステーションモード/ソフト AP モードの切り替えを行います。

指定するパラメータはモードを表す数値です。値は以下の通りです。

モード
1ステーション(クライアント)モード
2ソフトAPモード
3ステーション+ソフトAPモード

この実験では ESP-WROOM-02U をステーションモード(クライアントモード、既存のアクセスポイントに接続する側)に設定するので、

PowerShell
AT+CWMODE=1

と入力します。正常終了すると

Plaintext
OK

とメッセージが返ってきます。

コマンド:AT+CWMODE?

無線LANのモードを確認します。このようにコマンドの最後に『?』をつけると、現在の設定値を確認することができます。コマンドとして

PowerShell
AT+CWMODE?

と入力すると、先ほどの設定が上手くいっていれば

Plaintext
+CWMODE:1

OK

とメッセージが返ってきます。

コマンド:AT+CWLAP

接続可能なアクセスポイントの一覧が表示されます。パラメータはありません。

PowerShell
AT+CWLAP

と入力するとアクセスポイント一覧が文字列情報で返ってきます。

アクセスポイントの情報は

Plaintext
+CWLAP(4,"HOMENETWORK",-78,"12:34:56:78:9A:BC",1,-7,0)

のように表示されます。複数のアクセスポイントがある場合、上記のような行が複数表示されます。

カッコ内の最初の数値(上の例では “4” )はアクセスポイントの暗号形式を示しています。数値と暗号形式の対応は以下の通りです。

暗号形式
0OPEN
1WEP
2WPA-PSK
3WPA2-PSK
4WPA-WPA2-PSK

2番目の文字列(上の例では ”HOMENETWORK” )は SSID です。
3番目の数値(上の例では “-78” )がシグナルの強さを表しています。
4番目の文字列(上の例では “12:34:56:78:9A:BC” )は MAC アドレスです。
5番目の数値(上の例では “1” )は無線 LAN チャンネルです。
6番目の数値(上の例では “-7” )は周波数オフセットです。
7番目の数値(上の例では “0” )は周波数キャリブレーションです。

※拙宅で実験したところ、隣近所の WiFi も拾って 20以上のアクセスポイントが表示されました…。

コマンド:AT+CWJAP

AT+CWJAP コマンドは、アクセスポイントに接続します。コマンドの書式は

AT+CWJAP="<ssid>","<password>"

です。<ssid>と<password>は実験を行っている場所で接続可能なアクセスポイントの値を入力して下さい。たとえば SSID が HOMENETWORK、パスワードが 1234abcd ならば、入力するコマンドは

PowerShell
AT+CWJAP="HOMENETWORK","1234abcd"

となります。

なお、デフォルトの設定では IP アドレスなどの情報は接続先のネットワークの DHCP サーバから自動取得します。一般的な家庭用ルータなら購入時点で DHCP サーバが動作するようになっているものが多いですが、セキュリティ上の問題などで DHCP を動作させていない環境では接続自体はできてもネットワークに参加できません。

接続までに少々時間がかかることがあります。接続に成功すると、

Plaintext
WIFI CONNECTED
WIFI GOT IP

OK

とメッセージが返ってきます。

コマンド:AT+CIPSTA_CUR?

IP アドレスやデフォルトゲートウェイを表示します。正常にネットワークに接続できている場合、

Plaintext
+CIPSTA_CUR:ip:"192.168.0.19"
+CIPSTA_CUR:gateway:"192.168.0.1"
+CIPSTA_CUR:netmask:"255.255.255.0"

OK

のようなメッセージが返ってきます。これは『IPアドレスは192.168.0.19』『デフォルトゲートウェイは192.168.0.1』『サブネットマスクは255.255.255.0』であることを表しています。

ping(Windowsのコマンドプロンプト、MacOSやLinuxのターミナルで)

それではここで、PC から ESP-WROOM-02 に対して ping を送信してみましょう。
Windows ならコマンドプロンプト、MacOS や Linux ならターミナルを開いて、

ping ESP-WROOM-02のアドレス

とコマンドを入力しましょう。<ESP-WROOM-02のアドレス>は先ほど AT+CIPSTA_CUR? で表示されたものを入力します。たとえばアドレスが 192.168.0.19 ならば、コマンドは

Plaintext
ping 192.168.0.19

となります。

PowerShell
C:\> ping 192.168.0.19

192.168.0.19 に ping を送信しています 32 バイトのデータ:
192.168.0.19 からの応答: バイト数 =32 時間 =39ms TTL=128
192.168.0.19 からの応答: バイト数 =32 時間 =20ms TTL=128
192.168.0.19 からの応答: バイト数 =32 時間 =37ms TTL=128
192.168.0.19 からの応答: バイト数 =32 時間 =56ms TTL=128

192.168.0.19 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 20ms、最大 = 56ms、平均 = 38ms

C:\>

このように表示されればちゃんと通信できています(『39ms』などの数値の部分は違っていても大丈夫です)

コマンド:AT+CWQAP

AT+CWQAP コマンドはアクセスポイントから切断します。パラメータはないので、

PowerShell
AT+CWQAP

とだけ入力します。正常に処理されると

Plaintext
OK
WIFI DISCONNECT

というメッセージが返ってきます。

以上で、AT コマンドによる動作テストは終了です。

次の記事ではTCP接続します。

まとめ

  • ESP-WROOM-02 は Arduino に接続して WiFi モジュールとして使用できる
  • ESP-WROOM-02 は ATコマンドを使用して操作できる

コメント

タイトルとURLをコピーしました