前回は、ESP32-DevkitCボードにATコマンドを解釈できるファームウエアを書き込んでPCからATコマンドが使えるようになるところまでで終わってしまいました。今回は、その残り、ということで、UARTからESP32のWiFiを使って通信できていることを確認するところまでをやっておこうと思います。しかし、通信です。相手がいないと通信の確認できません。そこでお世話になったのが
netcat
という定番のソフトウエアです。
※「IoT何をいまさら」投稿順Indexはこちら
まずは前回の続きで、仮想COMポートを2つにそれぞれ仮想端末を開きます。私の場合は、慣れ親しんだTeratermを使わせていただいております。第1の端末は、ESP32-DevkitCボードのUSBコネクタを経由するUSB-Serialの側に接続し、起動時にATコマンドのブートの様子が表示されるターミナルとなります。この画面には、その後のATコマンドの動作状況が垂れなされてきます。接続した、とか、エラーとかその度に表示されます。
とりあえず何かあったときに参照できるように接続するだけ接続して、画面そのものは、裏の方に隠しておきます。他にもいくつか画面を開かないとならないので。
第2の端末はATコマンドを制御するためにESP32-DevkitCのGPIO16/GPIO17に出ているUARTの端子に接続したUSB-Serialブリッジ側のCOMポートに接続します。今回のメインはこちら。まずは、現在の「モード」を確認しておきます。
ESP32のATコマンドは昔のATコマンドに比べると命令語が長いですが、そこそこ系統的なコーディングになっているので、慣れれば分かりやすいかもしれません。WiFi関連のコマンドはCWから始まるので、AT+CWチョメチョメのような文字列になります。現在状況を問い合わせる場合には ? を、なにか値をセットする場合には = の後に数字を置けばよいようです。
AT+CWMODE?
とやれば、現在のモードが返ってきます。2です。しかし、2では何だか分からないので、ATコマンドのデータシートを見ます。すると2はアクセスポイントモードです。ESP32がアクセスポイントになるモードです。これはこれで使い道があると思いますが、今回は、ESP32が「ステーション」になって、他のアクセスポイントにぶら下がる形にしたいのでモードを変えます。ステーションモード(STA)にするのは1代入でした。念のため、モードを確認すると変更されています。
ここで、周囲にどのようなアクセスポイントが見えているのか AT+CWLAP コマンド(多分LAPは List Access Point)でスキャンしてみます。結構、沢山見えていますが、念のため固有の情報が分からないように塗りつぶしてあります。実際にはSSIDなどが見えています。
そのうち、お目当ての接続先にAT+CWJAPコマンドで接続します。左側の塗りつぶし部分にSSID、右にパスワードが入ります。文字列は念のためダブルクウォートでくくってあります。なお、つい打ち間違えるとバックスペースなどで編集したくなるのですが、ここのインタフェースには行編集機能などは無いようです。そういう操作をすると後でエラーが返ってきました。
力ずよく、WIFI GOT IPなどと報告されているので、AP側のDHCPサーバからいただけた筈のIPアドレスを確認してみます。STAモードのいろいろは、AT+CIPSTA?で知ることができます。
一部塗りつぶしていますが、ちゃんと設定されていました。ここまで確認できたら、次は ping を打ってみますかね。
ATコマンドのpingは以下の形です。返事は+PING:9と素っ気ない1行です。
9というのは反応時間が9msだったということだと思います。(データシートには時間の単位書いてないが、普通msでしょう。)なお、当然、PC側からEPS32側にpingを打つのもOKです。
最後に実際にデータ通信をテストしてみようと思いますが、こればかりは、通信相手を用意しないとままなりません。今回使用しているパソコンには MSYS2環境 がもともと入っていてパスも通してあります。第三のウインドウとしてコマンドプロンプト(cmd.exe)からMSYS2の netcat を使うことにいたします。しかし、netcatインストールされていなかったです。が、MSYS2の管理ツールである pacman さんにお願いすれば簡単。
しかし、netcatにもいろいろ実装があるようで、2種類候補が上がってきました。GNUのnetcatと、BSD系のnetcat、ネットワークといえばBSDです(後で調べてみたらIPv6使うならこちらが良いみたいでした)、しかし、ひねくれ者なのでGNUの方を選んでおきます。(これはこれで私の環境には適合するオプション使えて良かったのですが)
インストールしたnetcatは nc で起動できます。–sourceでパソコン側で接続を待ちうけたいIPアドレスを設定(ethが一つしか見えていなければ指定する必要はない)、-l はlisten、サーバとして聞き耳を立てる設定。ポートアドレスは、勝手に50001とかにしてみました。-vはよくあるverboseモード。この1行でパソコン上に
TCPのサーバ
が構成できたことになります。対するESP32のATコマンド側で操作を。
まずAT+CIPSTARTコマンドを使い、ncが見張っているポートにTCPで接続します。
CONNECT
とかえって来るので、
AT+CIPSEND=5
と、5バイト送るからね、とATコマンドを打ちます。すると>とプロンプトが返るので、ここに送り込む文字列を入力します。赤字の矢印部分。データ部には文字はコールバックされないようで見えません。ここでは12345と5文字(5バイト)送っています。SEND OKと出ていますが、上のnc側の画面の最下行
12345
と表示されているのはここで送り込んだものです。逆にnc側からESP32側へデータを送るのは、そのまま文字列を打ち込めば良いです。
3333リターンキー
すると、ESP32側に
+IPD,5:3333
と表示されます。5は5バイト。データは3333です。最後に見えない行末文字があるので5バイト。ncで、abcdefgリターン、xyzリターンなどと押す度にESP32が受信した文字が表示されていきます。コネクションを閉じるときは、
AT+CIPCLOSE
とりあえず、WiFi経由TCPで通信できることは確かめられました。ncはいろいろできるツールなので、UDPでも、また、ESP32側をサーバにしてもテストできるんじゃないかと思います。次回は、Bluetoothの通信テストですかね。