Raspberry Piでbluetoothを使って、SensorTagと接続し、各センサーの情報をiBeaconで取得します。bluetoothのアダプタにはPlanexのBT-Micro4を使用し、 Bluetooth プロトコルスタックにはBluez を使用し、Raspberry Pi上のRaspbianとSensorTagを、Bluetooth Low Energy(BLE)を使ったiBeaconで接続します。

動作環境

  • Planex BT-Micro4
  • Raspberry Pi
  • CC2541 SensorTag
  • Bluez ver5.21

SensorTagの外観

今回使用するCC2541 SensorTagは、TI の CC2541 ワイヤレス・マイコンをベースにし、6 個のローパワー MEMS センサとBluetooth Smart 無線を搭載し、シングル・セルのコイン・セル・バッテリ(CR2032)により、無信号時消費電流 8uA で数年間駆動します。含まれるセンサーは次のようになっています。

  • 温度 TMP006
  • 湿度 SHT21
  • 圧力 T5400(C953A)
  • 加速度計 KXTJ9
  • ジャイロスコープ IMU-3000
  • 磁力計 MAG3110

BT-Micro4ドングルをRaspberry Piに接続し、lsusbコマンドで接続して確認します。結果を見ると、Device 004に接続されていることが確認できます。

$ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

追加パッケージを見つけるのに、データベースを更新します。

$ sudo apt-get update

必要なライブラリを確認します

$ sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev

最新バージョンをダウンロードして、Raspbianにのbluezをインストール(現時点で5.21)します。

$ sudo wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.21.tar.xz
$ sudo tar xvf bluez-5.21.tar.xz

作成されたBluez フォルダ「bluez-5.21」に移動して, configureとinstallを行います。コンパイルに少し時間がかかります。

$ cd bluez-5.21
$ sudo ./configure –disable-systemd
$ sudo make
$ sudo make install
$ sudo cp attrib/gatttool /usr/local/bin/

Raspberry Piの電源を切って、the Bluetooth dongle「BT-Micro4」を接続し、再びRaspberry Piの電源を入れます。

$ sudo shutdown -h now

BT-Micro4が接続されているUSBドングルの電源を入れます。

$ sudo hciconfig hci0 up

SensorTagをRaspbianに登録するにはBD(Bluetooth Device)アドレスが必要なので、SensorTagの側面のスイッチを押してアドバタイズ状態にし、hcitoolコマンドを実行します。

$ sudo hcitool lescan
LE Scan …
B4:99:4C:64:CD:DF (unknown)
B4:99:4C:64:CD:DF SensorTag
B4:99:4C:64:CD:DF (unknown)
B4:99:4C:64:CD:DF SensorTag
B4:99:4C:64:CD:DF (unknown)
(ctrl c)

hcitoolコマンドでSensorTagに接続します。

$ sudo hcitool lecc B4:99:4C:64:CD:DF
Connection handle 70

gatttoolコマンドを使用して、対話的にSensorTag のセンサーの情報を読み込みます。次の例では、SensorTagのセンサーを切り替えて、センサーからのデータを読み込みます。SensorTagの温度センサーのデータを読み込みます。

$ sudo gatttool -b B4:99:4C:64:CD:DF --interactive
[B4:99:4C:64:CD:DF][LE]> connect
Attempting to connect to B4:99:4C:64:CD:DF
Connection successful
[B4:99:4C:64:CD:DF][LE]> char-read-hnd 0x25
Characteristic value/descriptor: 00 00 00 00
[B4:99:4C:64:CD:DF][LE]> char-write-cmd 0x29 01
[B4:99:4C:64:CD:DF][LE]> char-read-hnd 0x25
Characteristic value/descriptor: 8e fe 34 0d
[B4:99:4C:64:CD:DF][LE]> exit

ハンドルを用いたSensorTagの温度センサー(U5)への問い合わせは、次のテーブルに従います。

SensorTagの温度センサー(U5)への問い合わせ
Type UUID Handle Read/Write Format
<Data> F000AA01 * 0×25 Read/Notify ObjLSB ObjMSB AmbLSB AmbMSB (4 bytes)
<Data Notification> 0×26 R/W 2 bytes
<Configuration> F000AA02 * 0×29 R/W 1 byte

Objはobject temperatureで、Ambはthe ambient temperatureを示します。

gatttoolコマンドは、インタラクティブモードの他に、ノンインタラクティブモード(non-interactive mode) で使用できます。ノンインタラクティブモードで使用する方法を次に示します。SensorTagの温度センサーのデータを読み込んでみます。

$ sudo gatttool -b B4:99:4C:64:CD:DF –char-write -a 0x29 -n 01; sleep 1; sudo gatttool -b B4:99:4C:64:CD:DF –char-read -a 0x25;

次の結果が表示されるます。

Characteristic value/descriptor: 5a ff 28 09