Python
RaspberryPi
センサー
bluetooth
RaspberryPiZeroW

Raspberry pi でセンサメダルのデータを受信する

More than 1 year has passed since last update.

環境

  • 機種:RaspberryPi Zero W
  • OS:RASPBIAN STREACH WITH DESKTOP
  • カーネルバージョン:4.9
  • 言語:Python 2.7.13
  • RaspberryPi2 + RASPBIAN JESSIE + bluetoothドングルでも動作しました

モノ

使用するライブラリ

  • bluepy

参考にしたサイト

前置き

ロームのセンサメダルのデータをRasupberryPi ZERO W + pythonで受信したいと思い、調べてみたところ bluez というのが見つかったがgattlibがインストールできなかった為(ラズパイゼロはメモリ不足で失敗するらしい?)、bluepyというものを使用した。

手順

1.センサメダルとの通信確認

 ポイント:0x0b070100を書き込むとデータが流れてくるようになる。

1-1.センサメダルの電源を入れる

1-2.ターミナルを開いてsudo hcitool lescanを実行

対象のアドレスがわかる

pi@raspberrypi:~ $ sudo hcitool lescan
LE Scan ...
E3:B0:C8:8F:A1:22 ROHM RAW
E3:B0:C8:8F:A1:22 (unknown)

1-3.gatttool -b XX:XX:XX:XX:XX:XX -t random -I を実行(XX:XX:XX:XX:XX:XXにはセンサメダルのアドレスが入る)

pi@raspberrypi:~ $ gatttool -b E3:B0:C8:8F:A1:22 -t random -I
[E3:B0:C8:8F:A1:22][LE]>

1-4.connectと打ち、Enter →センサメダルに接続する

[E3:B0:C8:8F:A1:22][LE]> connect
Attempting to connect to E3:B0:C8:8F:A1:22
Connection successful

1-5.primaryと打ち、Enter  →サービス一覧が表示される

[E3:B0:C8:8F:A1:22][LE]> primary
attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0012 uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0020, end grp handle: 0x0032 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0b00, end grp handle: 0x0b0a uuid: 0179bbc0-0000-0100-8000-00805f9b34fb

1-6.サービスのUUIDを見つける(iphoneやmacのアプリで事前に調べておく)

今回は一番下の行が対象のサービス

1-7.char-desc 0x0b00 と打ち、Enter →キャラクタリスティックがザーッとでてくる

[E3:B0:C8:8F:A1:22][LE]> char-desc 0x0b00
handle: 0x0b00, uuid: e8340000-e7e5-0000-e7eb-ffffe6ce2800
handle: 0x0b01, uuid: e8340000-e7e5-0000-e7eb-ffffe6ce2803
handle: 0x0b02, uuid: 0179bbc1-0000-0100-8000-00805f9b34fb
handle: 0x0b03, uuid: 0179bbc1-0000-0100-8000-00805f9b2803
handle: 0x0b04, uuid: 0179bbc2-0000-0100-8000-00805f9b34fb
handle: 0x0b05, uuid: 0179bbc2-0000-0100-8000-00805f9b2803
handle: 0x0b06, uuid: 0179bbc3-0000-0100-8000-00805f9b34fb
handle: 0x0b07, uuid: 0179bbc3-0000-0100-8000-00805f9b2902
handle: 0x0b08, uuid: 0179bbc3-0000-0100-8000-00805f9b2803
handle: 0x0b09, uuid: 0179bbc4-0000-0100-8000-00805f9b34fb
handle: 0x0b0a, uuid: 00002902-0000-1000-8000-00805f9b34fb

1-8.notificationのUUIDを見つける

今回は0x0b06, 0x0b07がそう。0x0b07に値を書き込むと0x0b06からデータが来る。

1-9.char-write-req 0x0b07 0100 と打ち、Enter →センサメダルのデータが次々と流れてくる

[E3:B0:C8:8F:A1:22][LE]> char-write-req 0x0b07 0100
Characteristic value was written successfully
Notification handle = 0x0b06 value: 48 00 cd ff 03 04 39 00 9a 01 5a fb 37 00 7a 00 8b 00 c8 c4 
Notification handle = 0x0b06 value: 47 00 d1 ff 02 04 39 00 9e 01 5a fb 10 00 7a 00 73 00 c8 c4 
Notification handle = 0x0b06 value: 48 00 d0 ff 06 04 37 00 9e 01 5a fb 13 00 62 00 82 00 c7 c4 
Notification handle = 0x0b06 value: 46 00 d2 ff 04 04 3b 00 99 01 5a fb 2f 00 80 00 7e 00 c7 c4 
Notification handle = 0x0b06 value: 47 00 ce ff 0b 04 3b 00 9c 01 59 fb 36 00 77 00 77 00 c6 c4 
Notification handle = 0x0b06 value: 47 00 cd ff 05 04 3c 00 9a 01 59 fb 25 00 7b 00 88 00 c6 c4 

1-10.char-write-req 0x0b07 0000 と打ち、Enter →センサメダルのデータが止まる

[E3:B0:C8:8F:A1:22][LE]> char-write-req 0x0b07 0000
Characteristic value was written successfully
[E3:B0:C8:8F:A1:22][LE]>

2.必要なモジュールをインストール

sudo apt-get install python-pip libglib2.0-dev
sudo pip install bluepy

3.コードを書いて実行する

bluepyを使用して受信したデータを表示するコードを書く。

medalTest.py
# -*- coding: utf-8 -*-
"""
    2017.09.20 teppei
    ロームのセンサメダルのデータを受信して表示するプログラム
"""

from bluepy.btle import Peripheral
import bluepy.btle as btle
import binascii

# センサメダルのアドレス
ROHM_RAW = "XX:XX:XX:XX:XX:XX"


# データを受信した時に呼ばれるやつ
class MyDelegate(btle.DefaultDelegate):
    def __init__(self, params):
        btle.DefaultDelegate.__init__(self)

    def handleNotification(self, cHandle, data): 
        c_data = binascii.b2a_hex(data)
        print c_data

# センサーメダルクラス
class SensorMedal(Peripheral):
    def __init__(self, addr):
        Peripheral.__init__(self, addr, addrType="random")


def main():
    # 初期設定
    medal = SensorMedal(ROHM_RAW)
    medal.setDelegate(MyDelegate(btle.DefaultDelegate))

    # ノーティフィケーションを有効にする
    medal.writeCharacteristic(0x0b07, "\x01\x00", True)

    # データを受信し続ける
    while True:
        if medal.waitForNotifications(1.0):
            continue
        print "wait..."

if __name__ == "__main__":
    main()

センサメダルの電源を入れてから python medalTest.pyを実行

pi@raspberrypi:~/work/medal $ python medalTest.py 
4d00e9ff02045fff5eff6ffb04004300930060c4
4a00eaff06045fff5dff6dfb26003b009b0060c4
4800e8ff00045eff5eff6dfb01008000ae005fc4
4b00eaff01045cff5eff6dfb1f0060007b005fc4
4a00e7ff030461ff5bff6ffb07004500a7005ec4
4900e9ff05045cff62ff6dfb14007d0077005dc4

※受信データはセンサメダルのwebページにある使い方のpdf資料を参考に換算するといいです。