ESP32 Arduino開発#1BLE通信|BLEタグを検知する
今回は、ESP32を使用して、BLEタグを検知して表示するところまでを実践します。
使用するBLEタグは、前回で紹介したもの(ZenLyfe スマートタグ ST02)をそのまま使用します。
前回を見ていない方はこちら。
概要
やりたい事
以下の事をやりたいと思います。
- ESP32で、指定のBLEタグを探す。
- 指定のタグを検知したら、パソコンにログを出力する。
BLEタグを検知するしくみ
BLEタグは、ビーコンと呼ばれる仕様で動作します。
ビーコンとは、蛍の光のように、電池が切れるまで一定周期で発信しております。
ESP32で、これらをキャッチすることが出来ますので、後はキャッチした情報の中の、固有のID(MACアドレス)と比較することで、指定のBLEタグが近くにあるかどうか判断することが可能になります。
開発環境
開発環境は、Arduino IDEを使用します。
Arduino IDEはオープンソースですので無料でダウンロード&インストール可能です。
プログラミング言語はC++です。
※今回使用したESP32開発ボードは、「Node MCU ESP32」です。
※環境設定などは省略いたします。各ESP32開発ボードのマニュアルに従って設定してください。
作成手順
以下、作成手順になります。
1.事前準備
前回、スマホアプリでBLEタグの動作確認を行いました。
スマホアプリ側で、事前にBLEタグのMACアドレスをメモしておきます。
- 一番右の設定アイコンを選択すると、BLEタグのMACアドレスが確認できます。
「05:B3:EC:xx:xx:xx」
2.ESP32側のプログラミング
10秒ごとスキャンして、検出できたらBLEタグの情報を表示(USBシリアルで出力)します。
以下、サンプルコードになります。
BLEタグのMACアドレス(DEF_BLE_ADDR)の値を、先ほどメモした値に置き換えてください。
また、BLE検出数の上限20件までとしております。
周りがBLEだらけで検出されないようでしたら、この数字を増やしてみてください。
#include <BLEDevice.h>
#define DEF_BLE_ADDR "05:B3:EC:xx:xx:xx"
BLEScan* g_pBLEScan;
void setup() {
Serial.begin(115200); // ログ出力準備
BLEDevice::init(""); // BLEデバイス初期化
g_pBLEScan = BLEDevice::getScan(); // Scanオブジェクト取得
g_pBLEScan->setActiveScan(false); // パッシブスキャンに設定
}
void loop() {
char buf[1024];
sprintf(buf, "");
BLEScanResults res = g_pBLEScan->start(10); // スキャン時間10秒
int nCnt = res.getCount();
if (nCnt > 20) { // 上限20件まで検出
nCnt = 20;
}
// 検出したBLE件数分ループ
for (int i = 0; i < nCnt; i++) {
BLEAdvertisedDevice bledev = res.getDevice(i);
BLEAddress ble_addr = bledev.getAddress(); // BLEのMACアドレス取得
std::string ble_name = bledev.getName(); // BLEの名称取得
// MACアドレスが一致している場合
if( DEF_BLE_ADDR == ble_addr.toString() ){
// ログ出力
sprintf(buf, "name=[%s]; addr=[%s]", ble_name.c_str(), ble_addr.toString().c_str());
Serial.println(buf);
break;
}
}
delay(10000); // 10秒wait
}
3.ESP32へ書込み
- 使用したESP32開発ボードは、「Node MCU ESP32」ですので、メニュー「ツール」-「ボード」の項目は、「NodeMCU-32S」を選択しました。(※1)
- シリアルポートは、ESP32をUSBでPCと接続すると、COM番号が追加されるので、それを選択します。
- 書込みは、ツールボックスの「⇒」右矢印ボタンで開始します。
- ESP32開発ボードの、右側のボタン(IO0)長押しすると、書込み開始するので、直後にボタンを離します。(※2)
- 書込みが開始されます。
(※1)他のESP32っぽい名前の項目がありますが、書込みできない場合があります。製品のマニュアルをご確認ください。
(※2)機種によって書込み操作が違う場合があります。例えば、IO0ボタン押しながらEN(リセット)ボタンを押さないと書込みできない場合もあります。
実行結果
- Arduino IDE画面の右上にある虫眼鏡ボタンを押すと、シリアル通信をモニタできます。
- これでログ出力を確認します。
- ボーレートを115200bpsに選択します。
- USBシリアル通信出力例になります。
- ESP32開発ボードのENボタンを押すとリセットします。
name=[SFST02]; addr=[05:b3:ec:xx:xx:xx]
name=[SFST02]; addr=[05:b3:ec:xx:xx:xx]
name=[SFST02]; addr=[05:b3:ec:xx:xx:xx]
:
最後に
ESP32を使用して、メモしたBLEタグのMACアドレスと同じものを検出(ログ出力)できていることを確認することができました。
ESP32はBLE通信の他にも、WiFi通信することも可能です。
以前、展示会などでバーコードやRFIDカードの読取り結果を、Webサーバに蓄積して、履歴情報をスマホなどで観覧できるデモをしたことがありますが、このときもESP32などを利用させて頂きました。
試作品づくりにはお手軽なのではないかと思います。
次回は、ESP32を使って、IO(ボタンやLEDなど)を制御する方法について解説しておりますので、良かったらこちらもご覧になってください。
最後までご覧頂きましてありがとうございました。
-
前の記事
ESP32でBLE通信#0|前準備編 BLEタグの動作を確認する 2021.04.06
-
次の記事
ESP32 Arduino開発 #2 IO制御|ボタン押したらLED緑点灯・離したら赤点灯させる 2021.04.09