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文字程度しか送れないようです。