10分でできる Arduino ESP32を使った簡単BLE送信実験

開発環境 Arduino core for ESP32 WiFi chipを使ってBLEを送信するサンプルを作成してみました。超簡単なスケッチ&実験なので、ESP32をお持ちの方は試してみてください。RN4020よりも安価なESP-WROOM-32を使って、BLEの実験を行ってみましょう。
ふと、ESP32用のBLE通信の情報をネットで検索してみたところ、開発環境にArduino IDEを使ったサンプルが見当たらないことが判明しました。Arduino IDE版では、いまのところビーコン送信(BLE Advertising)しかできないからだと思います。とはいえ、ビーコン送信だけでもセンサ値の送信くらいなら可能です。また、とても簡単なスケッチ(プログラム)で、BLE送信することが出来るのです。

10分でできる Arduino ESP32を使った簡単BLE送信実験

※10分でできる:開発環境のセットアップ時間は除きます。また個人差があります。
下図はRaspberry Piで受信した時のようすです。
ESP32内蔵のホールセンサから得られた値を約3秒ごとにBLE送信し、ビーコンをRaspberry Piで受信してみた時のようす。各行の末尾の数字がセンサの読み値(100サンプルの平均)。

BLEって何? Bluetoothとは違うの?

BLEはBluetooth 4.0でサポートされた Bluetooth Low Energy と呼ばれるプロトコルです。従来のクラッシックBluetoothとの互換性はありませんが、超低消費電力動作が可能です。Bluetooth Smartの名称で普及が促進されており、現在販売されているほぼ全てのスマートフォン、Raspberry Pi 3、Zero W、USBアダプタ(例:プラネックスコミュニケーションズ製のBT-Micro 4)等でサポートされています。
Raspberry PiのLXTerminalで以下のコマンドを実行すると、ビーコンを受信することが出来ます。Raspberry Pi 3、Zero W以外をお使いの場合は、プラネックスコミュニケーションズ製のBT-Micro 4をUSB端子に接続してから実行してください。

$ sudo hcitool lescan –pa –du

「LE Scan …」が表示されない場合は、BluetoothをONにしてください。

$ sudo hciconfig hci0 up

少し、古いですが、BLEタグと呼ばれるビーコン送信を行う製品も発売されています。
市販のBLEタグ。使い方は、XBee ZigBeeモジュールなどを使ったワイヤレス機器のサンプル集「Wi-Fi/Bluetooth/ZigBee無線用Raspberry Piプログラム全集(出版元=CQ 出版社・著者=国野亘)」を参考にしていただければ幸いです。https://www.amazon.co.jp/dp/4789842231

ESP32用開発環境Arduino ESPのセットアップ方法

既に、より良い記事がさまざまなところで紹介されていますが、ボクが過去に作成した中途半端なものでも(我慢して)読んでいただけるという方は、下記をご覧ください。

磁気センサ(ホール効果センサ)の読み値をBLE送信する

以下にサンプル・スケッチを示します。ble.beginでBLEのビーコンに含めたいテキストを設定し、ble.endで送信を停止します。 hallReadは、ホールセンサの値を読み取る命令です。以前に動作確認した時に、平均化しないと使い物にならなかったので、100回平均を行っています。執筆時点のライブラリでは、ble.beginとble.endの間に、ビーコン送信待ち時間50ms~100msのdelayが必要でした。
#include "SimpleBLE.h"
SimpleBLE ble;
void setup() {
    delay(10);
    ble.begin("BLE Hall Effect Sensor");
    delay(50);
    ble.end();
}
void loop() {
    int hall=0,i;
    for(i=0;i<100;i++) hall += hallRead(); hall/=100;
    String out = "ehall_1," + String(hall,DEC);
    ble.begin(out);
    delay(50);
    ble.end();
    delay(3000);
}

Raspberry Piで受信する

既に説明した通り、Raspberry Piで受信するには以下のコマンドを使用します。lescanはBLEのビーコンを見つけるとMACアドレスとデバイス名を表示する命令です。今回は、ホール効果センサの読み値をデバイス名に含めて送信しているので、冒頭に示した図のように、lescanだけでセンサ値を受信することが出来ます。

$ sudo hcitool lescan –pa –du

ビーコンに含まれる情報を閲覧したい場合はlescan実行中にhcidump命令を使用します。hcidumpをapt-getでインストールし、実行してみてください。
$ sudo apt-get install bluez-hcidump
$ sudo hcidump
hcidumpでESP32からのビーコンを受信すると下図のような結果が表示されます。LE Advertising Reportと書かれている部分が、実際に受信したビーコンの内容です。デバイス名Complete local nameに「ehall_1,33」の受信結果が得られました。このように、デバイス名の中にセンサ値「33」が含まれていることが分かります。
上図の受信結果には、もう一つ興味深い結果が得られています。最後から2行目のUnknown typeの部分はビーコンに含まれる不明なデータです。定義されていない値0x12と、4バイトの不明なデータが本ビーコンに含まれていました。
実際に受信した生データを見たいときは、hcidumpに「-R」オプション(Dump raw data)を付与します。すると、この不明なデータの内容を含む全受信データ列が表示されます(赤文字部分が不明データ)。
$ sudo hcidump -R
> 04 3E 24 02 01 03 00 XX XX XX C4 0A 24 18 02 01 06 0B 09 65
  68 61 6C 6C 5F 31 2C 33 33 02 0A EB 05 1
2 00 02 00 04
C2
赤文字で示したデータ以外については、hcidumpが解析してくれています。「-R」オプションなしの受信結果と比較すれば良いでしょう。
将来的には、このデータ列を開発環境Arduino ESP32から指定できるようになると思います。今後のアップデートに期待しましょう。
ボクにもわかる ESP32
参考文献(というよりも、宣伝です。)
簡単にBLEのビーコンを受信できるスクリプトも準備しました。
by ボクにもわかる電子工作
https://bokunimo.net/