こんにちは!てくいのタチキです。今回はM5StackでBluetooth、BLE通信を用いてテキストデータの送受信を行いました。M5Stack(Arduino言語)とPC(python)間でBluetooth通信を使用し、M5Stack (Arduino言語)とスマホ(BLE Scannerアプリ)間でBLE通信を使用した開発を行っています。
目次
BluetoothとBLEとは
前提として、Bluetooth(Bluetooth Classic)とBLE(Bluetooth Low Energy)は別物です。
- Bluetooth
・無線規格の一つ
・対応した機器同士がケーブルを繋がなくてもデータのやりとりができる
・Bluetoothイヤホンなど馴染みがあるもの - BLE
・Bluetooth4.0から新たに搭載された低消費電力用途の規格
・低消費電力用のモノなので、BLuetoothとの互換性はない
・エアコンなどのIoTデバイスで使用される
参照:外部CTO.COM BluetoothとBLEの違いって何ですか?
PCからBluetooth通信でM5Stackにテキストデータを送信する
main.cppに以下のコードを打ち込み、build、uploadしてください。
#include "BluetoothSerial.h" #include <M5Stack.h> BluetoothSerial bts; void setup() { M5.begin(); M5.Lcd.fillScreen(BLACK); M5.Lcd.printf("Paperang Test\n"); Serial.begin(115200); bts.begin("ESP32test"); } void loop() { M5.update(); // ターミナル(or シリアルモニタ)から送信されたものを受け取り、送信ができる if (bts.available()) { String receiveData = bts.readStringUntil(';'); M5.Lcd.println(receiveData); Serial.printf( "rx : %02X\n", bts.read()); bts.print("sendOK"); } delay(1000); }
PC側ではwrite.pyを作成し、以下のコードを打ち込んでください。
import serial serialCommand = "test" #接続 ser = serial.Serial('/dev/tty.ESP32test-ESP32SPP',115200, timeout=3) #書き込み ser.write(serialCommand.encode()) #読み込み string = ser.read(10) print(string) ser.close()
上記を打ち込み、PC上の設定からBluetooth接続を開き「ESP32test」と接続してください。その後pythonを実行するとM5Stack側に”test”が表示されます。
参考になった記事がこちら
[Arduino]Arduinoとpythonでシリアル通信
結果
write.pyを実行すると、Bluetooth通信が行われM5Stack上に”test”が表示されました。
BLEとM5Stackをつなげる
今回は、スマホアプリを使用するのでApp StoreからBLE Scannerをインストールしてください。その後に以下のmain.cppに以下のコードを打ち込みbuildし、uploadしてください。
#include <M5Stack.h> #include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> #include <BLE2902.h> #include "BluetoothSerial.h" // See the following for generating UUIDs: // https://www.uuidgenerator.net/ #define SERVICE_UUID "7075698b-7bbb-48bb-aacb-73c5abfd323f" #define CHARACTERISTIC_UUID "f2468434-40ff-47a7-b2d4-4e584ab1e522" BLEServer* pServer = NULL; BLECharacteristic* pCharacteristic = NULL; bool deviceConnected = false; BluetoothSerial bts; class MyServerCallbacks: public BLEServerCallbacks { //接続されたらconnectをM5に表示 void onConnect(BLEServer* pServer) { M5.Lcd.println("connect"); deviceConnected = true; }; //切断されたらdisconnectをM5に表示 void onDisconnect(BLEServer* pServer) { M5.Lcd.println("disconnect"); deviceConnected = false; } }; class MyCallbacks: public BLECharacteristicCallbacks { //BLE ScnanerがM5からのデータを読み込む値をセット void onRead(BLECharacteristic *pCharacteristic) { M5.Lcd.println("read"); pCharacteristic->setValue("Hello World!"); M5.Lcd.println("Hello World!!!!"); } //BLE ScannerからM5に書き込む値をセット void onWrite(BLECharacteristic *pCharacteristic) { M5.Lcd.println("write"); std::string value = pCharacteristic->getValue(); M5.Lcd.println(value.c_str()); } }; void setup() { M5.begin(); M5.setWakeupButton(BUTTON_A_PIN); M5.Lcd.println("BLE start."); Serial.begin(115200); m5.Speaker.mute(); //BLE Scannerに表示される名前 BLEDevice::init("m5-stack"); bts.begin("m5-stack"); //接続 BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); //データの読み込み BLEService *pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE ); pCharacteristic->setCallbacks(new MyCallbacks()); pCharacteristic->addDescriptor(new BLE2902()); pService->start(); BLEAdvertising *pAdvertising = pServer->getAdvertising(); pAdvertising->start(); } void loop() { if(M5.BtnA.wasPressed()) { M5.powerOFF(); } if (deviceConnected) { if(M5.BtnB.wasPressed()) { M5.Lcd.println("Button B pressed!"); pCharacteristic->setValue("Button B pressed!"); pCharacteristic->notify(); } } M5.update(); }
参考になった記事がこちら
M5StackでBLEを使う
開発視点のBLE超入門
結果
BLE Scannerからの書き込み、M5Stack中央のボタンを押すことによって動作を確認することができます。