2023.9.11 Coskx Lab
1 はじめに
Wi-FiマイコンXIAO ESP32S3はArduinoIDEでの開発が便利です。
ボードとしてXIAO ESP32S3を選んでおくと,XIAO ESP32S3がWi-Fi接続のWebサーバ動作をするスケッチ例が既に使えるようになっています。
ここでは,温度センサの値を発信するXIAO ESP32S3がWebサーバとして働くようにします。
温度センサはBMP280を使用します。
このWebサーバから温度データをもらうためには,PCなどからWebブラウザでアクセスします。
"マイコンのサーバ"と"PCのWebブラウザ"のふるまい
閲覧するのはスマホやタブレットのWebブラウザでもよい
2 使用環境
3 準備
3.1 ArduinoIDE
(1)Arduino IDEのメニューバーから[ファイルFile] -> [環境設定(Preferences)]
Additional board manager URLsに
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
および
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
を設定してOK
(2)ツール[Tools] > ボード[Board] > Boards Manager
検索boxに「ESP」を入力すると複数のボード候補が出てくるので
esp32 by Espressif Systems
をinstall
(3)ツール[Tools] > ボード[Board]でESP32を探すとXIAO ESP32S3が見つかるので,これを選ぶ。
3.2 XIAO ESP32S3
XIAO ESP32S3の説明書を読んでプログラムの転送方法を確認します。
(USBケーブルでつないで書き込むだけでした。)
4 XIAO ESP32S3と温度センサBMP280の配線
温度センサBMP280は温度をデジタル値に変換しているので,そのデータをXIAO ESP32S3が読み出します。
XIAO ESP32S3と温度センサBMP280はI2C接続ですので,電源線,GND線の他はSCLとSDAの2本のみで通信できます。
CSBをVCCにつなぐとBMP280はI2C接続になります。(データシートによれば確実にVCCにつなぐべきとなっています)
SDO(シルク印刷は間違えていてSDDとなっている)をVCCにつなぐとBMP280のI2Cアドレスは77になります。GNDにつなぐとBMP280のI2Cアドレスは76になります。Groveライブラリのデフォルトは77なのでVCCにつないでいます。
なおBMP280ではSDA,SCLをpullupせずに動作しています。
XIAO ESP32S3と温度センサBMP280の配線
ブレッドボードには載せないので,XIAO ESP32S3のピンを上向きに付けています。
XIAO ESP32S3と温度センサBMP280
5 XIAO ESP32S3のスケッチコード(サーバプログラム)
クライアント(例えばPCのwebブラウザ)からのリクエストで,サーバであるXIAO ESP32S3は,温度センサBMP280の値を取得し,クライアントに返します。
送信ではHTTP通信の手順に従います。
setupでは,自分が接続すべきWi-FiアクセスポイントのSSIDとパスワードを設定して,LANの一員になろうと試みます。
成功すると,LAN内のDHCPサーバからIPアドレス(一次的な)をもらいます。
またmDNSプロトコルで,自分のホスト名を有効にします。
LAN内機器についてDNSサーバはホスト名の解決ができないので,WebブラウザはIPアドレスでアクセスしてくるのですが,mDNSのおかげでホスト名+".local"(ブラウザが賢いのでホスト名だけでもOK)としてアクセスすることができます。
ここでは,"http://esp32a.local/"でアクセスできます。IPアドレスはDHCPサーバによりマイコン起動時に自動で割り当てられるので,いつも同じIPアドレスになっているとは限らないため,サーバ名(ホスト名)でアクセス可能になるmDNSの仕組みはありがたいです。
アクセスがあると,温度センサBMP280から,温度と気圧を取得し,標高を計算し,"ホスト名:レスポンス回数","標高","温度","気圧"の文字列をスペース区切りで返すようにしています。
次のコードは,IDEの既存スケッチ例"HelloServer.ino"を元に作ったものです。
ライブラリ"Grove_-_Barometer_Sensor_BMP280"を予め追加しておいてください。
補足
「server.on("/", handleRoot);」は,ブラウザから「http://サーバ名/」というアクセスがあったら,handleRoot()を実行してね,という設定です。
通常,ブラウザには「http://サーバ名」と入力しますが,ブラウザはその後ろに「/」を加えて「http://サーバ名/」のように送信します。
BMP280のオリジナルライブラリでは,BMP280操作のクラス名はBMP280です。
BMP280の初期設定を手直ししたかったので,クラスBMP280の継承クラスBMP280PPを作って,このクラスを使用しています。
#include <Seeed_BMP280PP.h>
BMP280PP bmp280;
の2行が継承クラスBMP280PPを使っているのですが,オリジナルライブラリを使用する場合はこの2行を
#include <Seeed_BMP280.h>
BMP280 bmp280;
のように戻してください。
次の2つのファイルを作りましたがそれらは,Seeed_BMP280.h,Seeed_BMP280.cppと同じフォルダ(Arduino\libraries\Grove_-_Barometer_Sensor_BMP280)内に保存されています。
BMP280PP.h
BMP280PP.ino
6 PCのWebブラウザからアクセス
プログラムがXIAO ESP32S3に転送された直後に,ArduinoIDEのシリアルモニタには次のように表示されます。
(XIAO ESP32S3をリセットした直後も同じように表示されます。文字化けするときは,115200baudであることを確認してください)
ここでXIAO ESP32S3に割り当てられたIPアドレスは192.168.1.16であり,サーバー名(ホスト名)はesp32aであることがわかります。
まず最初にgoogle chromeからIPアドレスでアクセスしてみました。
正確には"http://192.168.1.16/"のように書きます。
169.9が標高,35.3が気温,98982.0が気圧です。
次にサーバー名でアクセスしてみました。
正確には"http://esp32a.local/"のように書きます。
167.0が標高,35.2が気温,98981.0が気圧です。
ただし,標高は海面気圧が1013.25hPaとして,ライブラリ内で気圧と気温から計算されています。
7 WinPCのExcelから2つのXIAO ESP32S3にアクセス
2つのXIAO ESP32S3(それぞれ温度センサBMP280を持っている)に,同じLAN内にあるWinPCのExcelからアクセスします。
2つのXIAO ESP32S3には,プログラムコード上で
#define SERVERNAME "esp32a"
と
#define SERVERNAME "esp32b"
のように別々のサーバ名(ホスト名)を与え,起動しておきます。
Excelから,mDNSの恩恵で,2つのURLをホスト名を使ってアクセスします。
ExcelでVBAのプログラムを走らせ,Start,Stopボタンで動作を制御します。
なおVBAでブラウザと同じHTTPアクセスをするためには,Microsoft XMLライブラリを使います。
VBAの環境を開いて,メニューから"ツール"→"参照設定"を選ぶと,"参照設定"ダイアログが開くので,ライブラリファイルの中から"Microsoft XML, v6.0"を探して,チェックを入れてOKで組み込まれます。
Microsoft XMLライブラリからXMLHTTP60のオブジェクトを使って,関数requestHTTP内でHTTPアクセスします。
2つのXIAO ESP32S3からは,それぞれ"ホスト名","標高","温度","気圧"がスペース区切りで送られてくるので,それを指定のセルに表示します。
VBAのプログラムは次のようになりました。
補足
httpReq.setRequestHeader "Pragma", "no-cache"
httpReq.setRequestHeader "Cache-Control", "no-cache"
httpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
の3行は,キャッシュに残っているデータは捨てて,必ず新しいデータを受け取るようにしなさいの意味です。
これがないと,キャッシュ内のデータを受け取るだけになってしまい,古いデータが表示されたままになってしまいます。
VBAが動作しているExcelの画面内で次のようにアクセス結果を表示します。
約1秒ごとにアクセスを繰り返します。
センサBMP280の個体差が測定温度と測定気圧に現れています。温度で±0.3度程度,気圧では±100Paの違いが現れます。
8 通信距離
XIAO ESP32S3のWi-Fiでの通信は約70mでした。
9 まとめ
Wi-FiマイコンXIAO ESP32S3をWebサーバとして動作させ,XIAO ESP32S3に接続された温度センサBMP280の値を,クライアントがリクエストしたタイミングでデータを送信するようにしました。
また複数のXIAO ESP32S3サーバからデータを得るためにVBAを使ってExcelに表示する例を示しました。
補足
Excelの画面では見た目が悪いので,Powerpointで作ることもできます。Excelのセルに表示するのではなく,Powerpointの表に表示することなどが考えられます。ただし,表示場所を指示するのが面倒なのと,ExcelVBAとPowerpointVBAに多少違いがあるので,注意が必要です。