Sony Mesh をハックする LEDタグの使い方編
概要
Sony のMeshで利用するLEDタグのBLE経由での使い方について説明する.
最近がっつり何かに取り組む時間もなかなかとれないので,少しづつ追記していく形にしようと思う.
経緯
SonyのMeshが市場に出回るようになった.
今日からスイッチサイエンスでも取り扱うらしい.
個人的に,ユーザのためのプログラミング環境にとても興味があって論文読んだり,製品調べたりしていてその一環でいじっている.
じゃあなんでMeshに限ってこんなことしてるのかと言うと,ユーザにとってビジュアルプログラミング言語によるハードウェアまで含めたプログラミングが生活に浸透しうるのか,という点に興味があるからだ.仮説としては難しいと思っているが,そこでどのようなハードルが,実際の一般ユーザにおいては存在するのかということに興味がある.
そのためにはもう少しデータがオープンになって,エコシステムが形成されていく必要があるのではないかと思っていてちょこちょことこんなことをしている.
本エントリでは複数あるタグのうちからLEDタグの利用方法について述べる.
LEDタグには,LightUp, Firefly, Blink, Offという4つの振る舞いが存在する.
LEDタグのBLE Service
LEDタグは,MESH-100LE1000159という名前でアドバタイズしている.
Service | UUID | プロパティ |
---|---|---|
Service | 72C90001-57A9-4D40-B746-534E22EC9F9E | |
Characteristics | 72C90002-57A9-4D40-B746-534E22EC9F9E | Write Without Response |
72C90003-57A9-4D40-B746-534E22EC9F9E | Notify | |
72C90004-57A9-4D40-B746-534E22EC9F9E | Write | |
72C90005-57A9-4D40-B746-534E22EC9F9E | Indicate |
Light Up
Light Upのパラメータは,Color, Brightness, Duration(sec)の3つがある. Color = white, Brightness = 1, Duration = 0.1の際のペイロードデータを以下に示す.
01:00:0c:00:0c:00:0c:64:00:64:00:00:00:01:ee
以下では,2~7Byte目のColor, Brightness,8~9Byte目のDurationについて説明する.
Color
フルカラーLEDが搭載されているためColorは,RGBの3要素の割合によって表現される. 各要素の明るさは,次に説明するBrightnessに基づいて設定される. 各要素は,設定されているBrightnessの値を基準として,その半分の値,オフ(0)という3パターンを取る.なので色は全部で以下の13色が利用できる.
以下の表では,その時設定されたBrightnessの値を1として,各色を表現する際のRGB各要素の値を示している.
色名 | R | G | B |
---|---|---|---|
白 | 1 | 1 | 1 |
黄 | 1 | 1 | 0 |
黄緑 | 0.5 | 1 | 0 |
緑 | 0 | 1 | 0 |
緑味の青 | 0 | 1 | 0.5 |
水色 | 0 | 1 | 1 |
青味の緑 | 0 | 0.5 | 1 |
青 | 0 | 0 | 1 |
青紫 | 0.5 | 0 | 1 |
紫 | 1 | 0 | 1 |
赤紫 | 1 | 0 | 0.5 |
赤 | 1 | 0 | 0 |
オレンジ | 1 | 0.5 | 0 |
Brightness
LEDの明るさを示す.
明るさは8bitで表現され,以下の5段階をとる.
また,Colorの項で述べたように,RGB各要素では色を表現するために,設定したBrightnessの1/2の値も利用されるので,これも合わせて記載する.
brightness | 値 | 1/2の値 |
---|---|---|
1 | 0x0C(12) | 0x06(16) |
2 | 0x19(25) | 0x0c(12) |
3 | 0x26(38) | 0x13(19)| |
4 | 0x52(82) | 0x29(41) |
5 | 0x7f(127) | 0x40(69) |
Duration (sec)
LEDが光る秒数を示す.
Durationは16bitのリトルエンディアンで表現されている.
設定するDurationの値は以下の式で求めることができる.
value = Duration(sec) * 1000 [0.1 <= Duration <= 30]
例
上記の3パラメータに従うと,以下のような例において,次のようなペイロードによりLEDタグを動作させることができる.
- 黄緑,brightness = 1, duration = 0.1
01:00:06:00:0c:00:00:64:00:64:00:00:00:01:dc
- オレンジ,brightness = 5, duration = 0.1
01:00:7f:00:40:00:00:64:00:64:00:00:00:01:89
- 白,Brightness = 1, duration = 1.0
01:00:0c:00:0c:00:0c:e8:03:64:00:00:00:01:75
- 白,brightness = 1, duration = 30.0
01:00:0c:00:0c:00:0c:30:75:64:00:00:00:01:2f