CircuitPython 10行プログラミング Step8 (3) 6軸IMU LSM6DS3TR-CとBLE

 前回、マイコン・ボードに搭載されているIMUから、加速度とジャイロ・データをライブラリを使って読み出しました。ここでは、BLEペリフェラルになって、それらのデータを送信します。

(2022/06/30) Macでマウントされなくなることがたびたび起こります。その時は、Windows10にもっていくと、正常にマウントできることがあります。

ライブラリ

 ダウンロードしてデスクトップに置いたフォルダの中のlibに入っているフォルダadafuit_bleをCIRCUITPYのlibへコピーします。

プログラム


# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
import struct
import time
import board
import digitalio
import busio
from adafruit_lsm6ds.lsm6ds3trc import LSM6DS3TRC

ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)

# On the Seeed XIAO nRF52840 Sense the LSM6DS3TR-C IMU is connected on a separate
# I2C bus and it has its own power pin that we need to enable.
imupwr = digitalio.DigitalInOut(board.IMU_PWR)
imupwr.direction = digitalio.Direction.OUTPUT
imupwr.value = True
time.sleep(0.1)

imu_i2c = busio.I2C(board.IMU_SCL, board.IMU_SDA)
sensor = LSM6DS3TRC(imu_i2c)

print('start')
ble.name = 'XIAO LSM6DS3TRC'

while True:
    ble.start_advertising(advertisement)
    while not ble.connected:
        pass
    ble.stop_advertising()
    print('connected ')

    while ble.connected:
        uart.write("A:%.2f %.2f %.2f" % sensor.acceleration)
        time.sleep(1)
        uart.write("G:%.2f %.2f %.2f" % sensor.gyro)
        print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (sensor.acceleration))
        print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (sensor.gyro))
        print("")
        time.sleep(1)

  実行中の様子です。

 BLEセントラルとして利用しているのは、onsemiのRSL10 Bluetooth Low Energy Explorerです。Notificationをチェックすると、キャラクタリスティックUUIDの6E400003-B5A3-F393-E0A9-E50E24DCCA9Eに、テキストで加速度とジャイロのデータが1秒ごとに交互に送られてきています。

バッファ

 一度で加速度とジャイロ・データを送ろうとしました。


    while ble.connected:
        data = sensor.acceleration
        data = data + sensor.gyro
        uart.write("%.2f %.2f %.2f %.2f %.2f %.2f" % (data[0],data[1],data[2],data[3],data[4],data[5]))
        print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (sensor.acceleration))
        print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (sensor.gyro))
        print("")
        time.sleep(1)

 しかし、二度に分割して送られます。

07:59:22.693 INFO GATT Notification (Connection:0x00 Handle:0x1E UUID:6e400003-b5a3-f393-e0a9-e50e24dcca9e Value:0x2D302E3530202D382E3535202D342E363520302E)
07:59:23.203 INFO GATT Notification (Connection:0x00 Handle:0x1E UUID:6e400003-b5a3-f393-e0a9-e50e24dcca9e Value:0x3032202D302E3031)

 ソースを見ると、buffer_size=64になっており、一度に16文字程度しか送れないようです。