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との連携方法についてはまた別の記事で詳しく解説する予定です。