2015年2月22日日曜日

テキサスインスツルメンツのBLEアプリ開発キット「SensorTag」

先日、昨年末に注文してずーと入荷待ちだった、テキサスインスツルメンツのBLEアプリ開発キット「SensorTag」がRSコンポーネンツ様から届きました!やったね!

BLE(低消費電力のBluetoorh)、センサーてんこ盛り、そしてリーズナブルなプライス($25、日本ではRSコンポーネント様で3350円)の人気のあるキットです。小型(71.2 x 36 x 15.5mm)で素敵な赤いカバー(シリコン?)もついているので持ち運びも便利ですし、3Dプリンタでケースをプリントする必要もありません。また国内認証も取得済みで、さらに最新のファームではiBeaconも対応しているとのことなので、たっぷりと遊べそうですね。

sensorTagとultimakerロボ


搭載されているセンサは以下の通りです。
・赤外線温度センサ TMP006(TI)
・湿度センサSHT21(Sensirion)
・圧力センサT5400(Epcos)
・加速度センサKXTJ9(Kionix)
・ジャイロセンサIMU-3000(InvenSense)
・磁気センサMAG3110(Freescale)

さて、今回はSensorTagとRaspberry Pi をBLEでつないでセンサーデータを取得するところまでやってみましょう。

このSensorTagにはiOS, Androidのアプリとソースが公開されているのでBluetooth4.0対応のスマートデバイスをお持ちの方は簡単に動作確認やアプリ開発ができます。

が、私の所有している携帯とタブレットは古くてBLE未対応でして動作確認ができませんでした。とほほ・・・。Qtでもアプリ作りたかったんだけど無念です

Raspberry Piのセットアップ

まずRaspberryPiにはBLEに対応したBluetoothのUSBドングルを指します。今回はPLANEXのBT-Micro4を使用しました。

RaspberryPiでBLEを扱うためには、blueZと呼ばれるライブラリを使用することになります。今回は、ほぼこのページを参考にして進めました。

簡単に手順を紹介していきましょう。

・必要なライブラリをインストールします
sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make

・blueZのソースコードを取得
mkdir -p work/bluepy
cd work/bluepy
wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.4.tar.xz
xz -d bluez-5.4.tar.xz
tar xvf bluez-5.4.tar

・blueZのコンパイルとインストールをします
cd bluez-5.4
./configure --disable-systemd
make
make install

RaspberryPiでのコンパイルには多少時間がかかるので、その間、筆者は酒を飲んでました。

RPi2だと早いんだろうなという・・・make -j4とかな

SensorTagのスキャン

blueZのインストールが終了したらSensorTagをスキャンしてしましょう。SensorTagのボタンを押して次のコマンドを実行します。

sudo hcitool lescan
成功するとSensorTagのMACアドレスが出力されます。00:1e:3f:22:4b:a7のようなアドレスが表示されるのでCtrl-Cで終了し、アドレスをメモしておきます。

Pythonスクリプトの作成

さて、ではBLEキットと通信を行うプログラムはPythonを使ってサクサクと書いていきます。

今回はBlueZ用のpythonモジュールbluepyを使用しました。bluepyのgithubはこちらです。

workディレクトリに移動し、次のコマンドでbluepyを取得します。

git clone https://github.com/IanHarvey/bluepy.git

幸い、bluepyにはsensortag用のサンプルコードsensortag.pyが用意されています。

cd bluepy/bluepy
python sensortag.py --all sensortagのMACアドレス

実行すると以下のような出力が表示されます。素晴らしいですね。
('Connecting to ', '・・・・・・')
('Temp: ', (14.96875, 12.533883072524134))
('Humidity: ', (15.248315429687501, 53.9365234375))
('Barometer: ', (14.273310661315918, 1011.8373356866581))
('Accelerometer: ', (0.0, -0.96875, 0.046875))
('Magnetometer: ', (23.4375, 91.705322265625, -73.760986328125))
('Gyroscope: ', (0.0, 0.0, 0.0))

sensortag.pyは、以下のオプションで有効にするセンサを選択することが可能です。

optional arguments:
  -h, --help           show this help message and exit
  -n COUNT          データを取得回数
  -t T                 時間間隔
  -T, 温度
  -A, 加速度
  -H, 湿度
  -M, 磁力
  -B, 気圧
  -G, ジャイロ
  --all すべてのセンサを有効にする

おまけ

最後にSensorTagで取得したデータをIoTプラットフォーム「ThingSpeak」へアップして作成したグラフを紹介します。このグラフは私の部屋の温度ですね。



当初、BLEの低消費電力と搭載センサー群から、SensorTagは屋外用の気象センサとして最適ではないかと考えていましたが(特に気圧センサや磁気センサ)、実際使用してみると有効距離が短いことがわかりました。RaspberryPiと同じ部屋に置いている場合は問題ないのですが、壁ひとつ隔てた隣の部屋に置いただけで接続が不安定になります。ましてや屋外では全くつながりませんでした。しかし、それを除けばコストパフォーマンスは優秀ですから、室内用モニターとして使う分には満足できる性能ではないかと思います。

私の場合は、ホスト(RaspberryPi)は室内に設置することが前提となっていますが、当然ホストを屋外に設置できる場合にはまた違う結論になると考えられます。というか、もともと開発用キットですからね、無理を言っては申し訳ないです。開発用キットとしてはSensorTagはとても優秀です。

ThingSpeakとの連携方法についてはまた別の記事で詳しく解説する予定です。