TOPに戻る

リモート電圧計を作る ⑤ BLEセントラルをラズパイで<その1>BLEの接続

 前回までに、AE-ESP32-WROOM-32E-MINIボードにA-Dコンバータをつなぎ、その電圧を送信するBLEペリフェラルを作りました。ここではラズパイでそのデータを受けるセントラルを作ります。

 ラズパイ4は、sudo apt-get updatesudo 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()

連載 リモート電圧計を作る

(1) BLEペリフェラル 使用するのはM5STAMP C3<その1>

(2) BLEペリフェラル 使用するのはM5STAMP C3<その2>

(3) BLEペリフェラル 使用するのはAE-ESP32-WROOM-32E-MINI<その1>

(4) BLEペリフェラル 使用するのはAE-ESP32-WROOM-32E-MINI<その2>

(5) BLEセントラルをラズパイで<その1>BLEの接続

(6) BLEセントラルをラズパイで<その2>Webへ出力