概要
ミニチュア・カー・キットとラズパイでBLEのお勉強した。
ミニチュア・カー・キットの組み立て、まあまあ楽しい。
BLEの仕組みを少し学んだ。
ラズパイでpythonのbluepyっての使ってセンサーデータを取得した。
ミニチュア・カー・キットとは
- Silicon Labos (通称シリラボ)のBLE評価基板+α
- シャーシ(かまぼこ板的なやつ)、タイヤ、車のボディもついてる
- センサーがいろいろ載っている
- 技適取得済み
- $59 (\6,673 @ 2018/04/15)
Thunderboard React Derby ミニチュア・カー・キット|Silicon Labs
CARKIT Silicon Labs | Mouser 日本
中に車のオモチャ? 子供も喜ぶIoT開発キット | 日経 xTECH(クロステック)
使ったもの
- ミニチュア・カー・キット
- ラズパイ
- スマホ
- プラスドライバー
- ピンセット
- ホットボンド(ダイソーで購入。瞬間接着剤でもいいと思う。)
ハードウェア組み立て
ダイソーで買ったホットボンドを活用。
タイヤの回転数を測定するための磁石もホットボンドでつけた。
貼る位置が微妙だとタイヤの回転数をとれない。
何度か付けなおした。
ステッカーを貼って、ミニ四駆のことを思い出す。いろいろステッカーがついてて自由に貼れるのでセンスの見せ所!?
コマンドラインで確認
こんな感じでスキャンできる
sudo hcitool lescan
ラズパイで受信
評価用アプリだけじゃ面白くないので、ラズパイで受信してみる。
とりあえず、pythonでやってみる。
pybluezってのがあったけど、うまく動かせなかったので、bluepyってのを使った。
bluepyのインストール
こんな感じ。
もしかしたら、他にもいろいろ入れたかも。
BlueZってプロトコルスタック?を使ってるらしい。
git clone https://github.com/IanHarvey/bluepy.git
sudo pip install bluepy
bluepyを使ってセンサーデータ収集
こんな感じでセンサーデータを収集。
スキャンして、コネクトして、データ取ってきて、必要なデータを加工して、表示。
from bluepy.btle import *
import struct
def ble_micro_handle():
scanner = Scanner(0)
devices = scanner.scan(3)
for dev in devices:
print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi)
for (adtype, desc, value) in dev.getScanData():
print " %s = %s" % (desc, value)
num_ble = len(devices)
print num_ble
if num_ble==0:
return None
ble_mic = []
char_sensor = 0
non_sensor = 0
led_char = Characteristic
mic_char = Characteristic
led_handle =0
for i in range(num_ble):
try:
devices[i].getScanData()
ble_mic.append(Peripheral())
ble_mic[char_sensor].connect(devices[i].addr,devices[i].addrType)
char_sensor = char_sensor + 1
print "Connected %s device with addr %s " % (char_sensor, devices[i].addr)
except:
non_sensor = non_sensor + 1
try:
for i in range(char_sensor):
services = ble_mic[i].getServices()
characteristics = ble_mic[i].getCharacteristics()
for k in characteristics:
print k
if k.uuid=="2a6e":
print "temp"
# print k.uuid
# print k.peripheral
value = struct.unpack('<H',k.read())
value = value[0] / 100
print value
if k.uuid == "2a6f":
print "humidity"
value = struct.unpack('<H',k.read())
value = value[0] / 100
print value
except:
return None
ble_micro_handle()
BLE
ここがわかりやすかった。
BLEモジュールからのデータを受け取りたいだけなら、GAPは知らなくてよさそう。おもったよりシンプル。
クラゲのIoTテクノロジー
- GAP, GATT
- Read, Write, Notify
- Central, Peripheral
- Advertise, Scan, Connect, Disconnect
- Service, Characteristic
- UUID
- Value, Property, Descriptor
UUIDの短縮形のこともかかれてる
クラゲのIoTテクノロジー
他にもいろいろ情報ある
クラゲのIoTテクノロジー
BLEについて他にも調べたけど、やりたい事的には知らなくても良さそうだった。
まとめ
そこそこ時間かかった。
やっぱ、作業しながらお勉強すると、理解が進む。
今後
- Thunderboardのプログラミング
- JavaScriptで同じようなことする
- 別のBLEモジュールでも試してみる
参考URL
bluepyのクラスの使い方を知るために活用。
bluepy - a Bluetooth LE interface for Python — bluepy 0.9.11 documentation
バイナリのunpackのために活用
7.3. struct — 文字列データをパックされたバイナリデータとして解釈する — Python 2.7.14 ドキュメント
structについて詳しくかかれていたので活用
pythonのstructモジュールを触ってみる | KentaKomai Blog
得られたバイナリデータの解釈のために活用。
Thunderboard Sense with Raspberry Pi and Python
UUIDを確認するために活用。
thunderboard-android/ThunderBoardUuids.java at 769e5a708f87a976ecc46a9a5defeec252d45aab · SiliconLabs/thunderboard-android · GitHub
ここで、紹介されているpybluezで試してみたが、うまくいかず・・・。
connect()はするけど、read_by_uuid()できず。残念。
Check! Raspberry Pi で Bluetooth 経由のセンサーデータを取得する 〜 準備編 - Qiita
サンプルがシンプルなので、これで動いたら理解しやすくてうれしかったんやけども。
pybluez/read_name.py at master · karulis/pybluez · GitHub
SensorTagはいろいろサンプルあるみたいでうらやましい。
SimpleLink SensorTag - TIJ.co.jp
bluepyについても載ってる
PythonからBLEを制御するライブラリの調査 - masato-ka's diary
bluepyのこと。結構参考にした。
Thunderboard Sense and RPi - Hackster.io
Firebaseのことも書かれている。
Thunderboard Sense with Raspberry Pi and Python