CircuitPython 10行プログラミング Step4 (5) BLE②セントラル
Adafruit Feather nRF52840 Senseボードを使って、前回、ペリフェラルのプログラムを実行しました。搭載されているセンサBMP280の温度と気圧を送ります。
次のプログラムは、前回のプログラムにlocal nameを追加しました。
from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService import board import adafruit_bmp280 import time ble = BLERadio() ble.name ="Feather nRF52840 Express S" uart = UARTService() advertisement = ProvideServicesAdvertisement(uart) i2c = board.I2C() bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c) while True: ble.start_advertising(advertisement) while not ble.connected: pass while ble.connected: #print('connected ') #print(bmp280.temperature, bmp280.pressure) uart.write('{:.1f}`C, {:.0f}hPa'.format(bmp280.temperature, bmp280.pressure)) time.sleep(1)
●Adafruit Feather nRF52840でセントラル
Adafruit Feather nRF52840 Senseボードとほぼ同じ構成のAdafruit Feather nRF52840ボードで、Senseボードの温度と気圧をBLE経由で読み取ります。
ペリフェラルの動作をするAdafruit Feather nRF52840 Senseボードは、JSTコネクタにLi-Po電池を取り付け、近くで動かしておきます。約3m以内で、コネクトできました。
オン・セミコンダクターのBLEモジュールとRSL10 Bluetooth Low Enaergy Exploerを使って情報を見ます。セントラルの立場です。
情報を確認したら、Disconnectします。
セントラルのプログラムを動かすAdafruit Feather nRF52840ボードを、PCとUSBケーブルでつなぎます。
●プログラム
from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService import time ble = BLERadio() ble.name ="Feather nRF52840 Express" uart_connection = None # See if any existing connections are providing UARTService. if ble.connected: for connection in ble.connections: if UARTService in connection: uart_connection = connection break while True: if not uart_connection: print("Scanning...") for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5): if UARTService in adv.services: print("found a UARTService advertisement") print(adv.address, adv.rssi) print(adv.complete_name, adv.tx_power) uart_connection = ble.connect(adv) print(uart_connection) break # Stop scanning whether or not we are connected. ble.stop_scan() while uart_connection and uart_connection.connected: print('connected ') data = uart_connection[UARTService].readline() print(data) #uart_connection.disconnect() time.sleep(1)
実行中の画面です。正しくデータ(温度と気圧)を読んできた後、読めなくなったり、また読めたりと不安定な動作になりました。
RSL10 Bluetooth Low Enaergy Exploerでは、ほぼずっと安定に読み出しています。ただ、時々、データが更新されないことがあります。
したがって、次のような動作をしているように推測できます。
- ペリフェラルのAdafruit Feather nRF52840 SenseボードのBLEはほぼ安定してデータを送っている
- セントラルのAdafruit Feather nRF52840 ボードのBLEはあまり安定した動作をしていない
ベータ版も最初のバージョンなので不具合が見つかっていないのか、プログラムが正しく記述できていないのか、原因ははっきりしません。