🏃♂️
micro:bitの情報をラズパイで取得しよう
💡はじめに
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のプログラムを作成できます。
- "新しいプロジェクト"を選択
- プロジェクト名を入力し、"作成"
- "拡張機能"から、bluetoothブロックを追加する
- "拡張機能"を選択する
- 検索ボックスで"ble"と検索後、"microbit-pxt-blehid"を選択
- "Bluetooth"が追加される
- "拡張機能"を選択する
- Bluetoothの設定を変更する
- 歯車のアイコンから、"プロジェクトの設定"を選択する
- "No Pairing Required:Anyone can connect via Bluetooth"にチェックし、"保存"を選択する
micro:bitのプログラム
下記とします。
micro:bitのダウンロード
- ↓よりダウンロードを行い、書き込みます
書き込みの詳細手順は、下記ページの"PCから転送する"に記載されています
ラズパイ側
- 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サービスの一覧は、下記のページに記載されています。
今回使用するサービスは以下となります。
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の制御などいろいろなことに応用できそうです。
この記事も含め、ラズパイの活用方法を
としてまとめ中です。
Discussion