🏃‍♂️

micro:bitの情報をラズパイで取得しよう

2022/08/10に公開

💡はじめに

micro:bitには、加速度センサーやボタンが搭載されています。

  • 加速度センサー
  • 温度センサー
  • ボタンA/B

↑のデータを取得する方法について記載します。

🔧パーツ一覧

no 部品名 個数 備考
1 ラズベリーパイ 1 今回は4Bで確認
2 マイクロビットV2 1 秋月電子通商

接続図

回路図はありません。ble経由でデータを受信します。

💻環境

開発環境

  • ラズベリーパイ
    • Linux 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux
  • Python
    • Python 3.9.2 (default, Feb 28 2021, 17:03:44)

ラズベリーパイの設定

特になし

モジュールのインストール

apt

以下を実施します。

$ sudo apt-get update
$ sudo apt-get install libglib2.0-dev

pip

$ python -m venv env
$ source env/bin/activate
(env)$ pip install bluepy
(env)$ pip install gattlib

📝手順

micro:bitセットアップ後、ラズベリーパイから接続を確認します。

micro:bit側の準備

プロジェクトの作成/設定

下記のサイトから、micro:bitのプログラムを作成できます。

https://makecode.microbit.org/

  • "新しいプロジェクト"を選択
  • プロジェクト名を入力し、"作成"
  • "拡張機能"から、bluetoothブロックを追加する
    • "拡張機能"を選択する
    • 検索ボックスで"ble"と検索後、"microbit-pxt-blehid"を選択
    • "Bluetooth"が追加される
  • Bluetoothの設定を変更する
    • 歯車のアイコンから、"プロジェクトの設定"を選択する
    • "No Pairing Required:Anyone can connect via Bluetooth"にチェックし、"保存"を選択する

micro:bitのプログラム

下記とします。

micro:bitのダウンロード

  • ↓よりダウンロードを行い、書き込みます

書き込みの詳細手順は、下記ページの"PCから転送する"に記載されています

https://microbit.org/ja/get-started/first-steps/set-up/


ラズパイ側

  • microbitのアドレスを確認
  • サービスの指定
  • データの取得

microbitのアドレスを確認

下記のコードをsudoで実行し、microbitのアドレスを確認します。

display_device.py
import bluepy

def main():
    scanner = bluepy.btle.Scanner(0)
    devices = scanner.scan(3)

    for device in devices :
        print("<" * 20)
        print(f"address  : {device.addr}")
        print(f"RSSI     : {device.rssi}")
        print("Adv data :")
        for (adtype, desc, value) in device.getScanData() :
            print(f"-> ({adtype}) {desc}  : {value}")

if __name__ == "__main__":
    main()
  • 実行例
$ sudo ./env/bin/python display_device.py
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
address  : e8:26:d5:01:23:45
RSSI     : -53
Adv data :
 (1) Flags  : 06
 (9) Complete Local Name  : BBC micro:bit [vizag]
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

↑の結果から、microbitの固有アドレスが"e8:26:d5:01:23:45"となります。
以降、このアドレスをベースに接続を行います。

micro:bitサービスの確認

microbitが提供しているbluetoothサービスの一覧は、下記のページに記載されています。

https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html

今回使用するサービスは以下となります。

Item UUID Note Format
ACCELEROMETER SERVICE E95D0753251D470AA062FA1922DFA9A8 加速度センサー -
ACCELEROMETER SERVICE - CHARACTERISTICS E95DCA4B251D470AA062FA1922DFA9A8 加速度センサー キャラクタデータ X, Y and Z axes as 3 signed 16 bit values.
Button Service E95D9882251D470AA062FA1922DFA9A8 ボタン -
Button Service - Button A State E95DDA90251D470AA062FA1922DFA9A8 ボタンAの状態 0:not pressed, 1:pressed, 2:long
Button Service - Button B State E95DDA91251D470AA062FA1922DFA9A8 ボタンBの状態 0:not pressed, 1:pressed, 2:long
TEMPERATURE SERVICE E95D6100251D470AA062FA1922DFA9A8 温度センサー -
TEMPERATURE SERVICE - CHARACTERISTICS E95D9250251D470AA062FA1922DFA9A8 温度センサーキャラクタデータ Signed integer 8 bit value in degrees celsius.

データの取得

read_mbit.py
from bluepy.btle import DefaultDelegate, Peripheral,ADDR_TYPE_RANDOM

# 自分の環境合わせて変更してください
MAC_ADDRESS = 'xx:xx:xx:xx:xx:xx'

#ACCELEROMETER SERVICE/CHARACTERISTICS UUID
ACC_SERVICE_UUID = 'E95D0753251D470AA062FA1922DFA9A8'
ACC_CHARACTERISTICS_UUID = 'E95DCA4B251D470AA062FA1922DFA9A8'

#BUTTON SERVICE/BUTTON A CHARACTERISTICS UUID
BTN_SERVICE_UUID = 'E95D9882251D470AA062FA1922DFA9A8'
BTN_A_CHARACTERISTICS_UUID = 'E95DDA90251D470AA062FA1922DFA9A8'
BTN_B_CHARACTERISTICS_UUID = 'E95DDA91251D470AA062FA1922DFA9A8'

#TEMPATURE SERVICE/CHARACTERISTICS UUID
TMP_SERVICE_UUID = 'E95D6100251D470AA062FA1922DFA9A8'
TMP_CHARACTERISTICS_UUID = 'E95D9250251D470AA062FA1922DFA9A8'


def main():
    # 接続設定
    peripheral = Peripheral(MAC_ADDRESS, ADDR_TYPE_RANDOM)
    # - 加速度センサー
    acc_service = peripheral.getServiceByUUID(ACC_SERVICE_UUID)
    acc_characteristic = peripheral.getCharacteristics(uuid=ACC_CHARACTERISTICS_UUID)
    # - ボタン
    btn_service = peripheral.getServiceByUUID(BTN_SERVICE_UUID)
    btn_A_characteristic = peripheral.getCharacteristics(uuid=BTN_A_CHARACTERISTICS_UUID)
    btn_B_characteristic = peripheral.getCharacteristics(uuid=BTN_B_CHARACTERISTICS_UUID)
    # - 温度センサー
    tmp_service = peripheral.getServiceByUUID(TMP_SERVICE_UUID)
    tmp_characteristic = peripheral.getCharacteristics(uuid=TMP_CHARACTERISTICS_UUID)

    while True:
        print("<" * 20)

        # 値の読み取り
        acc_read_data = acc_characteristic[0].read()
        btna_read_data =btn_A_characteristic[0].read()
        btnb_read_data =btn_B_characteristic[0].read()
        tmp_read_data = tmp_characteristic[0].read()

        # 加速度センサー
        x = int.from_bytes(acc_read_data[0:2], byteorder='little', signed=True)
        y = int.from_bytes(acc_read_data[2:4], byteorder='little', signed=True)
        z = int.from_bytes(acc_read_data[4:6], byteorder='little', signed=True)

        # 加速度の表示
        print(f"ACCELEROMETER - x:{x}, y:{y}, z:{z}")

        # ボタン状態の表示
        print(f"btn A:{btna_read_data[0]}")
        print(f"btn B:{btnb_read_data[0]}")

        # 温度の表示
        print(f"temp:{tmp_read_data[0]}")



if __name__ == "__main__":
    main()
  • 実行結果例
(env) $ python read_mbit.py 
略
<<<<<<<<<<<<<<<<<<<<
ACCELEROMETER - x:-168, y:40, z:-844
btn A:0
btn B:0
temp:32
<<<<<<<<<<<<<<<<<<<<
ACCELEROMETER - x:-184, y:248, z:-1016
btn A:0
btn B:1
temp:33
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ACCELEROMETER - x:100, y:-16, z:-1028
btn A:0
btn B:2
temp:33
<<<<<<<<<<<<<<<<<<<<
ACCELEROMETER - x:80, y:-16, z:-1024
btn A:0
btn B:2
temp:33
<<<<<<<<<<<<<<<<<<

さいごに

今回は、情報の取得でしたが、LEDの制御などいろいろなことに応用できそうです。

この記事も含め、ラズパイの活用方法を

https://zenn.dev/kotaproj/books/raspberrypi-tips

としてまとめ中です。

GitHubで編集を提案

Discussion