【エッジコンピューティングであそぼう】M5Stack④Bluetooth、BLEでテキストデータの送受信してみた(Arduino言語)

  • このエントリーをはてなブックマークに追加
  • LINEで送る

 こんにちは!てくいのタチキです。今回は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中央のボタンを押すことによって動作を確認することができます。

SNSでもご購読できます。