この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちはAIソリューション部のさかじです。ESP32でBluetooth Low Energy(BLE)を使用するときに便利なアプリをご紹介します。
環境
- MacBook Pro(macOS High Sierra 10.13.6)
- micro USB-Bメス ケーブル(使用するPC/Macに合わせてご用意ください)
- Arduino IDE(V1.8.7)
- ESP32-DevKitC ESP-WROOM-32開発ボード
- LightBlue Explorer https://itunes.apple.com/jp/app/lightblue-explorer/id557428110?mt=8
はじめに
Developers.IO CAFEのウォークスルーではEPS32を使用しています。ESP32はBluetoothを使用してRaspberry Piを通じてAWS IoTへ送信しています。過去2回ブログに書きましたが組込み機器の開発はデバッグが若干面倒です。無線となるとさらに面倒なので便利なツールを使います。
組込み開発のデバッグシリーズ
準備
[iOS]LightBlue Explorerのインストール
今回使用したのはiOS版です。 Mac版もあるのですが、「日本のStoreではご利用いただけません」とApp Storeに警告されていまいました。
LightBlue ExplorerをApp Storeからインストールします
[ESP32]書き込み
Arduino IDEサンプルスケッチをベースにonRead部分を追加しました。
サンプルスケッチ呼び出し方法
"ファイル" - "スケッチ例" - "ESP32 BLE Arduino" - "BLE_write"
/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleWrite.cpp
Ported to Arduino ESP32 by Evandro Copercini
*/
#include
#include
#include
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
std::string writeValue = "";
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
writeValue = value;
Serial.println("*********");
Serial.print("New value: ");
for (int i = 0; i < value.length(); i++) Serial.print(value[i]); Serial.println(); Serial.println("*********"); } } void onRead(BLECharacteristic *pCharacteristic) { pCharacteristic->setValue(writeValue);
}
};
void setup() {
Serial.begin(115200);
Serial.println("1- Download and install an BLE scanner app in your phone");
Serial.println("2- Scan for BLE devices in the app");
Serial.println("3- Connect to MyESP32");
Serial.println("4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something");
Serial.println("5- See the magic =)");
BLEDevice::init("MyESP32");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
// put your main code here, to run repeatedly:
delay(2000);
}
LightBlueからデータを書き込み
- LightBlue Explorerを起動
- "MyESP32"が"Peripherals Nearby"に表示されたら”MyESP32"をタップ
-
赤枠の部分をタップします
-
書き込むデータを入寮区するために"Write new value"をタップ
-
送信したいデータを16進数で入力します。今回は"U"(0x55)を入力して"Done"をタップ
-
するとEPS32側のシリアル出力から以下のように表示されます
1- Download and install an BLE scanner app in your phone
2- Scan for BLE devices in the app
3- Connect to MyESP32
4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something
5- See the magic =)
*********
New value: U
*********
- 同時に"READ VALUES"に先ほど書き込んだ0x55が読み出せます
最後に
簡単に双方向のやりとりができるようになりました。データ収集の制御などもうちょっと踏み込んだ処理を行えるようになると思います。新しい機能を使うときは実績のあるツールをベースに開発進めると、どの辺に問題が発生しているか切り分けやすくなると思います。