ESP32を使ったSTM32のTCP通信(WiFi)送信編
無線モジュールESP32を使って Nucleo(STM32) を無線 (WiFi) 化し、TCPサーバーとしてPCやスマホのターミナルへ文字列を送るアプリを紹介します。 無線モジュールESP32については「ESP32でNucleo(STM32)を簡単にWiFi対応に」で詳細を解説しています。
ここで紹介するアプリはESP32でWiFi化しTCPサーバーを構成したNucleo(STM32) からクライアント側のPCやスマホのターミナルへ文字列を送る基本的なものですが、ここでしっかり理解して使いこなせるようになると、いろいろ応用できるようになります。
Nucleo(STM32)とESP32は シリアル通信ではよく使われる ATコマンドを UART通信 でやり取りしてデータの送受信を行います。
無線モジュールESP32のモードは一般的なSTA(ステーション)モードに設定して家庭や職場のWiFiルーターからIPアドレスを割り当てられるものにします。他のモードではESP32自体を親機にするAP(アクセスポイント)モードもありますので実施してみてください。
この例では親機でDHCPサーバーであるWiFiルーターアドレスが"192.168.3.1"でESP32に割り当てられたIPアドレスは"192.168.3.19"である環境を前提にしており、各々の環境では異なりますのでご注意ください。
では早速プログラムを見ていきましょう。FreeRTOSを使った構成としています。メインプログラムの流れは起動直後に各ペリフェラルの設定を行ってから、WiFiの設定をします。その後、処理内容ごとに2つのタスクにわけ、デモプログラム用データ作成のタスクprvTask_dataとデータモニター用タスクprvTask_monitorとしています。
WiFi設定はwifi_setting関数にまとめ、ポート番号50000のTCPサーバーを生成しています。
デモ用データ作成はタスクprvTask_dataで行い、20msごとにデータ(data)を加算していく処理にしています。dataは符号なし8ビットで255を超えると0に戻ることを繰り返しています。
データモニター用タスクprvTask_monitor は3桁の数字を送るために、改行コード2文字分を含んだ5文字の送信要求コマンド"AT+CIPSEND=0,5\r\n"を送信して適度の待ち時間を挿入します。数値データを3桁の数字に変換し(digit_conv関数)、文字列としてUSART送信しています。
送信要求コマンド"AT+CIPSEND=0,5\r\n"後に挿入する待ち時間はUART通信のボーレートによっても変わります。試してみたところ9600bps時には25ms以上、115200bps時には3ms以上に設定すれば正常に機能しました。参考プログラムは9600bpsでのものです。
ESP32のUART通信の設定はコマンドAT+UART_DEF=9600,8,1,0,0で変更できます。詳しくは「ESP32でNucleo(STM32)を簡単にWiFi対応に」に記載しています。
WiFi化した文字列送信の基本構成は以上です。ひとたびTCPサーバーを構成してしまうと、あとはシリアル通信の感覚で送信が実現できてしまいますので簡単です。TCPサーバーを実現するための通信プロトコルはESP32のファームウェアに内蔵されていてはじめに設定用コードで指定するだけです。
Nucleo(STM32)のTCPサーバー側から送信された数字をクライアント側でモニターするにはターミナルアプリを使用します。ここではPCのターミナルソフトとしてTeraTermを使用しています。IPアドレスとポートを指定すると接続できるはずです。
Nucleo(STM32)側から送られた数字は0.5秒間隔で更新されています。数字が0から255までの1サイクルが約5秒であれば成功です。