初めてのBLE (1) 実験環境
昔、すでにインテルが放棄してしまったCurieを搭載したArduino 101にBLE(Bluetooth Low Enaergy)のCurieBLEライブラリが用意されていました。
その後、ESP32モジュールNINA-W102を搭載した、
- Arduino MKR WiFi 1010
- Arduino Uno WiFi Rev2 board
- Arduino Nano 33 IoT
が発売され、Wi-FiはWiFiNINAライブラリ、BLEはArduinoBLEライブラリが用意されました。最近、nanoシリーズに、Nordic SemiconductorsのnRF52840を内蔵したNINA-B306モジュールを搭載した、
- Arduino Nano 33 BLE
- Arduino Nano 33 BLE Sense
も ArduinoBLEライブラリでサポートされるようになりました。
現在、いずれのNINAモジュールも技適が取れていますが、技適コードを可能な限りどこかに表示しなければならないという電波法には従っていないということで、日本国内では販売されていません。技適コードを表示してない機器は、たとえばスマホの数百万台が国内で販売されてはいるのですが。
●BLE
Bluetoothは、近距離無線通信の規格としては古く、あらゆる機器で利用できるように規格が拡張されたため、規格書の内容は膨大です。2台のBLE機器が存在する場合、次のような関係になります。Windows10マシンは、BLEの情報を見るためのツールを動かしています。Bluetoothバージョン4.xからは、BLEという略称がよく使われます。
サンプル・スケッチArduinoBLE-Peripheral-LEDを「ペリフェラル」で、サンプル・スケッチArduinoBLE-Central-Peripheral Explorerを「セントラル」で動かします。
- 自分のまわりにあるBLEデバイスを探索する「ペリフェラル」は、自分は「LED」だと名乗っている。
- 「LED」と名乗っているBLEデバイスを探しているのが「セントラル」
まるで、「ペリフェラル」がサーバで、「セントラル」がクライアントの関係にも見えます。
●「ペリフェラル」Arduino Nano 33 BLE Sense
「ペリフェラル」で動くスケッチLEDでは、
- ledService("19B10000-E8F2-537E-4F6C-D104768A1214") <-長い文字列はオリジナルのサービスの認識用UUIDを定義する。
- setLocalName("LED")<-名乗る(=アドバタイズする)ときのlocal nameをLEDとし、
- setAdvertisedService(ledService)<-UUIDにひもづける
- addCharacteristic(switchCharacteristic)<-キャラはスイッチ・タイプだ
- addService(ledService)<-サービスの一つに追加する。複数のサービスが集まってサーバ自体になる
- switchCharacteristic.writeValue(0)<-キャラの初期値は0=OFF
- advertise()<-アドバタイズを開始
ここまでなら一般的なサーバなのですが、次のように、「セントラル」がつながったときの処理も記述します。まるで、Webサーバのようですね。
- central()<-「セントラル」が接続しに来るのをリッスン
- Serial.println(central.address())<-接続したら、「セントラル」のMACアドレスを印刷
- if (switchCharacteristic.written())<-キャラのスイッチのデータがあって、
- if (switchCharacteristic.value())<-その値が0より大きければ、
- Serial.println("LED on")<-LED onと印刷して、
- digitalWrite(ledPin, HIGH)<-LEDを点灯する
「ペリフェラル」のシリアルモニタの様子です。「セントラル」のスケッチPeripheral ExplorerではLEDをONしていないので、「セントラル」Arduino Nano 33 IoTのMACアドレスだけが表示されています。
次の実行例は、「セントラル」(Arduino Nano 33 IoT)で動かしているPeripheral Explorerのシリアルモニタの様子です。
ledService("19B10000-E8F2-537E-4F6C-D104768A1214")以外に、二つのサービスUUID=1800と1801が登録されていることがわかります。
このときの状態を、オン・セミコンダクターのBLEであるRSL10 Bluetooth Low Enaergy Exploerを使って情報を見ます。Local NameがLEDのサービスが見つかりました。