ラズパイのBLEでtoioと遊ぶ (1) Lチカ

 toioという玩具の単品販売が2020年4月25日からスイッチサイエンスで始まりました。本体を一つと充電器を購入しました。プログラム例はありませんが、プログラムに必要な技術仕様がこちらで公開されています。何はともあれ、Lチカをします。

BLEのセントラル

 toio本体は、電源スイッチを押すと、BLEのペリフェラルになり、アドバタイジングを始めます。言い換えると、電源を入れると、Bluetoothのサーバとなってだれかに探してくれるように電波を出し始めます。

 その電波に反応するには、セントラルと呼ばれるクライアントのコンピュータが見つけ、コネクトしに行きます。コネクトできたら、toioのたくさんの機能の中からLight ControlというRGB LEDを光らせる機能を選び、点滅させせるコマンドを送ります。正しく送れたら、本体裏にある指定した色のLEDが点滅します。正しくなかったら、青色のLEDが点滅します。

bluepyのインストール

 ここでは、セントラルはラズパイを使います。bluepyというライブラリをインストールします。このライブラリは、pythonでセントラルのプログラムだけが書けます。

 ラズパイ4は最新の状態にしておきます。

$ sudo apt-get install python3-pip libglib2.0-dev
$ sudo pip3 install bluepy

 GitHubにあるサンプルblescan.pyをエディタに読み込み、scan.pyの名前で保存します。

$ sudo python3 scan.py

で、アドバタイジングしているBLEペリフェラルを探します。見つけてきました。

Lチカのプログラム

 上記のscan.pyでデバイスのアドレスがわかりました。なので、直接コネクトします。見つからなかったときのエラー処理は記述していません。

 そのあと、「ランプ」の仕様に書かれているように、キャラUUID=10B20103-5B3B-4571-9508-CF3EFCD7BBAEを探し、プロパティが書き込み属性なので、サンプルにあるようにコマンドをバイナリで送ります。

 handleは実行時にふられます。commandList は、順に、連続的な点灯・消灯、繰り返しは複数回、Operationは二つ、ランプを制御する時間は500ms、ランプの数は1、IDは1、REDは最大輝度、GREENは消灯、BLUEも消灯、制御期間は180ms、ランプの数は1、IDは1、REDは消灯、GREENは最大輝度、BLUEは消灯です。

from bluepy import btle

toio_Service_UUID = "10B20100-5B3B-4571-9508-CF3EFCD7BBAE"
Light_Characteristic_UUID = "10B20103-5B3B-4571-9508-CF3EFCD7BBAE"
deviceAddr = "c3:f0:86:ef:c7:62"
commandList = [0x04,0x00,0x02,0x1e,0x01,0x01,0xff,0x00,0x00,0x10,0x01,0x01,0x00,0xff,0x00]

peri = btle.Peripheral()
peri.connect(deviceAddr, btle.ADDR_TYPE_RANDOM)
chara = peri.getCharacteristics()
for ch in chara:
    print('===')
    print("uuid= ", ch.uuid)
    print(ch.propertiesToString())
    if ch.uuid == Light_Characteristic_UUID:
        handle = ch.getHandle()
        print(handle) #ch.getDescriptors())
        print("send command to Light")
        ch.peripheral.writeCharacteristic(handle, bytearray(commandList), True)
        break
peri.disconnect()

 実行しているようすです。見つけたキャラUUIDの中からLightのUUIDを見つけたときに、commandListを送って終了しました。この時、本体ではLEDが赤色、緑色と光ったので、プログラムはうまく動いたようです。

コラム ●初期状態をRSL10 Bluetooth Low Enaergy Exploerで見る

 赤色の文字は筆者が追加しました。

01:52:27.956 INFO Connect...
01:52:27.957 INFO Connecting... (Device:00000000-0000-0000-0001-c3f086efc762)
01:52:27.979 INFO Parameter update (Interval:7.5ms Latency:0 Timeout:500ms)
01:52:27.981 INFO Security update (Mode 1, Level 1 - No security (No authentication and no encryption))
01:52:27.983 INFO Data length update (TX:27Bytes RX:27Bytes)
01:52:27.985 INFO Phy update (TX:1Mbps RX:1Mbps)
01:52:27.987 INFO ATT MTU update (MTU:23Bytes)
01:52:27.988 INFO Connected (Device:00000000-0000-0000-0001-c3f086efc762)
01:52:27.990 INFO Scan for peripheral restarted
01:52:27.992 INFO Service with UUID '1800' not found
01:52:27.993 INFO Generic access service not found
01:52:27.995 INFO Service with UUID '180a' not found
01:52:27.995 INFO DeviceInformation service not found
01:52:27.996 INFO Service with UUID '180f' not found
01:52:27.996 INFO Battery service not found
01:52:27.997 INFO ATT MTU exchanged (Connection:0x00 MTU:23)
01:52:30.486 INFO Discover services...
01:52:30.983 INFO Service UUID:1800
01:52:31.126 INFO - UUID:2a00
01:52:31.128 INFO - UUID:2a01
01:52:31.128 INFO - UUID:2a04
01:52:31.129 INFO - UUID:2aa6
01:52:31.129 INFO Service UUID:1801
01:52:31.129 INFO Service UUID:10b20100-5b3b-4571-9508-cf3efcd7bbae
01:52:31.130 INFO - UUID:10b20101-5b3b-4571-9508-cf3efcd7bbae
01:52:31.130 INFO > Type:ClientCharacteristicConfiguration 
01:52:31.131 INFO > Type:CharacteristicUserDescription  ID Information
01:52:31.131 INFO - UUID:10b20102-5b3b-4571-9508-cf3efcd7bbae
01:52:31.132 INFO > Type:ClientCharacteristicConfiguration
01:52:31.132 INFO > Type:CharacteristicUserDescription Motor Control
01:52:31.133 INFO - UUID:10b20103-5b3b-4571-9508-cf3efcd7bbae
01:52:31.134 INFO > Type:CharacteristicUserDescription  Light Control
01:52:31.134 INFO - UUID:10b20104-5b3b-4571-9508-cf3efcd7bbae
01:52:31.135 INFO > Type:CharacteristicUserDescription  Sound Control
01:52:31.135 INFO - UUID:10b20106-5b3b-4571-9508-cf3efcd7bbae
01:52:31.136 INFO > Type:ClientCharacteristicConfiguration
01:52:31.136 INFO > Type:CharacteristicUserDescription  Sensor Information
01:52:31.137 INFO - UUID:10b20107-5b3b-4571-9508-cf3efcd7bbae
01:52:31.137 INFO > Type:ClientCharacteristicConfiguration
01:52:31.138 INFO > Type:CharacteristicUserDescription  Button Information
01:52:31.139 INFO - UUID:10b20108-5b3b-4571-9508-cf3efcd7bbae
01:52:31.139 INFO > Type:ClientCharacteristicConfiguration
01:52:31.140 INFO > Type:CharacteristicUserDescription  Battery Information
01:52:31.140 INFO - UUID:10b201ff-5b3b-4571-9508-cf3efcd7bbae
01:52:31.141 INFO > Type:ClientCharacteristicConfiguration
01:52:31.141 INFO > Type:CharacteristicUserDescription  Configuration
01:52:31.142 INFO Services discovered (3 services)
01:52:31.142 INFO Characteristic read (Uuid:2A00 Data:0x746F696F20436F72652043756265)
01:52:31.143 INFO Characteristic read (Uuid:2A01 Data:0x8000)
01:52:31.143 INFO Characteristic read (Uuid:2A04 Data:0x0800400000009001)
01:52:31.144 INFO Characteristic read (Uuid:2AA6 Data:0x01)
01:52:31.144 INFO Characteristic read (Uuid:10B20101-5B3B-4571-9508-CF3EFCD7BBAE Data:0xFF0000000000000000000000000000)
01:52:31.147 INFO Descriptor read (Uuid:10B20101-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.152 INFO Descriptor read (Uuid:10B20101-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x494420496E666F726D6174696F6E)
01:52:31.152 INFO Descriptor read (Uuid:10B20102-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.168 INFO Descriptor read (Uuid:10B20102-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x4D6F746F7220436F6E74726F6C)
01:52:31.179 INFO Descriptor read (Uuid:10B20103-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x4C6967687420436F6E74726F6C)
01:52:31.194 INFO Descriptor read (Uuid:10B20104-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x536F756E6420436F6E74726F6C)
01:52:31.210 INFO Characteristic read (Uuid:10B20106-5B3B-4571-9508-CF3EFCD7BBAE Data:0x0101000002)
01:52:31.224 INFO Descriptor read (Uuid:10B20106-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.239 INFO Descriptor read (Uuid:10B20106-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x53656E736F7220496E666F726D6174696F6E)
01:52:31.255 INFO Characteristic read (Uuid:10B20107-5B3B-4571-9508-CF3EFCD7BBAE Data:0x0100)
01:52:31.269 INFO Descriptor read (Uuid:10B20107-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.284 INFO Descriptor read (Uuid:10B20107-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x427574746F6E20496E666F726D6174696F6E)
01:52:31.300 INFO Characteristic read (Uuid:10B20108-5B3B-4571-9508-CF3EFCD7BBAE Data:0x64)
01:52:31.314 INFO Descriptor read (Uuid:10B20108-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.329 INFO Descriptor read (Uuid:10B20108-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x4261747465727920496E666F726D6174696F6E)
01:52:31.345 INFO Characteristic read (Uuid:10B201FF-5B3B-4571-9508-CF3EFCD7BBAE Data:0x00)
01:52:31.359 INFO Descriptor read (Uuid:10B201FF-5B3B-4571-9508-CF3EFCD7BBAE Type:ClientCharacteristicConfiguration Data:0x0000)
01:52:31.377 INFO Descriptor read (Uuid:10B201FF-5B3B-4571-9508-CF3EFCD7BBAE Type:CharacteristicUserDescription Data:0x436F6E66696775726174696F6E)
01:52:32.979 INFO Connection parameter update request (Connection:0x00 Min Interval:10ms Max Interval:80ms Latency:0 Timeout:4000ms)
01:52:33.089 INFO Connection parameter update (Connection:0x00 Interval:80ms Latency:0 Timeout:4000ms)
01:52:33.092 INFO Parameter update (Interval:80ms Latency:0 Timeout:4000ms)