概要
Arduino-ESP32でBLEのエコーバック(受信したデータをそのまま送信して返す)をするシンプルなアプリケーションを作りました。
ArduinoIDEに入っているサンプルアプリケーションをちょい変するだけでサクっと作れました。
使用したもの
- M5Stick-C ※Arduino-ESP32対応デバイスであれば何でもよいと思います
- Arduino IDE(バージョン1.8.5を使用)
- Nexus 7 (2013) ※nRF UART 2.0を使用できるBLE対応のAndroid 端末であれば何でもよいと思います
- nRF UART 2.0(Androidアプリ)
作成&動作手順
-
スケッチ(githubに置きました)をM5Stick-Cに書き込みます
※Arduinoの設定に注意が必要です!(下記の「ポイント2」参照) -
Androidアプリ(nRF UART 2.0)をAndroid端末にインストールして起動します
Arduinoのスケッチ
Arduinoのスケッチはgithubに置いたコードの通りです。Arduino IDEの「スケッチの例」に入っている「BLE_uart」をベースにして変更しました。
ポイントは以下の2つです。
ポイント1
最初のポイントは、Mutexを使ったということです。
BLEの受信処理(コールバック)で取得したデータを送信処理(メインループ)にて使用します。その2つの処理で共通して使用するデータ(bleDataIsReceived, storedValue)をMutex(storeDataMux)を使用して排他制御をすることで、データ利用のバッティングを防ぎます(参考記事)
boolean bleDataIsReceived;
std::string storedValue;
portMUX_TYPE storeDataMux = portMUX_INITIALIZER_UNLOCKED;
ポイント2
ポイント2は、プログラム領域のパーティション設定をOTAを使わないものに変えたことです。
デフォルトのパーティション設定のままコンパイルすると、「スケッチが大きすぎます。・・・・」とエラーになってしまいます。そのため、Partition Schemeの設定値としてOTAを使用しないようにしました(下図の「Arduinoの設定」参照)。
Arduino-ESP32では、デフォルトでOTA領域(無線のプログラム書き込み用領域)を確保しています。しかし、BLEのライブラリを利用するようなプログラムサイズが大きいものでは納まりきらないようです。今回はOTAを行うアプリケーションではないので、この対処方法で問題ないと判断しました。
終わりに
これまでESP32でBluetoothをあまり使用したことがありませんでしたが、サンプルのスケッチを使用して送受信が思いのほか簡単にできました。
これはArduinoのサンプルスケッチと使用したAndroidアプリの親和性が大きいことが一番大きな要因だと思います。Androidアプリを作ったNordicさんに感謝です。
それと、「ポイント1」にも関連するのですが、実はデータを受信する処理とそれを利用する処理がシーケンシャルではないため、受信データを利用する前に次の受信データを取得してしまうと前のデータを利用できなくなったりします。
これについては、受信データの格納先をキューにしたりリングバッファにしたりして、複数のデータを保持できるような仕組みが必要となります。(今後対応するかもしれませんが、必要に駆られないとやらない可能性が大きいです・・・)
見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・。)
参考記事
- [電子工作]ESP32の使い方
- http://galaxystar.image.coocan.jp/esp32.htm
更新履歴
- 2019-09-11:新規作成