21
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

環境

  • 機種: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資料を参考に換算するといいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
21
Help us understand the problem. What are the problem?