コンテンツにスキップするには Enter キーを押してください

BLE で Blueninja のデータを Pythonで受信する。

はじめに

Blueninja で得たセンサデータをBLEで送信してMacのPythonで受信したいと思います。
Python で BLE を扱うために、Adafruit python bluefruitLE libraryを使用します。
Blueninja には、公式で公表されている、Hyourowganという汎用即席型プログラムを使用します。
Hyourowganは使いづらいといわれていたBlueninjaを使いやすくするために、必要な機能が簡単に動くように(いじれるように)作ってくれているプログラムです。
ただ、今回はいじる必要はなく上記サイトで提供されているバイナリデータをそのままBlueninjaにコピーすれば大丈夫です。
それだけでBLE接続すればセンサデータが得られるようになります。
blueninjaの記事

 

Python で BLE を使えるようにする。

Python で BLE (Bluetooth Low Energy) を利用するには、Python のライブラリである Adafruit の bluefruitLE を使用します。
まずはこれをインストールします。
Adafruit python bluefruitLE libraryからクローンしてきて好きなとこに置きます。
zipを展開したその中にsetup.pyというものがあるのでそれを実行します。

$ cd downloads/Adafruit_Python_BluefruitLE-master
$ python setup.py install

これだけです。
exampleを動かすこともできます。list_uarts.pyは周りにあるBLEで接続できるuartのリストを表示するだけ。

$ cd examples/
$ python list_uarts.py

もしobjcが無いと言われたら

$ pip install pyobjc

 

bluefruitLE でble接続する。

uuidはHyourowganのサイトで公開されているのでそのまま使います。
BLEそのものについては知識の正確性に不安があるので、他で調べてください。
サービスとか、キャラクタリスティックとかわかれば結構そのままなので難しくないと思います。

# -*- coding: utf-8 -*-
import Adafruit_BluefruitLE, uuid
from Adafruit_BluefruitLE.services import UART, DeviceInformation
import struct
import atexit
import time
import numpy as np

SERVICE = uuid.UUID('00050000-6727-11e5-988e-f07959ddcdfb') # UUID of motion sensor service
LEVEL = uuid.UUID('00050001-6727-11e5-988e-f07959ddcdfb')   # UUID of motion sensor charactaristic


provider = Adafruit_BluefruitLE.get_provider()
provider.initialize()


def main():
    adapter = provider.get_default_adapter()
    adapter.power_on()
    print('adapter:', adapter.name)
    UART.disconnect_devices()
    try:
        adapter.start_scan()
        atexit.register(adapter.stop_scan)
        known_uarts = set()
        isnotFound = True
        while(isnotFound):
            found = set(UART.find_devices())
            new = found - known_uarts
            for device in new:
                print('Found UART: {0} [{1}]'.format(device.name, device.id))
                # つなげたいデバイス名があったら。
                # 今回はHyouRowGanをそのまま使ったので、HyouRowGan00がデバイス名だった。
                if(device.name == 'HyouRowGan00'): 
                    print('connecting...')
                    device.connect()
                    print('connected.')
                    isnotFound = False
                    adapter.stop_scan()
            known_uarts.update(new)
            time.sleep(0.5)
        if device is None:
            raise RuntimeError('Failed to find UART device!')
    finally:
        adapter.stop_scan()

    print(device.name)

    device.discover([SERVICE],[LEVEL])
    service = device.find_service(SERVICE)
    print('got service')
    c = service.find_characteristic(LEVEL)
    print('got characteristic')

  # コールバック関数。特にすることがなければNoneでいい。
    def received(data):
        None

  # コールバックを設定する必要がある。
    c.start_notify(received)
    print('start notifications.')
    while (True):
        # 受け取り方は送信方法による。
        v = c.read_value()
        num = np.zeros(7)
        # blueninjaから加速度センサ、ジャイロセンサのxyzが各2バイトで送られてくる。 
        for (i, vi) in enumerate(range(0, 14, 2)):
            num[i] = np.array(ord(v[vi+1])*256+ord(v[vi]), dtype='int16')
        print(num.astype(int))


provider.run_mainloop_with(main)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です