ESP32でBLE通信#1|BLEタグを検知する

ESP32でBLE通信#1|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など)を制御する方法について解説しておりますので、良かったらこちらもご覧になってください。

最後までご覧頂きましてありがとうございました。