CircuitPython 10行プログラミング Step4 (4) BLE①ペリフェラル

 BLEの通信を行います。ライブラリでは、サービスやキャラクタリスティックなどが記述されています。しかし、サンプルではApple関連と、NordicのUARTサービスを使った事例しかありません。CircuitPython 5.1.0でBLEを使ったことがあります。こちらを参照してください。現在利用している6.0.0 Beta 0では、HIDデバイスに対応しました。

 サンプルの中には、ラズパイを動かし、CircuitPythonのプログラムからセンサ・データを送るadafruit_ble_broadcastnetライブラリがあります。これは、5.xのころから開発が始まり、随時サンプルが増えています。

ble_uart_echo_test.pyをベースにペリフェラルの実験

 PCにコピーしたexamplesの中からble_uart_echo_test.pyのプログラムをエディタMuにコピーし、code.pyで保存します。Muのシリアルをクリックして、保存をクリックすると実行します。

 オン・セミコンダクターのBLEであるRSL10 Bluetooth Low Enaergy Exploerを使って情報を見ます。セントラルの立場です。connectで接続し、Discover Serviceでサービスを表示しました。

 一番下の表示されているのがUARTサービスのUART-Txのキャラです。ここに123と入力し、Write Reqを押して書き込みをします。赤色で囲った部分です。

 実行したMuの画面です。123が送られてきました。

 最後の3が送り返された様子が、緑で囲った3です(RSL10 Bluetooth Low Enaergy Exploerの画面)。

センサのデータを送る

 前回のセンサの値を読み出した中で、BMP280の部分を上記のプログラムに追加します。

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 struct
import time

ble = BLERadio()
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} {:.0f}'.format(bmp280.temperature, bmp280.pressure))
        time.sleep(3)

 Muの実行中の様子です。

 RSL10 Bluetooth Low Enaergy Exploerの画面です。温度と気圧が送られています。

 PCとつないでいるUSBケーブルを抜き、JSTの電源コネクタにLi-Po電池をつないでも、同様に温度と気圧を送ってきます。