プログラム

初心者向け|ESP32サンプルソース解説「BLE_Uart」

お手軽組み込み開発ツールでおなじみの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()関数内でいろいろごちゃごちゃ設定しているので、あとはご自身で調べてみると良いでしょう。

最後まで見てくれてありがとう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA