Armadillo-IoT+RN4020アドオンモジュールで、 BLE照度センサー http://www.robotsfx.com/robot/BLECAST_BL.html から照度データを読んでみた。
このセンサーは、アドバタイジングパケットに照度データが付加されているので、 Armadillo-IoT: BLEアドオンモジュールを利用してみた のアドバタイジング・パケットを受信するサンプルを改造して照度データを抽出する。
手順
1.BLE照度センサーに電池を入れておく。
2.Armadillo-IoTのCON1にRN4020アドオンモジュールを接続して電源を入れる。
補足)後述のbeacond.exp内で、
set g_serial /dev/ttymxc3
のようにCON1側のデバイスファイル(/dev/ttymxc3)を指定してるため、本手順ではCON1に接続している。 CON2に接続して使用する場合は、上記のttymxc3の箇所をttymxc0にする。
3.expectでdictを使えるようにする。
Armadillo-IoT: BLEアドオンモジュールを利用してみたの 「無理やりtcl8.5を利用する方法」の手順を実行する。
4.Armadillo-IoT: BLEアドオンモジュールを利用してみたのbeacond.expとcallback_sample.shを改造する。
(改造内容については末尾の解説を参考。)
ここでは、改造済みのbeacond.expとcallback_sample.shは、 添付のble_lux_20150829.tar.gz にまとめてあるので、このble_lux_20150829.tar.gzをArmadillo-IoTに置いて
tar zxvf ble_lux_20150829.tar.gz
で解凍して beacond.exp callback_sample.sh に実行権限をつける。
5.beacond.expとcallback_sample.shのあるディレクトリで
expect ./beacond.exp ./callback_sample.sh
のように実行すると、
==> now scanning (5 sec)... ==> all records [MACアドレス], 78, 9999F5F0FA010C09424C45434153545F424C00
のようなログが出る。
また、[MACアドレス].csvというファイルに
[MACアドレス],78,9999F5F0FA010C09424C45434153545F424C00,FA,01,506
のようにログが出力される。
上記のログの場合、末尾の値の 506 が、照度[lx]である。
解説
beacond.exp:
Armadillo-IoT: BLEアドオンモジュールを利用してみたのアドバタイジング・パケットを受信してみる とおり、対話形式でBLE照度センサーから受信したデータをパースしてcallback_sample.shに渡している。 同ブログでは、電波強度を抽出していたが、本サンプルでは、受信データをそのままcallback_sample.shに渡すようにした。 元のサンプルをbeacond.exp_orgにリネームしてdiffをとると下記のようになる。
[root@armadillo-iotg (ttymxc1) /mnt/tcl85]# diff ./beacond.exp_org ./beacond.exp --- beacond.exp_org +++ beacond.exp @@ -103,7 +103,7 @@ rn4020_command_background "F" set timeout $t expect_background { - -re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]{48})([0-9A-F]+)\r} { + -re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]+)\r} { set g_scan_results([array size g_scan_results]) $expect_out(0,string) } "AOK\r" { @@ -126,13 +126,13 @@ proc rn4020_parser {} { global g_scan_results - set re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]{48})([0-9A-F]+)} + set re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]+)} for { set i 0 } { $i < [array size g_scan_results] } {incr i} { - if {[regexp $re $g_scan_results($i) foo beacon type rssi uid txpower]} { + if {[regexp $re $g_scan_results($i) foo beacon type rssi sensdata]} { #puts "beaconid: $beacon" #puts "rssi: [expr 0x$rssi]" #puts "txpower: [expr 0x$txpower]" - add_record $beacon [expr 0x$rssi] [expr 0x$txpower] + add_record $beacon [expr 0x$rssi] $sensdata } } } @@ -169,7 +169,7 @@ while {true} { - passive_scan 1 + passive_scan 5 #display_scan_results rn4020_parser
callback_sample.sh:
beacond.expから渡される3つの引数に基づき、照度データを抽出して、[MACアドレス].csvにログを出力する。 以降、上記手順5のログ出力時の例として、beacond.expからの引数が [MACアドレス] 78 9999F5F0FA010C09424C45434153545F424C00 の場合で説明する。
BLE照度センサー http://www.robotsfx.com/robot/BLECAST_BL.html の仕様より、上記の3番目の引数 9999F5F0FA010C09424C45434153545F424C00 の 9999F5F0FA01 が、センサーデータの部分で 0x99、0x99:ヘッダ 0xF5、0xF0:カウンタ 0xFA、0x01:センサー値 となっているようだ。
そこで、 9999F5F0FA010C09424C45434153545F424C00 に対して、9,10Byteがセンサー値のLSB、11,12Byteがセンサー値のMSBを
luxlsb=`echo $3 | cut -c 9-10` luxmsb=`echo $3 | cut -c 11-12`
によって抽出する。これにより、 luxlsb:センサー値のLSB(例では、"FA") luxmsb:センサー値のMSB(例では、"01") となる。
照度=センサー値のMSB*256+センサー値のLSB なので、
lux=`expr $((0x$luxmsb)) \* 256 + $((0x$luxlsb))`
と計算すると、 lux:照度(例では、0xFA * 256 + 0x01 = 506) となる。
上記の結果を持って、[MACアドレス].csvにbeacond.expからの引数に luxlsb:センサー値のLSB(例では、"FA") luxmsb:センサー値のMSB(例では、"01") lux:照度(例では、0xFA * 256 + 0x01 = 506) を加えて、
[MACアドレス],78,9999F5F0FA010C09424C45434153545F424C00,FA,01,506
のように出力する。