ESP32は、BluetoothとWiFiのサポートが組み込まれた強力なIoTデバイスです。ESP32は、RAM、ROM、GPIOピンなどの追加機能を備えた前身のESP8266の高度なバージョンです。ESP32モジュールは、クラシックBluetoothとBluetooth低エネルギー(BLE)の両方をサポートし、クラシックBluetoothを使用して曲やファイルを転送できます。BLEオプションは、Bluetoothビーコン、フィットネスバンド、近接などのバッテリー最適化アプリケーションに使用できます。ESP32を、単純なマイクロシステムプロジェクトのHC-05またはHC-06モジュールのようなシリアルBluetoothとして使用することもできます。
ご存知のとおり、BLEはサーバーモードとクライアントモードの2つの異なるモードで動作できます。どちらのモードも、以前のESP32チュートリアルで説明されています。
- ESP32BLEサーバー-バッテリーレベル表示のためのGATTサービス
- ESP32 BLEクライアント–フィットネスバンドに接続して電球をトリガーする
このチュートリアルでは、ESP32を使用してBLE iBeaconを構築します。ここで、ESP32はサーバーとして機能し、スマートフォンはクライアントとして機能します。ESP32チュートリアルの開始にフォールバックしない場合でも、ArduinoIDEでESP32ボードを使用する方法についてはすでにご存知だと思います。
また、RaspberryPiとHM-10BLEiBeaconを使用した以前のBluetoothiBeaconプロジェクトを実行することで、Beacon / iBeaconテクノロジーとは何かについて詳しく知ることができます。
必要なコンポーネント
ハードウェア:
- ESP32開発ボード
- マイクロUSBケーブル
ソフトウェア:
- Arduino IDE
- Androidアプリ:nRF Connect for Mobile(Nordic Semiconductorによる)
多くのBLEスキャナーアプリがありますが、そのうちの1つは、ArduinoでHM-10BLEモジュールを使用する方法の以前のプロジェクトで使用したものです。このBLEスキャナーアプリは優れたグラフィカルインターフェイス(GUI)を提供しますが、追加情報が不足しているため、このプロジェクトではNRF Connect forMobileアプリを使用しています。
ESP32iBeacon用のnRFConnectAndroidアプリの使用
1. GooglePlayストアからnRFConnectアプリをダウンロードして開きます。
2.画面は以下のようになります。このプロジェクトの便利なオプションは、デバイスが見つかったときの「スキャン」、「スキャナー」、「情報」です。
「スキャン」オプションが利用可能なすべてのiBeaconsを確認するために使用されます。iBeaconの検索を開始するには、画面をプルダウンするか、画面の右上隅にある[スキャン]オプションに移動します。これにより、利用可能なiBeaconsの検索が開始されます。
3. iBeaconを検索すると、iBeaconのRSSI、UUID、メジャー、マイナーが表示されます。モバイルとiBeaconを離すと、RSSIが変わります。この画面では、RSSIは(-37)です。これ以外に、ダミーの会社名、デバイスタイプ、バイト長、ESP32のローカル名などの詳細があります。こちらが「ESP32asiBeacon」です。スケッチでローカル名を変更できます。
4. iBeaconからスマートフォンを取り出した後、RSSI値は-37から-58に変わります。これらの値は、デバイスの1つを移動すると変化し続けます。
RSSI信号の許容値は次のとおりです。
電波強度 | TL; DR | に必要 | |
---|---|---|---|
-30 dBm | すごい | 達成可能な最大信号強度。これを実現するには、クライアントはAPから数フィートしか離れていません。現実の世界では典型的でも望ましくない。 | 該当なし |
-67 dBm | とても良い | 非常に信頼性が高く、タイムリーなデータパケットの配信を必要とするアプリケーションの最小信号強度。 | VoIP / VoWiFi、ストリーミングビデオ |
-70 dBm | はい | 信頼性の高いパケット配信のための最小信号強度。 | メール、ウェブ |
-80 dBm | 良くない | 基本的な接続のための最小信号強度。パケット配信は信頼できない可能性があります。 | 該当なし |
-90 dBm | 使用できません | ノイズフロアに近づいたり、溺れたりします。機能はほとんどありません。 | 該当なし |
BLEiBeaconとして機能するようにESP32をプログラミングする
ArduinoIDEにESP32ボードをインストールすると利用できるESP32BLEiBeaconのサンプルプログラムがあります。ただし、このチュートリアルではこのスケッチを少し編集しました。サンプルプログラムの完全に編集されたバージョンは、このチュートリアルの最後にあります。
ESP32 BLE_iBeaconのサンプルプログラムを開くには、以下の手順に従ってください。
- Arduino IDEを開き、「ESP32DevModule」を選択します。(このボードが見つからない場合は、ESP32ボードパッケージがインストールされているかどうかを確認してください)
- [ファイル] > [例] > [ESP32 BLE Arduino] > [BLE_iBeacon]に移動します
- 「BLE_iBeacon」スケッチを開きます。
ここで、このチュートリアルで行われるコードにわずかな変更があります。このスケッチでは、ESP32名も更新されます。したがって、BLEサーバーとiBeaconの作成に使用される必要なライブラリを含めることから始めます。
#include "sys / time.h"
これは、現在のシステム時刻を取得するためのタイムライブラリです。これには、tv_sec、gettimeofday()などの関数が含まれています。詳細については、「 sys /time.h」の公式UNIXリリースにアクセスしてください。
次に、BLEクライアントやBLEサーバーなどのさまざまな構成でESP32を作成するために使用される多くの機能を含むESP32BLEライブラリが含まれています。
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
iBeaconライブラリが含まれているiBeaconとしてESP32を設定します。これに加えて、ESP32用のディープスリープライブラリが含まれています。ライブラリは、定義された期間、ディープスリープモードでESP32を送信するために使用されます。
#include "BLEBeacon.h" #include "esp_sleep.h"
ESP32のスリープ期間を定義します。ここで、ESP32は10秒間ディープスリープ状態になり、アドバタイズしてから再び10秒間ディープスリープ状態になります。
#define GPIO_DEEP_SLEEP_DURATION 10
ここでRTC_DATA_ATTRが定義されています。RTC_DATA_ATTR属性を使用してグローバル変数を定義すると、変数はRTC_SLOW_MEMメモリに配置されることに注意してください。したがって、RTC_DATA_ATTRとして宣言された構造体は、ディープスリープの前に動的メモリをこの構造体にコピーすることで、ウェイクアップ後に動的メモリに回復するのに役立ちます。簡単に言うと、動的メモリから静的メモリの時間を節約して、深い睡眠の後に再び回復します。ここでは、2つの変数が定義されています。' last 'は、ESP32がディープスリープに 移行し た最後の時刻を取得するために使用され、 bootcount はリセットのカウント数に使用されます。
RTC_DATA_ATTR static time_t last; RTC_DATA_ATTR static uint32_t bootcount;
次に、BLE AdvertisingTypeを定義します。定義は次のように行われます。
BLEAdvertising * pAdvertising;
体timevalは、 現在の時間にアクセスするための構造体として定義されます。
今すぐtimevalを構築します。
また、UUIDも定義されています。UUIDは、このリンクから生成できます。
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
次に、UUID、Major、MinorなどのiBeacon属性を含む関数を作成します。この関数では、BLEのインスタンスをiBeaconとして作成し、ESP32の偽のメーカーID、UUID、majorおよびminorをiBeaconとして設定します。
void setBeacon(){ BLEBeacon oBeacon = BLEBeacon(); oBeacon.setManufacturerId(0x4C00); oBeacon.setProximityUUID(BLEUUID(BEACON_UUID)); oBeacon.setMajor((bootcount&0xFFFF0000)>> 16); oBeacon.setMinor(bootcount&0xFFFF);
フラグを0x04に設定して、スキャナーで BrEdrNotSupported を出力する よう にします。
oData.setFlags(0x04);
公開する広告データを設定します。
std:: string strServiceData = "";
文字列を次々に追加してアドバタイズします。
strServiceData + =(char)26; // Len strServiceData + =(char)0xFF; // strServiceDataと 入力します+ = oBeacon.getData(); oData.addData(strServiceData);
データを公開して広告を開始します。
pAdvertising-> setData(oData); pAdvertising-> setScanResponseData(oScanResponseData);
115200ボーレートでシリアルモニターを開始し、時間を取得します。また、 ブート カウントをインクリメントして、リセットの数を保存します。
Serial.begin(115200); gettimeofday(&now、NULL); Serial.printf( "start ESP32%d \ n"、bootcount ++);
現在の時刻を静的メモリに保存します。
last = now.tv_sec;
BLEデバイスを作成し、必要に応じて名前を付けます。ここで、ESP32は「 ESP2asiBeacon 」と名付けられています。、名前は長くなる可能性がありますが、このバージョンのコードでは長い名前のサポートが開始されていることに注意してください。
BLEDevice:: init( "ESP32 as iBeacon");
アドバタイズして起動するBLEサーバーを作成します。
BLEServer * pServer = BLEDevice:: createServer(); pAdvertising = BLEDevice:: getAdvertising(); BLEDevice:: startAdvertising();
次に、ESP32をiBeaconモードに設定します。
setBeacon();
広告を開始してから広告を停止し、10秒間深い睡眠を取ります。
pAdvertising-> start(); pAdvertising-> stop(); esp_deep_sleep(1000000LL * GPIO_DEEP_SLEEP_DURATION);
最後に、マイクロUSBケーブルを使用してESP32開発ボードをラップトップに接続し、ArduinoIDEを使用してコードをESP32にアップロードします。次に、スマートフォンで nRF Connect Androidアプリを 開き、スキャンを開始します。あなたは見つけるでしょう iBeaconのようESP32を 下図に示すように放送:
これは、ESP32をBLEビーコンとして使用して、UUID、メジャー、およびマイナーをアドバタイズする方法です。iBeaconについて詳しく知りたい場合は、HM10に関する以前のチュートリアルに従ってiBeaconを使用してください。また、疑問がある場合は、以下にコメントするか、フォーラムで質問してください。
動作するビデオを含む完全なコードを以下に示します。
/>