ブログ

Armadillo-IoT:RN4020アドオンでBLE照度センサーのデータを読む

at_kazutaka.bito
2015年8月29日 14時46分

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

のように出力する。