はじめに
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)