toioをRaspberry Piで制御する(1)
toioをRaspberry Piで制御する方法について、実験した結果を発表します。
必要なもの
・toioコアキューブ
・Raspberry Pi (Bluetoothが使用可能な機種)
・Raspberry Pi を操作するパソコン
初期設定
Raspberry PiにRaspbianをインストールします。本投稿で使用したのは、"2020-02-13-raspbian-buster.zip"です。今回は、Raspberry PI Zero WH を使用していますが、Bluetoothが使用可能であれば、どのRaspberry Piでも適用できるはずです。
基本的な初期設定は以下の通りです。
・Micro SDカードに2020-02-13-raspbian-buster.zipを書き込み
・raspi-configで設定、localeをja_JP.UTF-8を追加しデフォルトへ、timezoneをAsia/Tokyoへ、Expand FilesystemでSDカードの使用領域を増やすなど
・ap-get update & apt-get upgrade で最新の状態へ
詳細は、Raspberry Piの初期設定方法などで検索してみるといいでしょう。
python3で制御していきますので、以下のコマンドでバージョンの確認と、python3でBluetoothを使用するためのライブラリをインストールします。
# python3のバージョン確認
root@raspberrypi:~# python3 --version
Python 3.7.3
# pip3のバージョン確認
root@raspberrypi:~# pip3 --version
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
# bluepyのインストール
root@raspberrypi:~# pip3 install bluepy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bluepy
Downloading https://www.piwheels.org/simple/bluepy/bluepy-1.3.0-cp37-cp37m-linux_armv6l.whl (560kB)
(中略)
Installing collected packages: bluepy
Successfully installed bluepy-1.3.0
toioのMACアドレスの確認
toioの電源を入れて、以下のコマンドを実行します。”toio Core Cube”を表示された行のMACアドレスが当該toioのMACアドレスです(最後の3オクテットは伏字にしています)。
root@raspberrypi:~# hcitool lescan
LE Scan ...
C3:3B:D6:XX:XX:XX toio Core Cube
toioを動かしてみる
toioをpython3を動かす(モーター)サンプルプログラムを以下に示します。
6行目のdevadrの中身は、所有するtoioのMACアドレスに置き換えてください。このプログラムを実行すると、32×10ミリ秒前進します。
root@raspberrypi:~# cat toio_move.py
# -*- coding: utf-8 -*-
import binascii
import bluepy
devadr = "C3:3B:D6:XX:XX:XX"
p = bluepy.btle.Peripheral()
p.connect(devadr, bluepy.btle.ADDR_TYPE_RANDOM)
print("toio のモーターを動かします...")
uuid_motor = "10B20102-5B3B-4571-9508-CF3EFCD7BBAE"
handle = p.getCharacteristics(uuid=uuid_motor)[0].getHandle()
hand = p.writeCharacteristic(handle , binascii.a2b_hex("0201016402016420"), True)
p.disconnect()
上記のリンクの"時間指定付きモーター制御"を使用しています。詳細はリンクを参照してください。
13行目のbinascii.a2b_hex("0201016402016420")で実際の制御をしています。hexとある通り、16進数で記載します。
・1byte目 0x02(時間指定付きモーター制御)
・2byte目 0x01(制御するモータを指定、ここでは左側)
・3byte目 0x01(モーターの回転方向、ここでは前進)
・4byte目 0x64(モーターの速度指示値0~255、ここでは0x64=100)
・5byte目 0x02(制御するモータを指定、ここでは右側)
・6byte目 0x01(モーターの回転方向、ここでは前進)
・7byte目 0x64(モーターの速度指示値0~255、ここでは0x64=100)
・8byte目 0x20(モーターの制御時間0~255、ここでは0x20=32×10ミリ秒)
ちなみにモーターの回転方向ですが、上記0x01だと前進ですが、0x00を指定すると後退となります。これらのパラメータを変更することで、toioを任意の方向、速度、時間で動かすことが出来ます。
toioの位置を読み込んでみる
toioの位置をpython3で読み込んでみます。6行目のdevadrの中身は、所有するtoioのMACアドレスに置き換えてください。toioコア キューブ付属もしくは開発者向けマットの簡易マットを使用します。
root@raspberrypi:~# cat toio_readid.py
# -*- coding: utf-8 -*-
import binascii
import bluepy
devadr = "C3:3B:D6:XX:XX:XX"
p = bluepy.btle.Peripheral()
p.connect(devadr, bluepy.btle.ADDR_TYPE_RANDOM)
print("toio の読み取りセンサーの情報を表示します...")
uuid_readid = "10B20101-5B3B-4571-9508-CF3EFCD7BBAE"
hand = p.getCharacteristics(uuid=uuid_readid)[0]
print (binascii.b2a_hex(hand.read()))
p.disconnect()
簡易マット上の"0"にtoio(以下図の丸印部分)を置いてプログラムを実行すると、以下のようになります。
root@raspberrypi:~# python3 toio_readid.py
toio の読み取りセンサーの情報を表示します...
b'02300138001101'
最後に表示された "b'02300138001101'"がtoioの読み取りセンサーが取得した値です。
上記のリンクの"Standard ID"を使用しています。詳細はリンクを参照してください。
・1byte目 0x02(Standard IDを示す)
・2~5byte目 0x01(Standard ID の値、ここでは0x0038130030)
・6byte目 0x01(角度、ここでは0x0111=273度)
上記のStandard ID 一覧の「toio コア キューブ(単体)付属の簡易カード」で 0x0038130030 を検索すると、"0"であることがわかります。
まとめ
toioをRaspberry Piで制御する方法について、python3のライブラリ導入、モーターで動かす、簡易マットでの読み込みの方法について、実験結果にもとづいて説明してみました。toioの機能はまだまだあるので、今後時間があれば、実験結果を発表していきます。