リモート電圧計を作る ⑤ BLEセントラルをラズパイで<その1>BLEの接続
前回までに、AE-ESP32-WROOM-32E-MINIボードにA-Dコンバータをつなぎ、その電圧を送信するBLEペリフェラルを作りました。ここではラズパイでそのデータを受けるセントラルを作ります。
ラズパイ4は、sudo apt-get updateとsudo apt-get upgrade -yで最新の状態にしておきます。
uname -aでバージョンが5.10.63とわかります。
python -Vでバージョンが3.9.2とわかります。
●bluepyのインストール
ここでは、セントラルのプログラムを書くために、bluepyライブラリをインストールします。このBLEライブラリは、pythonでセントラルのプログラムだけが書けます。
$ sudo apt-get install python3-pip libglib2.0-dev
$ sudo pip3 install bluepy
●環境
- ラズパイ Raspberry Pi 4 4GB
- OS Raspberry Pi OS(32ビット)5.10.63
- Python3 3.9.2
- bluepyライブラリ 1.3.0
●scan
BLEペリフェラルがアドバタイジングしているデバイスを見つけるスキャナを動かします。
https://github.com/IanHarvey/bluepy/blob/master/bluepy/blescan.py
をローカルにコピーして実行します。二つ見つけてきました。
アドレス(ここではC4:5B:BE:94:3C:2A)とpublicを控えておきます。
●プログラム
bluepyライブラリは、読み取りのときにエラーを起こす確率が高いです。ここでは、エラーが起これば、ループの先頭に戻して再度データを読みに行きます。
AE-ESP32-WROOM-32E-MINIボードのアドバタイジングを見つけられないときは、ボード上のEN(reset)を押し、再起動させます。
peri.waitForNotifications(1)は、Notifyを要求して1秒待つという記述で、まったく待ちません。ペリフェラル側が必ずnotifyを了解するという処理で、了解しない場合のエラー処理はしていません。
from bluepy import btle
import time
deviceAddr = "C4:5B:BE:94:3C:2A"
SERVICE_UUID = "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
Voltage_CHARACTERISTIC_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8"
peri = btle.Peripheral()
peri.connect(deviceAddr, btle.ADDR_TYPE_PUBLIC)
print('connect')
VoltInformation = peri.getCharacteristics(uuid=Voltage_CHARACTERISTIC_UUID)[0]
peri.waitForNotifications(1)
while 1:
try:
readVdata = VoltInformation.read()
except:
pass
print(float(readVdata))
time.sleep(2)
peri.disconnect()