Raspberry Pi 4はBluetoothを内蔵しているので、Bluetoothでmicro:bitと接続してみる。
##microbitのプログラム
Bluetoothのサービス開始だけをしておく。
そしてペアリングしなくてもコネクションできるように設定するために、
プロジェクトの設定から No Paring Required: Anyone can connect via Bluetooth.
を有効にしておく。
##Raspberry Pi
PythonからBluetoothを使うためのbluepyモジュールをインストールする。
% sudo pip3 install bluepy
##micro:bitのアドレスを探す。
プログラムはgithubにも置いておく
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を調べる
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にも
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