LoginSignup
10
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-14

概要

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

ミニチュア・カー・キットとは

image.png

  • Silicon Labos (通称シリラボ)のBLE評価基板+α
  • シャーシ(かまぼこ板的なやつ)、タイヤ、車のボディもついてる
  • センサーがいろいろ載っている
  • 技適取得済み
  • $59 (\6,673 @ 2018/04/15)

Thunderboard React Derby ミニチュア・カー・キット|Silicon Labs
CARKIT Silicon Labs | Mouser 日本
中に車のオモチャ? 子供も喜ぶIoT開発キット | 日経 xTECH(クロステック)

使ったもの

  • ミニチュア・カー・キット
  • ラズパイ
  • スマホ
  • プラスドライバー
  • ピンセット
  • ホットボンド(ダイソーで購入。瞬間接着剤でもいいと思う。)

ハードウェア組み立て

評価基板はこんな感じ。
IMG_0912.jpg

かまぼこ板的なものににタイヤと評価基板をつける
IMG_0920.jpg

ダイソーで買ったホットボンドを活用。
タイヤの回転数を測定するための磁石もホットボンドでつけた。
貼る位置が微妙だとタイヤの回転数をとれない。
何度か付けなおした。
IMG_0919.jpg

ボディをかぶせたところ
IMG_0913.jpg

ステッカーを貼って、ミニ四駆のことを思い出す。いろいろステッカーがついてて自由に貼れるのでセンスの見せ所!?
IMG_0921.jpg

評価用アプリもついてるのですぐ動く。
IMG_0914.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テクノロジー

  • 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

10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12