IchigoJam×さくらのIoTで遠隔地の照度を測るワイヤレスセンサ

IchigoJamをさくらのIoT Platformβ用の「LTEモジュール」へ接続し、遠隔地の照度を測るワイヤレス・センサの実験をしてみましたので、その方法を紹介します。
さくらのIoT Platformβとは、LTEモジュールとクラウドAPIの組み合わせによるIoTクラウドサービスです。詳しくは下記を参照してください。
さくらのIoT:
LTEモジュール:

ハードウェア

さくらのIoTのLTEモジュールを購入し、IchigoJamへI2Cで接続します。注意点は、このLTEモジュールのIOが1.8Vであることです。
そこで、秋月で販売されている「I2Cバス用双方向電圧レベル変換モジュールAE-PCA9306」を購入し、信号の電圧レベル変換を行いました。IchigoJamの開発者の福野さんも、同じものを購入中のようで、ボクだけが「うっかり者」ということではなさそうです。
さくらのIoT Platformβ、ブレイクアウトボードでハードウェア準備(福野泰介の一日一創)
http://fukuno.jig.jp/1578
ミニブレッドボードへAE-PCA9306と照度センサNJL7502Lを実装し、IchigoJamに接続したときの様子を下図に示します。

さくらのIoT Platformβ用のLTEモジュールをIchigoJamに接続したときの様子。I2Cの電圧レベル変換に秋月で販売されているAE-PCA9306を使用した(ブレッドボード中央)。また、照度センサNJL7502LをIchigoJamのBTN端子へ入力し、照度センサを実現。

ブレッドボード部の拡大図を下記に示します。AE-PCA9306の8ピンのうち7ピンを使用します。

I2C信号電圧を変換する回路の拡大図。

照度センサ用プログラムの製作

今度はプログラムの製作です。IchigoJam BASICファームウェア1.2.1にて動作を確認しました。
まず、行番号110で、LTEモジュールの状態取得コマンドをメモリーに保存し、gsb900でLTEモジュールへ送信します。ただし、今回は、状態取得結果を受信しません(後述)。
次に、行番号210では、BTN端子の電圧のAD変換値を、変数Aに代入し、同様にLTEモジュールへ送ります。
行番号900以降のサブルーチンはI2Cの通信処理部です。行番号940でLTEモジュールへコマンドを送信します。変数Cはパリティチェックです。これはデータ転送が正しく行えたかどうかを確認するためのもので、行番号920のXOR演算で求めました。
new
1 cls:?”SAKURA IoT
2 ?”アナログ ニュウリョク A=BTN
3 ?”I2C SDA ポート IN3
4 ?”I2C SCL ポート EX1/SCL
5 W=600:?”ソクテイ カンカク W=”;W
6 ‘ CC BY Wataru Kunino
rem https://bokunimo.net/ichigojam/
100 ‘INIT
110 rem poke#700,1,0:N=1:gsb900
200 ‘DATA
210 A=ana(0):?”ana(0)=”;A
220 poke#700,32,10,0,73,A&255,A>>8,0,0,0,0,0,0:N=11:gsb900
300 ‘SEND
310 rem poke#700,34,0:N=1:gsb900
320 poke#700,36,0:N=1:gsb900
390 led0:waitW:led1:goto100
900 ‘I2C
910 C=0:forI=0toN
920 C=C^peek(#700+I):next
930 N=N+1:poke#700+N,C:
940 ifi2cw(79,#700,1,#701,N)?”E
950 forI=0toN:?peek(#700+I);
960 ?” “;:next:?
970 rtn
実行すると、10秒ごとに、照度センサのAD変換値をLTE回線を経由し、クラウドへ送信します。クラウドへの送信が適切に行えているかどうかは、データをWebsocketへ転送して確認してみました。赤文字の部分が照度センサからのデータ値です。
< {“type”:”keepalive”,”datetime”:”2016-11-19T01:31:59.612951624Z”}
< {“module”:”xxxxxxxxxxxx”,”type”:”channels”,”datetime”:”2016-11-19T01:31:59.81789892Z”,”payload”:{“channels”:[{“channel”:0,”type”:”I”,”value”:90,”datetime”:”2016-11-19T01:31:59.619900396Z”}]}}
< {“module”:”xxxxxxxxxxxx”,”type”:”channels”,”datetime”:”2016-11-19T01:32:03.57512591Z”,”payload”:{“channels”:[{“channel”:0,”type”:”I”,”value”:35,”datetime”:”2016-11-19T01:32:03.376127685Z”}]}}
< {“module”:”xxxxxxxxxxxx”,”type”:”channels”,”datetime”:”2016-11-19T01:32:04.38094769Z”,”payload”:{“channels”:[{“channel”:0,”type”:”I”,”value”:43,”datetime”:”2016-11-19T01:32:04.183949519Z”}]}}

Raspberry Pi用 WebSocket受信スクリプト ★追記(2019/05/19)

さくらのIoTへアップロードしたデータを、WebSocketでダウンロードするスクリプト(Bash用、Python用)を作成しました。下記からダウンロードして使っていただくことができます。Raspberry Piなどで動作します。

https://github.com/bokunimowakaru/RaspberryPi/blob/master/network/sakura/sakuraGetVal.sh
または、
https://github.com/bokunimowakaru/RaspberryPi/blob/master/network/sakura/ws_logger.py

$ git clone https://github.com/bokunimowakaru/RaspberryPi.git
$ cd ~/RaspberryPi/network/sakura

~ここで、スクリプトにTokenを追加(後述)~

$ ./sakuraGetVal.sh
または
$ ./ws_logger.py

さくらのIoT Platformβへアクセスし、「連携サービス」に「WebSocket」を追加してください。
追加すると 「Token」が発行されるので、スクリプト中の「TOKEN=」の部分にTokenを記述してください。
#!/bin/bash
# さくらのIoT Platform β からWebsocketで転送したデータを受信する
#
# Copyright (c) 2016 Wataru KUNINO

TOKEN=”xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”

D
EVICE=”sakra_1″
INTERVAL=3
while true; do
DATA=`timeout $INTERVAL curl -s -N \
-H ‘Sec-WebSocket-Version: 13’ \
-H “Sec-WebSocket-Key: $(head -c 16 /dev/urandom | base64)” \
-H “Connection: Upgrade” \
-H “Upgrade: websocket” \
https://api.sakura.io/ws/v1/${TOKEN}`
# 参考文献 http://hateda.hatenadiary.jp/entry/debugging-websocket-using-curl
if [ -n “$DATA” ]; then
DATE=`echo $DATA\
|tr ‘,’ ‘\n’\
|grep \”datetime\”\
|head -1\
|cut -c13-31\
|tr “-” “/”\
|tr “T” ” “`
DATE=`date –date “${DATE} UTC” “+%Y/%m/%d %H:%M:%S”` # UTCをJST(等)へ変換
echo -n ${DATE}”, “${DEVICE}”, ”
VALUE=`echo $DATA\
|tr ‘{‘ ‘\n’\
|grep “\”channel\”\:0″\
|head -1\
|tr ‘,’ ‘\n’\
|grep \”value\”\
|head -1\
|cut -c9-`
echo $VALUE
fi
done
実行したときの様子を以下に示します。IchigoJamからは10秒ごとに送信していますが、まれにデータが欠損していることがわかります。この原因は、timeoutコマンドを使用し、WebSocketのセッションを3秒ごとに切断して、データ処理をしているためです。
pi@raspberrypi ~/RaspberryPi/network/sakura $ ./sakuraGetVal.sh
2016/11/19 17:07:19, sakra_1, 81
2016/11/19 17:07:28, sakra_1, 94
2016/11/19 17:07:38, sakra_1, 82
2016/11/19 17:07:49, sakra_1, 80
2016/11/19 17:07:59, sakra_1, 91
2016/11/19 17:08:39, sakra_1, 93
2016/11/19 17:08:49, sakra_1, 79
2016/11/19 17:08:59, sakra_1, 81
2016/11/19 17:09:10, sakra_1, 80
2016/11/19 17:09:50, sakra_1, 81
2016/11/19 17:10:00, sakra_1, 82
2016/11/19 17:10:10, sakra_1, 79
2016/11/19 17:10:20, sakra_1, 79
2016/11/19 17:10:51, sakra_1, 81
2016/11/19 17:11:01, sakra_1, 78
2016/11/19 17:11:11, sakra_1, 80
2016/11/19 17:11:21, sakra_1, 81

I2C通信部の不具合!?

原因はわかっていませんが、I2Cコマンドの結果を受信しようとすると、LTEモジュール側は応答を返すのに、IchigoJam側がACKを返さずにハングアップしてしまいます。また、LTEモジュール側も、ACKが来るまで待機し続けているようです。このため、今回はI2CRを用いずに、すべてI2CWでコマンドを発行しました。
ボクの勘違いか、IchigoJamやLTEモジュールのI2Cの不具合だと思います。今後、治れば、I2CRに置き換えて、LTEモジュールからの応答値をチェックしようと思います。
(2017/3/16追記)
IchigoJamのファームウェア 1.2.1では、I2CRコマンドが動作しませんでしたが、β版のファームウェア1.2β40(SAKURA IoT対応版)にて、動作するようになりました。
詳しい情報は
を、参照してください。
(2017/3/17追記)
IchigoJam ファームウェア の1.2β42から、I2Cコマンドの引数が簡単になりました。本ブログのサンプルの例だと、新表記では、以下のようにI2Cアドレス、メモリアドレス、送信バイト数の順に引数を記述します。
(旧)従来表記:940 ifi2cw(79,#700,1,#701,N)?”E
(新)省略表記:940 ifi2cw(79,#700,N+1)?”E
従来の記述のままでも、動作しました。
受信用のI2CRコマンドについては、従来、送信と受信の両方の役割となっていましたが、新表記では受信のみを行うことが出来るようになったみたいです。
多くの場合は、I2CWコマンドでデバイスへ命令を送信してから、I2CRコマンドで応答を受け取るような記述になると思います。
(2017/3/18追記)
属性の読み取り機能を追加し、またIoTセンサ用クラウドサービスAmbientへの転送の実験を行った続編を公開しました。
続編はこちら:

by ボクにもわかるIchigoJam用 IchigoSoda / sakura.io
https://bokunimo.net/ichigojam/