ESP32でWiFi化したNucleo(STM32)をブラウザでリモート操作
ESP32をSTM32マイコンに組み込んでWiFi化したWEBサーバーを構築して、ウェブブラウザからSTM32マイコンをリモート操作する方式を解説していきます。 ブラウザからマイコンをリモート操作ができるとアプリケーションの用途がぐっと拡がります。
目次
ESP32でSTM32をWiFi化したTCPサーバーを構築するとPCやスマホなどからターミナルソフトでTCP通信によってリモートコントロールができるようになりました。ここではターミナルソフトの代わりに ウェブブラウザからNucleo(STM32マイコン)にアクセスしてリモートコントロールする方式を解説していきます。
今回はESP32をPCのシリアルターミナルからATコマンド送ってWEBサーバーに設定していますので 送信、受信ともATコマンドでサーバーを構築するところまではTCPサーバーのときとほぼ同じです。ウェブ上のWEBサーバーにアクセスする場合はESP32をクライアント設定にします。
WEBサーバー設定
TCPサーバーに設定する場合ははじめに複数のコネクションに対応できるモード(マルチコネクションモード)に設定します。コマンドAT+CIPMUX=1の"1":マルチコネクション、"0":シングルコネクションモード。ESP32はデフォルトがシングルコネクションモードですのでこのコマンドを必ず実行します。
コマンドAT+CIPSERVER=1,80でWEBサーバーを生成します。1つ目の値が"1"でサーバー生成、"0"でサーバー削除です。ポート番号はWEBサーバーを構築する場合ですので "80"を指定します。"50000"を指定した場合はうまくいきませんでした。「OK」の応答でTCPサーバーは起動しました。クライアント側の接続待ち状態になります。
ウェブブラウザでWEBサーバーのIPアドレスを指定しアクセスするととシリアルターミナルで以下のような表示が現れます。ポート番号は80である場合は省略してもよいようです。
ATコマンドによる送信操作
ここで文字列"Hello"をウェブブラウザ側に送るATコマンドを実行します。
ブラウザにはHTTPプロトコルのHTML文字列を付加すると"<H1>Hello</H1>"の合計14文字になります。
ATコマンドのAT+CIPSEND=0,14を送ったあとに コマンドが受理されると”OK”が返されて、>のプロンプトが表示されて入力待ちになっているので 送信する14文字 <H1>Hello</H1>を入力するとブラウザへ送られます。
ウェブブラウザで画面が切り替わり以下のように文字列"Hello"が現れていれば成功です。続けて文字列を送りたい場合は同様にコマンドAT+CIPSENDの実行を繰り返します。
終了するにはブラウザを閉じるか、ATコマンド"AT+CIPCLOSE=0"を実行します。"0"はリンクIDです。
ATコマンドによる受信操作
ウェブブラウザから文字列を送ったものをシリアルターミナルで受信する場合を見ていきましょう。この場合はブラウザのアドレスの後に”/"で区切り、送りたい文字列をいれればよいだけです。
TCP通信の時と違うのはブラウザで接続中の場合にコードの文字列を含んだIPアドレスを指定して更新すると、一旦通信が切れてからまた更新したIPアドレスで再接続することです。そのとき、ESP32は接続状態の応答を返してからその次に+IPDから始まる文字列をターミナル側に送ります。
HTTPプロトコルによる通信のため、多くの文字が付加されて応答されてきます。 WEBサーバーの受信では"/"直後に文字列があり、この部分を受信コードとして抽出すればよいのです。
ESP32によるウェブブラウザ経由でマイコンのリモート操作
これまではPCのシリアルターミナルソフトからESP32へATコマンドのやりとりで文字列の送受信を行ってきました。 他の実行環境であるマイコンとATコマンドをやりとりして ウェブブラウザ経由でおこなうリモート操作に挑戦しましょう。
ブラウザからマイコンをリモート操作ができるようになると、アプリケーションの用途がぐっと拡がります。まさにIoTの典型的なものですので使いこなせるようになって発展させてください。
マイコンからウェブブラウザへの送信操作
PCのターミナルからATコマンドを送ってウェブブラウザへの文字列を送信できるようになりましたが、次の課題はターミナルに置き換えてマイコン(STM32)からウェブブラウザへ文字列を送信する場合です。
プログラムの内容は基本的にTCP通信の場合と同じですが、相違点はサーバーを生成するポートをWEBサーバー用の80にすることです。また、送信の文字列にはHTTPプロトコルにしたがって、文字列の前後に<H1></H1>を付加することです。
送信に関してはTCPサーバーの場合とあまり変わりません。
このサンプルでは定期的に増加させた数値を1.5秒間隔でブラウザに表示させるものです。プログラムはESP32でWiFi化したSTM32からウェブブラウザへ送信するで紹介しています。
ウェブブラウザからマイコンでの受信操作
今度はウェブブラウザからマイコン(STM32)側へ文字列を送る場合です。
ウェブブラウザから文字列”ABC@"を送るとESP32ではブラウザとの接続あるいは再接続するための応答、 "0,CLOSED", "0,CONNECT"を返します。これに続いて
+IPD,x,xxx:GET /ABC@ HTTP/1.1xxx...が応答としてマイコンへ返しますのでこの中のABCだけを取り出します。ここでも文字列の終端が分かるように@をコマンドにつけています。
ESP32とブラウザとのHTTPプロトコルによる通信ではことあるたびにいろいろな応答が発生するので注意が必要です。
マイコンでの受信処理はESP32からの応答のタイミングを把握するためにもポーリング処理よりも割り込みを使用するほうが確実です。ESP32はHTTPプロトコルでは送信したいコード以外にもいろいろな応答を返すので、どのタイミングでどんな応答があるかを予め、把握しておくのが重要です。
ブラウザからのマイコン操作は予め登録しておいた文字列コードをIPアドレスに含めて入力し、マイコンプログラム内でコードとの一致、不一致で処理を分ければリモート操作ができることになります。
このサンプルはブラウザから送ったコードを登録コードと比較して一致・不一致により処理を条件分岐させるプログラムです。コード取得ではESP32からの応答文字列のなかで必要なコードだけを抽出しています。
条件分岐処理後にUSART3を初期状態に戻すことをして次の割り込みに備えています。なんらかの方法でUSART3のレジスタ類をクリアしておかないとUSARTが応答しなくなる可能性があります。
このサンプルでは受信割り込みが入ったときにLED(PA5)を出力して確認できるようにしています。 プログラムはESP32でWiFi化したSTM32にブラウザから操作するで紹介しています。
ESP32操作のためのマイコンプログラムではATコマンド前後では十分な待ち時間を設けておくのがコツです。ボーレート等環境によりことなりますがまずは大きめなものを設定しておくのがおすすめです
ESP32をHTTPプロトコルで使うと何かにつけ応答を返すのですが、ときにより結構悩まされることがあります。ESP32とターミナル間の通信では問題がないのにマイコンとの通信ではうまく行かないのは、応答の処理や待ち時間が不十分である可能性が大きいです。ターミナルソフトでコマンドを与えたときにESP32からどのような応答があるかを一つずつ確認しながら見落としないようにすることが大切です。