2019年12月2日月曜日

Raspberry PiからBluetooth経由でmicro:bitのボタン状態の通知を取得する

Raspberry PiからBluetooth経由でmicro:bitのボタン状態の通知を取得するには、以下の手順を実行します。

1. Raspberry Piにbluepyをインストール
bluepyをRaspberry Piにインストールするの手順で、bluepyをインストールします

2. micro:bitでbluetoothサービスを使用するプログラム作成
以下のような感じで一通りのbluetoothサービスを最初に追加します
また、ペアリングをしなくても利用できるようにします
※6桁キーでペアリングしたい場合は「6桁のキーでmicrobitとRaspberry PiをBluetoothペアリングする」を参照してください。

3. microbitのボタン状態の通知を取得するプログラム
buttonnotify.py
import sys
import time
from bluepy import btle

class MyDelegate(btle.DefaultDelegate):
  def __init__(self, chA, chB):
    btle.DefaultDelegate.__init__(self)
    self.loop = True
    self.chA = chA
    self.chB = chB
    self.stateA = 0
    self.stateB = 0

  def handleNotification(self, hd, data):
    print("notification: {},{}".format(hd,ord(data)))
    if hd == 45:
      self.stateA = ord(data)
    if hd == 48:
      self.stateB = ord(data)
    if self.stateA == 2 and self.stateB == 2:
      print("exit...")
      self.loop = False

per = btle.Peripheral("XX:XX:XX:XX:XX:XX", btle.ADDR_TYPE_RANDOM)

# Button Service
svcButton = per.getServiceByUUID("e95d9882-251d-470a-a062-fa1922dfa9a8")
# Button A State
chA = svcButton.getCharacteristics("e95dda90-251d-470a-a062-fa1922dfa9a8")[0]
ch_cccd=chA.getDescriptors(forUUID=0x2902)[0]
ch_cccd.write(b"\x01\x00", False)

# Button B State
chB = svcButton.getCharacteristics("e95dda91-251d-470a-a062-fa1922dfa9a8")[0]
ch_cccd=chB.getDescriptors(forUUID=0x2902)[0]
ch_cccd.write(b"\x01\x00", False)

dg = MyDelegate(chA, chB)
per.setDelegate( dg )

while dg.loop:
  if per.waitForNotifications(0.1):
    continue

4. microbitのボタン状態の通知を取得するプログラムの実行
$ python3 buttonnotify.py
notification: 48,1
notification: 48,2
0はボタンを押していない状態、1で押した状態、2で長押し状態を示します。AボタンとBボタンを長押し状態にするか、Ctrl+Cでプログラムを終了します。

〇参考情報
Bluetooth Developer Studio Level 3 Profile Report


0 件のコメント:

コメントを投稿