ボクにもわかる電子工作

Raspberry Pi、IchigoJam、Wi-Fi、BLE、XBee、RN-42、ESP-WROOM-02、ESP32

全体表示

[ リスト ]

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に接続したときの様子を下図に示します。

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

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

イメージ 2
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受信スクリプト ★追記(2016/11/19 17:15)

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

または、

$ cd
$ cd ~/RaspberryPi/network/sakura
〜ここで、スクリプトにTalkenを追加(後述)〜
$ ./sakuraGetVal.sh
さくらのIoT Platformβへアクセスし、「連携サービス」に「WebSocket」を追加してください。 
追加すると 「Talken」が発行されるので、スクリプト中の「TALKEN=」の部分にTaklenを記述してください。

#!/bin/bash
# さくらのIoT Platform β からWebsocketで転送したデータを受信する
#
# Copyright (c) 2016 Wataru KUNINO

TALKEN="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 
DEVICE="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/${TALKEN}`
    # 参考文献 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/

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事