RaspberryPiとParrot Flower Powerとの接続を試す

こんにちは、mi2yo4です。

以前、「RaspberryPiにてBLE(Bluetooth Low Energy)接続のセンサーを試す」というエントリにて浅草ギ研のBLECAST_BLに繋げて遊んでみました。

そう言えば、弊社には他にもBLE(bluetooth low energy)接続のセンサーがあったような…ありました、ありました。

flowerpower

Parrot社のFlower Powerという製品です。

今から2年ぐらい前に発売されて、今では1万円以下で入手できるようになりました。

弊社でも発売直後に購入したものの、当時はBluetoothにそれ程惹かれずに、死蔵していましたorz
ネット上の記事を見ても発売直後のレビュー記事が多いですね。

さてこのFlower Power、BLE接続で基本的にはスマートフォンとお話をする訳ですが、自前でBLE接続の機器を用意すれば計測値などもちゃんと取得できるようになっています。

Bluetooth Low Energy Interface Specification

そう、上記の英語の仕様書を読めば…出来るはず^^;)

それでは行ってみましょう!

用意するもの

・BlueZライブラリ
今回は、「RaspberryPiにてBLE(Bluetooth Low Energy)接続のセンサーを試す」に引き続きBlueZライブラリを使用します。
コンパイルしていない人はさくっと取得してコンパイルしてしまいましょう。

・BLE対応ドングル
今回はIO・DATA製のUSB-BT40LEを使いました。RaspberryPiで使うには定番のようです。

・Parrot Flower Power
言わずと知れた今回のターゲット。肥料濃度も計測出来るので、モノになれば格安センサーの可能性もあるか!?

・Bluetooth Low Energy Interface Specification
上記参照。これがないと始まりません。

手順

BlueZをインストールした所から始めます。

BLEドングルの有効化

USB-BT40LEをUSBに挿して以下のコマンドでbluetoothを有効化させます。

$ hciconfig hci0 up

BLEデバイスのスキャン

Flower Powerを検索します。

$ hcitool lescan
LE Scan ...
(省略)
A0:14:3D:47:25:75 (unknown)
A0:14:3D:47:25:75 (unknown)
A0:14:3D:47:25:75 Flower power 2575
(省略)

これでFlower power のアドレスが分かりました。
addressはa0:14:3d:47:25:75ですね。

ちなみに、iOSやAndroidのFlower Powerアプリケーションでもシリアルナンバーが分かります。
今回は「A0143D0000472575」と出ていたので、間の「0000」を省略すればアドレスなのでしょう。

gatttoolを使った調査

次にgatttoolを使います。
コンパイルしたBlueZライブラリの中にattribというディレクトリがあり、その中にgatttoolというものがあります。

これを使って、アクセスしたい情報へのハンドルを調べます。

–primaryオプションをつけると概略が出力されます。

$ ./gatttool -i hci0 -b a0:14:3d:47:25:75 --primary
attr handle = 0x0001, end grp handle = 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle = 0x000c, end grp handle = 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle = 0x0010, end grp handle = 0x0022 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle = 0x0023, end grp handle = 0x0041 uuid: 39e1fa00-84a8-11e2-afba-0002a5d5c51b
attr handle = 0x0042, end grp handle = 0x0045 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle = 0x0046, end grp handle = 0x005e uuid: 39e1fc00-84a8-11e2-afba-0002a5d5c51b
attr handle = 0x005f, end grp handle = 0x006d uuid: 39e1fb00-84a8-11e2-afba-0002a5d5c51b
attr handle = 0x006e, end grp handle = 0x0071 uuid: 39e1fd00-84a8-11e2-afba-0002a5d5c51b
attr handle = 0x0072, end grp handle = 0x007e uuid: 39e1fe00-84a8-11e2-afba-0002a5d5c51b
attr handle = 0x007f, end grp handle = 0xffff uuid: f000ffc0-0451-4000-b000-000000000000

–char-descコマンドで全てのハンドルが出力されます。少し時間がかかります。

$ ./gatttool -i hci0 -b a0:14:3d:47:25:75 --char-desc
handle = 0x0001, uuid = 00002800-0000-1000-8000-00805f9b34fb
handle = 0x0002, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0003, uuid = 00002a00-0000-1000-8000-00805f9b34fb
handle = 0x0004, uuid = 00002803-0000-1000-8000-00805f9b34fb
(中略)
handle = 0x0082, uuid = 00002901-0000-1000-8000-00805f9b34fb
handle = 0x0083, uuid = 00002803-0000-1000-8000-00805f9b34fb
handle = 0x0084, uuid = f000ffc2-0451-4000-b000-000000000000
handle = 0x0085, uuid = 00002901-0000-1000-8000-00805f9b34fb

後はBluetooth Low Energy Interface Specificationと首っ引きになり、取得したい情報のUUIDを調べます。

ちなみに、Air temperatureを見たい場合はhandleが0x0031となります。

gatttoolを使った計測値の取得

いよいよ値の取得を試みましょう!

$ ./gatttool -i hci0 -b a0:14:3d:47:25:75 --char read -a 0x0031
Characteristic value/descriptor: 3f 03

出力された3f03について、与えられた計算式に入れて計算します。

(3f033.3)/(2^11-1)=(161313.3)/(2048-1) = 48393/2047 =23.640937…

おお、それらしい値が取得できました!

まとめ

いかがだったでしょうか?

Bluetoothについてはこれまでそれほど重視していなかったのですが、やっぱりスマートフォンやら色んな機械に搭載されていることが多くなり、それに伴って部品単体の価格も下がり、今回のように安価なセンサー製品が増えて来ていますよね。

精度的にどうなの?という所はあるかもしれませんが、意外と使い物になる可能性もあります。
引き続きBluetooth製品にも注目していきたいと思います。

また、こういった面白い製品があるよ!というご意見も歓迎しますので、こちらまでお知らせ下さい。

それではまた!