LoginSignup
1
3

More than 3 years have passed since last update.

Raspberry pi と watchXでBLE通信

Posted at

IoTに関する研修を受けてきまして、raspberry piとクラウド(AWS IoT)の連携に関してはできるようになったのですが、BLEを使ったM2Mのような通信をさせたことがありませんでした。

そこで、raspberry pi(raspberry pi3 model B+) とwatchX(arduino leonarde)を使い、watchXの温度センサから値を取得し、BLEでwatchXからraspberry piへセンサ値を送ってみました。

簡単に行くかなと思ったのですが、割とはまりどころが多かったのでここにまとめます。

開発環境

watchX

以下のサイトをご参考ください。arduino leonardeが乗ったスマートウォッチと考えていただければいいかと思います。
https://www.watchx.io/

また、必要なarduinoのライブラリが以下で提供されているので、この中のBLEのペリフェラルとして、温度センサの値を送る「healththermometer」というサンプルプロジェクトを使用します
https://www.watchx.io/download.php

raspberry pi3 model B+

raspberry pi3 model B+に関しては、bluetoothモジュールがついているので、それを使って通信します。

また、今後、AWSとの連携も考えていきたいので、pythonを使ってBLEセントラルとしての機能を実装します。当初、pybluezを使用していたのですが、うまくモジュールが動かないとの情報も多々ある(自分の手持ちのraspberry piでも動きませんでした・・・)ので、bluepyを使用することにしました。

bluepy の導入は以下の記事を参考にさせていただきました。(とてもわかりやすくて助かりました)
https://qiita.com/FiveOne/items/ea04b74271da0f382ed6

ソースコード

watchX

開発環境の項目で紹介したライブラリですが、どうやらピン配置の設定が違うらしく、うまくBLEモジュールが動きませんでした。そのため、以下のように「BluefruitConfig.h」を改良しました。
https://github.com/tomsWalker/watchX/blob/master/healththermometerWatchX/BluefruitConfig.h

その他の場所はサンプルのままで問題ないようでした。(watchXのコードはファイルもいくつかに分かれていますのでgithubにあげさせてもらいました)

raspberry pi

開発環境作成もお世話になった以下の記事の「notify.py」を流用させていただきまして、温度センサの値を取得しました。
https://qiita.com/FiveOne/items/ea04b74271da0f382ed6

watchX側のプログラム上、使用するキャラクタリスティックのプロパティが「indicate」になるので、以下のように変更し、値を取得いたしました。

import bluepy
import binascii

HANDLE_INDICATE = XX # ここに使用するwatchXのキャラクタリスティックのハンドルを入れます
devadr = "XX:XX:XX:XX:XX:XX" # ここにwatchXのBLEのアドレスを入れます

class MyDelegate(bluepy.btle.DefaultDelegate):
    def __init__(self, params):
        bluepy.btle.DefaultDelegate.__init__(self)

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

def main():
    peri = bluepy.btle.Peripheral()
    peri.connect(devadr, bluepy.btle.ADDR_TYPE_RANDOM)
    peri.withDelegate(MyDelegate(bluepy.btle.DefaultDelegate))
    # プロパティがindicateなので、「'\x01\x00'」ではなく「'\x02\x00'」を書き込む
    peri.writeCharacteristic(HANDLE_INDICATE+1, b'\x02\x00') 

    while True:
        if peri.waitForNotifications(1.0):
            continue
        print("wait...")

if __name__ == "__main__":
    main()

最後に

なんとか、上記のソースコードでBLE通信ができるようになりました。

watchXも、温度センサだけでなく加速度センサなどもついているので、その辺りのセンサを使用したり、AWSとの連携も考えていこうかと思います

1
3
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
1
3