ミニチュア・カー・キットとラズパイ（Python）でBLE通信

# 概要
ミニチュア・カー・キットとラズパイでBLEのお勉強した。
ミニチュア・カー・キットの組み立て、まあまあ楽しい。
BLEの仕組みを少し学んだ。
ラズパイでpythonのbluepyっての使ってセンサーデータを取得した。

# ミニチュア・カー・キットとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/fa22efd1-84d7-4daf-2b8a-e8676c54999b.png)
- Silicon Labos （通称シリラボ）のBLE評価基板＋α
- シャーシ（かまぼこ板的なやつ）、タイヤ、車のボディもついてる
- センサーがいろいろ載っている
- 技適取得済み
- $59 (\6,673 @ 2018/04/15)

[Thunderboard React Derby ミニチュア・カー・キット|Silicon Labs](https://jp.silabs.com/products/development-tools/thunderboard/thunderboard-react-derby-car-kit)
[CARKIT Silicon Labs | Mouser 日本](https://www.mouser.jp/ProductDetail/Silicon-Labs/CARKIT?qs=oeTdXIl7vUzDTu5GKpi5jg%3d%3d)
[中に車のオモチャ？　子供も喜ぶIoT開発キット | 日経 xTECH（クロステック）](http://tech.nikkeibp.co.jp/dm/atcl/feature/15/041100088/012900026/)

# 使ったもの
- ミニチュア・カー・キット
- ラズパイ
- スマホ
- プラスドライバー
- ピンセット
- ホットボンド（ダイソーで購入。瞬間接着剤でもいいと思う。）

# ハードウェア組み立て
評価基板はこんな感じ。
![IMG_0912.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/8df81c4c-28a9-b4ce-cb01-c0713c2477fc.jpeg)

かまぼこ板的なものににタイヤと評価基板をつける
![IMG_0920.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/574c4df5-fb71-3f93-8836-236c395558fc.jpeg)

ダイソーで買ったホットボンドを活用。
タイヤの回転数を測定するための磁石もホットボンドでつけた。
貼る位置が微妙だとタイヤの回転数をとれない。
何度か付けなおした。
![IMG_0919.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/c35f8bd0-f127-591b-e2f1-8551999280a4.jpeg)

ボディをかぶせたところ
![IMG_0913.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/6f5d578d-7179-44b1-1536-2ea9d612834e.jpeg)

ステッカーを貼って、ミニ四駆のことを思い出す。いろいろステッカーがついてて自由に貼れるのでセンスの見せ所！？
![IMG_0921.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/fa52175d-ee5f-300e-c262-9d8d2e845074.jpeg)

評価用アプリもついてるのですぐ動く。
<img width="375" alt="IMG_0914.png" src="https://qiita-image-store.s3.amazonaws.com/0/184221/f33a1a65-007a-0e33-aa8e-7fbd82459b59.png">


# コマンドラインで確認
こんな感じでスキャンできる

```
sudo hcitool lescan
```

# ラズパイで受信
評価用アプリだけじゃ面白くないので、ラズパイで受信してみる。
とりあえず、pythonでやってみる。
pybluezってのがあったけど、うまく動かせなかったので、bluepyってのを使った。

## bluepyのインストール
こんな感じ。
もしかしたら、他にもいろいろ入れたかも。
BlueZってプロトコルスタック？を使ってるらしい。

```
git clone https://github.com/IanHarvey/bluepy.git
sudo pip install bluepy
```

# bluepyを使ってセンサーデータ収集
こんな感じでセンサーデータを収集。
スキャンして、コネクトして、データ取ってきて、必要なデータを加工して、表示。

```read_thunder.py
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テクノロジー](http://jellyware.jp/kurage/bluejelly/ble_guide.html)

- GAP, GATT
- Read, Write, Notify
- Central, Peripheral
- Advertise, Scan, Connect, Disconnect
- Service, Characteristic
- UUID
- Value, Property, Descriptor

UUIDの短縮形のこともかかれてる
[クラゲのIoTテクノロジー](http://jellyware.jp/kurage/bluejelly/uuid.html)

他にもいろいろ情報ある
[クラゲのIoTテクノロジー](http://jellyware.jp/kurage/)

BLEについて他にも調べたけど、やりたい事的には知らなくても良さそうだった。

# まとめ
そこそこ時間かかった。
やっぱ、作業しながらお勉強すると、理解が進む。

# 今後
- Thunderboardのプログラミング
- JavaScriptで同じようなことする
- 別のBLEモジュールでも試してみる

# 参考URL
bluepyのクラスの使い方を知るために活用。
[bluepy - a Bluetooth LE interface for Python — bluepy 0.9.11 documentation](https://ianharvey.github.io/bluepy-doc/index.html)

バイナリのunpackのために活用
[7.3. struct — 文字列データをパックされたバイナリデータとして解釈する — Python 2.7.14 ドキュメント](https://docs.python.org/ja/2.7/library/struct.html)

structについて詳しくかかれていたので活用
[pythonのstructモジュールを触ってみる | KentaKomai Blog](http://komaken.me/blog/2014/05/30/python%E3%81%AEstruct%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)

得られたバイナリデータの解釈のために活用。
[Thunderboard Sense with Raspberry Pi and Python](https://www.silabs.com/community/projects.entry.html/2017/03/08/thunderboard_sensew-Scqr)

UUIDを確認するために活用。
[thunderboard-android/ThunderBoardUuids.java at 769e5a708f87a976ecc46a9a5defeec252d45aab · SiliconLabs/thunderboard-android · GitHub](https://github.com/SiliconLabs/thunderboard-android/blob/769e5a708f87a976ecc46a9a5defeec252d45aab/app/src/main/java/com/silabs/thunderboard/ble/model/ThunderBoardUuids.java#L49)

ここで、紹介されているpybluezで試してみたが、うまくいかず・・・。
connect()はするけど、read_by_uuid()できず。残念。
[Check! Raspberry Pi で Bluetooth 経由のセンサーデータを取得する 〜 準備編 - Qiita](https://qiita.com/dz_/items/4e858e4d50db19b57491)

サンプルがシンプルなので、これで動いたら理解しやすくてうれしかったんやけども。
[pybluez/read_name.py at master · karulis/pybluez · GitHub](https://github.com/karulis/pybluez/blob/master/examples/ble/read_name.py)

SensorTagはいろいろサンプルあるみたいでうらやましい。
[SimpleLink SensorTag - TIJ.co.jp](http://www.tij.co.jp/ww/wireless_connectivity/sensortag/tearDown.html)

bluepyについても載ってる
[PythonからBLEを制御するライブラリの調査 - masato-ka's diary](http://masato-ka.hatenablog.com/entry/2017/09/10/153555)

bluepyのこと。結構参考にした。
[Thunderboard Sense and RPi - Hackster.io](https://www.hackster.io/neal_markham/thunderboard-sense-and-rpi-297b91)

Firebaseのことも書かれている。
[Thunderboard Sense with Raspberry Pi and Python](https://www.silabs.com/community/projects.entry.html/2017/03/08/thunderboard_sensew-Scqr)