みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

SensorTag (CC2650STK) とBLE通信 ~ gatttoolでアクセス

SensorTag (CC2650STK) という温湿度/気圧/照度/加速度センサー搭載のBluetooth Low Energyセンサーがあります。 以前は1個4000円程度で買えていました。なんと、技適も通っているようで、安心して使えます。 アメリカの半導体メーカーTexas Instrumentsが開発者向けに出している開発キットです。

www.ti.com

このように便利なセンサーだったのですが、なんと生産終了になってしまい、2020年8月現在、流通在庫が1個9000円程度に高騰してしまっています。 後継品の新しいSensorTag (LPSTK-CC1352R)が発売されていてこちらは1個5000円くらいで買えるようですが、技適はまだ通っていないようです。

というわけで、あまり広くお勧めできる商品ではなくなってしまったSensorTagですが、私自身はCC2650STKのほうのSensorTagを2個持っているので、せっかくなので記事にしておきます。

SensorTag (C2650STK)

SensorTag

こちらが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でのアクセス仕様は以下のページに書かれています。

processors.wiki.ti.com

SensorTagは、Bluetooth Low EnergyのメインのプロファイルであるGATT (Generic attribute profile) というものに従って通信します。 GATTの仕組みはこちらのページで解説しています。

www.mikan-tech.net

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を終了します。