お手軽組み込み開発ツールでおなじみのESP32。
ここでは、BLE通信機能のサンプルソース「BLE_Uart」についてわかりやすく解説したいと思います。
BLE_Uartは、文字を使って、スマホなどと送受信できる内容となっておりますよ。
BLEって?Uartって?
BLE(びーえるいー)は、Bluetooth Low Energyの略になり、その名の通り、無線であるBluetooth(ぶるーとぅーす)の省エネ版になります。 Bluetoothバージョン4.0以上から対応しております。
Uart(ゆーあーと)は、Universal Asynchronous Receiver Transmitterの略になり、通信仕様みたいなもので、文字通信が行えるよって意味になります。組み込み開発をしたことがある人にはおなじみなのですが、特に気にする必要はありません。
と言いますのは、どちらも土台(ライブラリ)は用意されておりますので、ESP32側としましては、ただ扱うだけと思って頂ければと思います。
サンプルソースBLE_Uartの動きを確認してみる
まぁ、文字でごにょごにょ説明するよりかは、実際に動きを見てみたほうが早い。
開発環境は、「Arduino IDE」を使います。インストールやセットアップ・書込み方法などは省略します。以下をご参考ください。
サンプルプログラムの読み出し
「Arduino IDE」 より、
メニュー[ファイル]-[スケッチ例]-[ESP32 BLE Arduino]-[BLE_uart]を選択します。
とりあえず動かしてみましょう。(解説はのちほど)
アプリのインストール
スマホにアプリをインストールします。
「Serial Bluetooth Terminal」が、客観的にみても使いやすいと思います。
(まぁ、通信の確認が出来ればどのアプリでも何でも良いです。)
ESP32にプログラム書込み
ESP32をUSBで接続します。
ESP32にプログラムを書き込んで実行してみます。
書き込みが成功したら、そのまま動作します。
スマホアプリの操作
スマホアプリ 「Serial Bluetooth Terminal」 より、
メニューより、[Device]-[Bluetooth LE]タブを選択します。
(ちなみにBluetooth Classicは、旧バージョン(2.0)のBluetooth向けになってます。)
「SCAN」ボタンを押すと、「UART Service」という名前がリストに表示されるので、選択してみましょう。
選択すると、自動で接続されます。
すると、バグったかのように、大量のデータが、わっしゃ~っと受信&画面に表示され続けます。
ご心配なさらず、あわてずに・・・こういうサンプルプログラムです。
動きとしては以上です^^;
さっそくソースコードの解説をしたいと思います。
サンプルソースの解説
ESP32で文字送信している箇所
まず以下の部分について、一言でいいますと、setValueに投げる文字データを設定したら、notifyでBLE送信する。という流れになっております。
(中略)
void loop() {
// Bluetoothに接続されていると、このif文の中に入ります。
if (deviceConnected) {
// ここで、投げるデータを決定してます。(値「txValue」の1バイトを投げます)
pTxCharacteristic->setValue(&txValue, 1);
// 次で実際に送信を行っております。
pTxCharacteristic->notify();
// データ(txValue)を変えてます。
txValue++;
delay(10); // bluetooth stack will go into congestion, if too many packets are sent
}
(中略)
ESP32で文字受信している箇所
次は受信を確認したいと思います。
(ちょっと、送信メッセージがうざいのでコメント化しますね。)
if (deviceConnected) {
// ★コメント化
// pTxCharacteristic->setValue(&txValue, 1);
// pTxCharacteristic->notify();
// txValue++;
// delay(10); // bluetooth stack will go into congestion, if too many packets are sent
}
ESP32を書き換えて実行します。
右上の虫眼鏡ボタンを押して、デバッグターミナルを表示します。ボーレートは「115200」を選びます。
スマホより、画面下にテキストボックスがあるので、そこに文字を入れて、横の送信ボタンを押します。
ESP32のデバッグターミナルに、さきほど送信した文字が表示されました。
これは、getValueという関数で受信データを取得して、Serial.print関数でデバッグターミナルに表示しているためです。
(中略)
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
// 受信データを取得
std::string rxValue = pCharacteristic->getValue();
// データ有り
if (rxValue.length() > 0) {
// 受信データをデバッグターミナルに表示
Serial.println("*********");
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++){
Serial.print(rxValue[i]);
}
Serial.println();
Serial.println("*********");
}
}
};
おまけに
最後おまけに
以下のコードを追加して動かしてみましょう。
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
Serial.println("*********");
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++){
Serial.print(rxValue[i]);
}
Serial.println();
Serial.println("*********");
// ★ここを追加。
pTxCharacteristic->setValue(rxValue);
pTxCharacteristic->notify();
delay(10); // bluetooth stack will go into congestion, if too many packets are sent
// ★ここまで。
}
}
};
スマホより、文字を入れて、送信ボタンを押します。
すると、スマホ画面の受信エリアに、さきほど入力した文字が表示されました。
これは、さきほど追加したコードは、受信した文字をそのまま返信する処理になります。
(コールバック・オウム返しするようになります)
最後に
これをもとに、いろいろカスタマイズすると良いかもしれません。
自分で好きなメッセージフォーマットを定義して、そのフォーマットしか通信を受け付けないようにすることも可能です。
なぜこんな動きになっているのか、なぜこのイベント関数が呼ばれているのか等は、setup()関数内でいろいろごちゃごちゃ設定しているので、あとはご自身で調べてみると良いでしょう。
最後まで見てくれてありがとう。