SensorTag (CC2650STK) という温湿度/気圧/照度/加速度センサー搭載のBluetooth Low Energyセンサーがあります。 以前は1個4000円程度で買えていました。なんと、技適も通っているようで、安心して使えます。 アメリカの半導体メーカーTexas Instrumentsが開発者向けに出している開発キットです。
このように便利なセンサーだったのですが、なんと生産終了になってしまい、2020年8月現在、流通在庫が1個9000円程度に高騰してしまっています。 後継品の新しいSensorTag (LPSTK-CC1352R)が発売されていてこちらは1個5000円くらいで買えるようですが、技適はまだ通っていないようです。
というわけで、あまり広くお勧めできる商品ではなくなってしまったSensorTagですが、私自身はCC2650STKのほうのSensorTagを2個持っているので、せっかくなので記事にしておきます。
SensorTag (C2650STK)
こちらがSensorTagです。赤いソフトケース入りで、設置しやすくなっています。
中身はこのようになっています。
裏面はこちら。CR2032というコイン電池で動きます。技適マークもあり安心です。
これ自体はBluetooth Low Energy、ZigBee、Threadなど各種プロトコルに対応できる開発キットなのですが、 デフォルトではBluetooth Low Energyのファームウェアが入っていますので、そのまま使えます。
Raspberry Piからアクセス
Raspberry Pi OSには標準でBluetooth Low Energyスタックのbluezが入っており、標準的なツールも使えます。
SensorTagをスキャン
まずは、SensorTagをスキャンしてみましょう。 SensorTagの電源を入れると、2分間アドバタイズが行われます。自分の情報を定期的に送信し、周囲のBluetooth Low Energy端末に自分の存在を知らせます。
Raspberry Pi側で次のコマンドを入力すると、アドバタイズを受信して情報を表示します。
$ sudo hcitool lescan
SensorTagが見つかると、次のようにMACアドレスが出てきます。 他に、マウスやスピーカーなど、周辺にあるBluetooth Low Energyデバイスのアドレスもたくさん出てくるかもしれません。
LE Scan ... 54:6C:0E:79:13:06 (unknown) 54:6C:0E:79:13:06 CC2650 SensorTag
私の場合は、54:6C:0E:79:13:06
がMACアドレスのようです。
センサーの情報にアクセス(gatttool編)
センサーの情報にアクセスしてみましょう。SensorTagのBluetooth Low Energyでのアクセス仕様は以下のページに書かれています。
SensorTagは、Bluetooth Low EnergyのメインのプロファイルであるGATT (Generic attribute profile) というものに従って通信します。 GATTの仕組みはこちらのページで解説しています。
Raspberry Piや多くのLinuxマシンでは、gatttool
というツールで、GATTプロファイルの機器と通信できます。試してみましょう。
接続
まずは、先ほどのMACアドレスのSensorTagに接続します。
$ gatttool -I -b 54:6C:0E:79:13:06
実行すると、プロンプトが出てきます。connect
コマンドで実際に通信を行い、接続を試みます。
[54:6C:0E:79:13:06][LE]> connect Attempting to connect to 54:6C:0E:79:13:06 Connection successful
Connection successfulと出れば接続成功です。
Characteristics一覧取得
characteristics
コマンドを実行すると、SensorTagが持つCharacteristicsを取得できます。
実行結果が長いので画像で貼り付けましたが、ずらっと出てきます。 たくさんのセンサーが搭載されているので、様々なCharacteristicsが定義されています。 各Characteristicsは、センサー値やセンサーのON/OFFなどのデータに割り当てられており、読み書きができます。
温湿度センサーの値を取得
例として、温湿度センサーの値を読み取ってみましょう。先ほどのTexas InstrumentsのWikiページには、次のように書かれています。
Data、Notification、Configuration、Periodの4つのCharacteristicsが定義されています。 Dataに温湿度の値が入っているようですね。さっそく読んでみましょう。
読むには、char-read-uuid
コマンドで、UUIDを指定します。
上の表には、DataのUUIDはAA21*
とありますが、この*の注釈を見ると、Texas InstrumentsのベースUUIDである
F000xxxx-0451-4000-B000-000000000000
のxxxxの部分を表していることがわかります。
ということで、温湿度センサーのUUIDはF000AA21-0451-4000-B000-000000000000
となります。
ややこしいですね。
実際に読んでみました。
[54:6C:0E:79:13:06][LE]> char-read-uuid F000AA21-0451-4000-B000-000000000000 handle: 0x002c value: 00 00 00 00
全て0の値が帰ってきてしまいました。 実は、デフォルトでは節電のためセンサーの電源が入っていないので、 読みたいときにセンサーの電源を入れて計測する必要があります。
温湿度センサーのON/OFF
温湿度センサーのON/OFF設定が先ほどのConfigurationというCharacteristicsです。 表によると、これに1を書くとONになるようです。
Characteristicsに値を書くには、ハンドルという短縮番号のようなものを取得する必要があります。
ConfigurationのUUIDはAA22*
なので、これを読みます。
[54:6C:0E:79:13:06][LE]> char-read-uuid F000AA22-0451-4000-B000-000000000000 handle: 0x002f value: 00
ハンドルは0x002f
だそうです。いまはvalueが0なので、センサーはOFFですね。
ここに1を書いてみましょう。char-write-req
コマンドで書き込みます。
[54:6C:0E:79:13:06][LE]> char-write-req 002f 01 Characteristic value was written successfully
書き込めましたね。ちなみに、char-write-reqの書き込む値ですが、1
とするとなぜかエラーになります。01
と指定する必要があるようです。
gattool
コマンドのパーサー仕様と思われますので、注意してください。
今度こそ温湿度センサーのセンサー値取得
センサーをONにしたので、改めてセンサー値を読んでみましょう。
[54:6C:0E:79:13:06][LE]> char-read-uuid F000AA21-0451-4000-B000-000000000000 handle: 0x002c value: a8 64 3c aa
今度は何かデータが入っています。表を見ると、温度(Temp)が0x64a8
、湿度(Hum)が0xaa3c
のようです。
換算式が先ほどのWikiに出ています。
void sensorHdc1000Convert(uint16_t rawTemp, uint16_t rawHum, float *temp, float *hum) { //-- calculate temperature [°C] *temp = ((double)(int16_t)rawTemp / 65536)*165 - 40; //-- calculate relative humidity [%RH] rawHum &= ~0x0003; // remove status bits *hum = ((double)rawHum / 65536)*100; }
この通りにWindowsの電卓で計算してみると、温度が24.9℃
、湿度が66.5%
となりました。
部屋にある100均の?温湿度計を見てみると、まあ正しそうな数字になっていますね。
終了
最後に、電池が減るのでセンサーの電源をOFFにしておきましょう。
[54:6C:0E:79:13:06][LE]> char-write-req 002f 00 Characteristic value was written successfully [54:6C:0E:79:13:06][LE]> exit
exit
でSensorTagとの接続を終了し、gatttoolを終了します。