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

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

##microbitのプログラム
Bluetoothのサービス開始だけをしておく。
![2020-02-01-002800_850x630_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/0679703a-988a-d960-3da7-ef6b4feac9b0.png)
そしてペアリングしなくてもコネクションできるように設定するために、
プロジェクトの設定から ```No Paring Required: Anyone can connect via Bluetooth.```を有効にしておく。
![2020-02-02-203357_898x542_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/29e004c3-8a4e-b32f-9545-933d23f7dfff.png)


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

##micro:bitのアドレスを探す。
[プログラムはgithubにも置いておく](https://github.com/roxa-delphi/microbit/blob/master/scan.py)

```python: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を調べる](https://github.com/roxa-delphi/microbit/blob/master/getHandle.py)

```python: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](https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html)

##micro:bitのLEDに"Hello"と表示する
LEDのサービスUUIDから、TEXT出力用UUIDを取得して、そこに出力することでLEDに表示が出来る。
[プログラムはgithubにも](https://github.com/roxa-delphi/microbit/blob/master/writeLed2.py)

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/180d52b7-11f5-4b43-ff21-e075c68649c8.gif)