LoginSignup
12
9

More than 3 years have passed since last update.

RaspberryPiからBluetoothでmicro:bitへ接続する

Posted at

Raspberry Pi 4はBluetoothを内蔵しているので、Bluetoothでmicro:bitと接続してみる。

microbitのプログラム

Bluetoothのサービス開始だけをしておく。
2020-02-01-002800_850x630_scrot.png
そしてペアリングしなくてもコネクションできるように設定するために、
プロジェクトの設定から No Paring Required: Anyone can connect via Bluetooth.を有効にしておく。
2020-02-02-203357_898x542_scrot.png

Raspberry Pi

PythonからBluetoothを使うためのbluepyモジュールをインストールする。
% sudo pip3 install bluepy

micro:bitのアドレスを探す。

プログラムはgithubにも置いておく

scan.py
import bluepy

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

for device in devices :
  print("-----------------------------------")
  print("address  : %s" % device.addr)
  print("addrType : %s" % device.addrType)
  print("RSSI     : %s" % device.rssi)
  print("Adv data :")
  for (adtype, desc, value) in device.getScanData() :
    print(" (%3s) %s  : %s " %(adtype, desc, value))

このコマンドだけはroot権限が必要。
% sudo python3 scan.py

-----------------------------------
address  : e4:1e:1f:1f:f4:49
addrType : random
RSSI     : -45
Adv data :
 (  1) Flags  : 06 
 (  9) Complete Local Name  : BBC micro:bit [tazaz] 

これでアドレスが分かった。

UUIDを調べる

アドレスが分かったので、そこへ接続してUUIDを調べる

getHandle.py
import sys
import bluepy

def main() :
  try:
    peri = bluepy.btle.Peripheral()
    peri.connect(devadr, bluepy.btle.ADDR_TYPE_RANDOM)

  except:
    print("device connect error")
    sys.exit()

  charas = peri.getCharacteristics()
  for chara in charas :
    print("------------------------------------------")
    print(" UUID : %s" % chara.uuid )
    print(" Handle %04X : %s" %(chara.getHandle(), chara.propertiesToString()))

  peri.disconnect()

if __name__ == "__main__" :
  if len(sys.argv) == 1:
    print("Usage: getHandle.py BLE_DEVICE_ADDRESS")
    sys.exit()
  devadr = sys.argv[1]

  main()

% python3 getHandle.py e4:1e:1f:1f:f4:49

省略
------------------------------------------
 UUID : e95dd91d-251d-470a-a062-fa1922dfa9a8
------------------------------------------
 UUID : e95d7b77-251d-470a-a062-fa1922dfa9a8
 Handle 0033 : READ WRITE 
------------------------------------------
 UUID : e95d93ee-251d-470a-a062-fa1922dfa9a8
 Handle 0035 : WRITE 
------------------------------------------
省略

すべてのUUIDはここにも載っている https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html

micro:bitのLEDに"Hello"と表示する

LEDのサービスUUIDから、TEXT出力用UUIDを取得して、そこに出力することでLEDに表示が出来る。
プログラムはgithubにも

writeLed2.py
import time
from bluepy import btle

devadr     = "e4:1e:1f:1f:f4:49"

uuid_service_led = "e95dd91d-251d-470a-a062-fa1922dfa9a8"
uuid_led_text    = "e95d93ee-251d-470a-a062-fa1922dfa9a8"


per = btle.Peripheral(devadr, btle.ADDR_TYPE_RANDOM)

svcLed = per.getServiceByUUID(uuid_service_led)
chLedText = svcLed.getCharacteristics(uuid_led_text)[0]
chLedText.write("Hello".encode("utf-8"))
time.sleep(5)

per.disconnect()

実行結果

LEDに"Hello"と表示された
BlueToothを使ってmicro:bitをコントロール出来るようになった。
% python3 writeLed2.py
Hello.gif

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9