カテゴリー
IchigoJam

IchigoJam×さくらのIoTβLTEモデムで照度値をAmbientへ転送

IchigoJamにさくらのIoT Platform βを接続する実験の続編です。今回は、IchigoJamからLTEモジュールの属性を読み込む機能を追加し、照度センサ値をIoTクラウドサービスAmbientへデータ転送する実験を行いました。
昨年11月に実験を行った時は、IchigoJamからの属性読み取りが出来ませんでした。例えば、LTEモジュールの電源を投入した直後や、省電力化のためにLTEモジュールの電源のON/OFFを制御していた場合、LTEモジュールの接続状態を取得できないので、適切に測定結果を送信することが出来ませんでした。
前回の実験:
IchigoJamにさくらのIoT Platformβ用の「LTEモジュール」へ接続し、
遠隔地の照度を測るワイヤレス・センサの実験の様子
今回は、IchigoJamのベータ版ファームウェアを使って属性の読み取りを行う実験と、Ambientへのデータ転送を行う方法について説明します。
さくらのIoT Platformβ用のLTEモジュールは、携帯電話事業者ソフトバンク社の4Gネットワークに対応したIoT製品組み込み用のLTE通信モジュールです。
「プラットフォーム」と名付けられている通り、通信モジュールだけでなく、ソフトバンクの4G用SIMカード、IoT用のクラウドサービスのセットで提供されています。
さくらのIoT Platform β用のLTE通信モジュールAX-919-1とブレイクアウトボードAX-920-1を組み合わせたときの様子。ソフトバンクの4Gネットワークに対応したSIMカードも実装されている(規約上、SIMカードの取り外しはできない)。
さくらのIoT Platformβ販売元:
  ・さくらの通信モジュール(LTE)-β版 -定価9,960円
  ・ブレイクアウトボード(検証ボード)-β版 -定価5,000円
Arduino用シールドも8000円で販売されていますが、私はモジュールとブレイクアウトボードを購入し、Arduino用のピン配列に変換する中継基板を製作しました(後述)

さくらIoTの読み取りに対応したIchigoJam用のベータ版ファームウェアが公開に

さくらのIoT用LTEモジュールからの読み取りに対応したIchigoJam用のベータ版ファームウェア1.2β40とβ42がリリースされましたので、LTEモジュールが接続状態にあることを確認するための属性読み取りが可能になりました。
ファームウェア     さくらのIoT Platformβへの接続性           _
IchigoJam 1.2.1    データ送信のみ可能(状態の確認や受信が出来ない)
IchigoJam 1.2β42  属性読み取り、データ送信、データ受信の全てが可能
IchigoJam 1.2β40ではI2CRコマンドで属性読み取りが可能に、またβ42では引数の一部を省略可能になりました。β42の新表記では、以下のようにI2Cアドレス、メモリアドレス、送信バイト数の順に引数を記述することが出来ます。
(旧)従来表記の例: i2cw(79,#700,1,#701,N)
(新)省略表記の例: i2cw(79,#700,N+1)
β42に従来表記を使用しても使用可能であり、上位互換コマンドとなっています。
今回は、従来のIchigoJamファーム1.1.1および1.2.1との互換性を考慮し、新表記ではなく旧表記を使用しました。

古い IchigoJam ファームウェア Ver 1.1.1が使用されている市販キット製品。
   左=IchigoJam コアセット(秋月電子通商)
   右=IchigoJam用コンピュータ電子工作学習キット IF ICH-KIT・Personal Computer基板(CQ出版社)

IchigoJam用のプログラム「ワイヤレス照度センサ」

前回のプログラムをもとに属性読み取り機能を追加したプログラムを以下に示します。修正した部分は行番号100~150の部分です。
従来のIchigoJam Ver 1.1.1や1.2.1を使用していた場合は行番号200へジャンプし、センサ値の送信のみを行います(※今回、対応した属性読み取り機能は使いません)。
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 ifver()<12240goto200
120 poke#700,1,0,1
130 ifi2cr(79,#700,3,#780,4)?”‘”;:waitW:goto120
140 ifpeek(#782)<>128?”.”;:waitW:goto120
150 ?”Connected”

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”         :’ -> ifi2cw(79,#700,N+1)?”E
950 forI=0toN:?peek(#700+I);
960 ?” “;:next:?

970 rtn

“ltr”>

IchigoJam 1.1.1および、1.2.1、1.2β42で動作を確認。
後述のPersonal Computer基板や秋月電子通商のIchigoJamコアキットなどでは、
IchigoJam 1.1.1が、純正のIchigoJam TなどではIchigoJam 1.2.1が実装されている。
これらすべてのIchigoJamで動作することを確認した。
行番号900番台はLTEモジュールからデータを送信する処理部(機器ドライバ部)です。この処理部では受信処理を行っていないので、古いファームウェア(IchigoJam 1.1.1や1.2.1)でも動作します。
プログラムをIchigoJamマイコンへ転送し、前回(https://bokunimo.net/blog/ichigojam/103/)と同じように照度センサを接続すれば、ワイヤレス照度センサの完成です。

IchigoJamを制御したい場合の参考情報

ワイヤレスLEDのようにインターネット側からIchigoJamを制御したい場合は、受信処理が必要になります。受信にも対応したサンプルプログラムについては、IchigoJamの開発者である福野さんのブログで紹介されています。こちらを使用すれば、一つの機器ドライバ部で属性読み取り、データ受信、データ送信の全てが可能です(IchigoJamファームウェアには1.2β42を使用する)。
blink a LED via web on IchigoJam
 
900 @I2C
910 M=PEEK(#701)+2
920 C=0:FOR I=0 TO M-1:C=C^PEEK(#700+I):NEXT:POKE#700+M,C
930 IF I2CR(79,#700,M+1,#780,N+1) STOP
940 C=0:FOR I=0 TO N-1:M=PEEK(#780+I):C=C^M:?M;” “;:NEXT:?
950 IF C!=PEEK(#780+N) OR PEEK(#780)!=1 STOP
960 RTN

I2Cのプルアップ抵抗に注意

下図は、CQ出版社から販売されている「IchigoJam用コンピュータ電子工作学習キット(IF ICH-KIT)」のPersonal Computer基板を使って、さくらのIoTプラットフォームβのLTEモジュールを接続した場合の一例です。
I2C信号の電圧を1.8Vに変換するために秋月電子通商のAE-PCA9306を使用しています。ただし、私の実験では、プルアップ抵抗が1kΩと低いので、液晶やEEPROMなどが動作しなくなりました。Personal Computer基板に10kΩのプルアップ抵抗を実装しているので、AE-PCA9306側のプルアップ抵抗を外すと良いでしょう。他のマイコンボードでもプルアップ抵抗を10kΩくらいにしたほうが良いでしょう。
LTEモジュールとマイコンボードとの間に、中継用の基板を挟む3枚構造。中継用の基板にはI2C信号のレベル変換用に秋月電子通商のAE-PCA9306を実装した。プルアップ抵抗が1kΩと低いので、他のI2C通信へ影響することがあるので、プルアップ抵抗を取り外すか基板裏面のパターンを切断する。また、Arduino用のI2C信号は5Vで、IchigoJamの3.3Vと合わないので、中継基板に電圧切り替えスイッチを実装した。
一見しただけでは、なんの実験を行っているかが分からない地味な写真。基板裏面にもモジュールの名称やロゴのシルク印刷が欲しいところ。

IoTセンサ用クラウドサービスAmbientへデータを送信する

Ambientは、アンビエントデーター株式会社 (AmbientData Inc.)が提供しているIoTセンサ用のクラウドサービスです。センサなどから送信したデータを簡単にグラフ化し、パソコンだけでなくスマートフォンからも閲覧することが出来ます。
アンビエントデータ株式会社が提供しているIoTセンサ用のクラウドサービスAmbientの表示例。センサ値をHTTP(json形式)でアップロードすると、簡単にグラフ化して閲覧することが可能になる。
今回、さくらのIoTプラットフォームへ送信した照度センサ値を、Ambientへ転送してみました。しかし、今のところ、さくらのIoTプラットフォームから、直接、転送することは出来ません。
そこで、さくらのIoTからAmbientへ転送する機器については、自宅などに設置したRaspberry Piを使用します。
もちろん、照度センサを搭載したIchigoJam側はRaspberry Piとは別の遠隔地へ設置することができます。
IchigoJam ――(4G網)―→ さくら ――(WebSocket)―→ Raspberry Pi ――(HTTP)―→Ambient
Raspberry Pi用のスクリプトは、以下のコマンドでダウンロードできます。
ダウンロード方法:
$ cd RaspberryPi/network/sakura
実行方法:
$ ./sakuraToAmbient.sh            (予め、トークンなどを追記してください)
最新版:
スクリプトは、以下のようになります。TOKENと、AmbientChannelId、AmbientWriteKeyの部分については、それぞれのサービスから取得して、スクリプトを書き換えてください。
#!/bin/bash
TOKEN=”xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”       # Sakura IoT トークン
AmbientChannelId=100                                # Ambient チャネルID
AmbientWriteKey=”0123456789abcdef”   &
nbsp;              # Ambient ライトキー(16桁)
DEVICE=”sakra_1″                                    # 識別名
INTERVAL=20                                         # 送信間隔(20秒以上を推奨)
while true; do
DATA=`curl –max-time $INTERVAL -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(等)へ変換
VALUE=`echo $DATA\
|tr ‘{‘ ‘\n’\
|grep “\”channel\”\:0″\
|head -1\
|tr ‘,’ ‘\n’\
|grep \”value\”\
|head -1\
|cut -c9-`
if [ -n “$VALUE” ]; then
echo ${DATE}”, “${DEVICE}”, “${VALUE}
JSON=”{\”writeKey\”:\”${AmbientWriteKey}\”,\”d1\”:\”${VALUE}\”}”
#   echo $JSON
curl -s ambidata.io/api/v2/channels/${AmbientChannelId}/data\
-X POST -H “Content-Type: application/json” -d ${JSON} # データ送信
fi
fi
done
このスクリプトをRaspberry Pi上で実行すると、変数TOKENに設定されたトークンを使って、さくらのIoTサーバから測定値を取得し、Ambientへ転送します。
転送間隔はINTERVALで設定します。初期値は20秒です。IchigoJamの測定間隔Wよりも長い時間に設定してください。
IchigoJam測定間隔 W/60 (秒) < 転送間隔 INTERVAL (秒)
準備が出来たら、Raspberry Piでスクリプトを動作させた状態で、遠隔地にIchigoJam×さくらIoTのセンサを設置して実験してみましょう。
IchigoJamからソフトバングの4G網経由で送信した照度データを、Raspberry Piで受信し、BashスクリプトでAmbientへ転送した時の様子。IoTセンサのデータを簡単にグラフ化(Ambientの特長)することができた。
このスクリプトではcurlコマンドによる簡易的な方法でWebSocketを受信しています。受信データは転送間隔毎に処理しますが、その処理のたびにWebSocketの接続を切断し、再接続する動作となっています。
Curlコマンドを使ってWebSocket接続した状態のまま受信後のread処理をする記述方法が分からなかったので、このような実装となっています。ご存知の方は、教えていただけると嬉しいです。
例えば「curl ~~ | while read DATA; do ~~ ;done」のような感じで動かせないかと考えていましたが、うまくいかないのです。

今後

現時点では、さくらのIoTプラットフォームβ用のLTEモジュールには、省電力機能が備わっていません。このため、乾電池などで長期間の駆動を行うには、IchigoJamからLTEモジュールの電源供給をFETスイッチなどで制御する必要があります。
また、LTEモジュール単独で動作可能なGPIOモードがあれば、IchigoJam不要でワイヤレスセンサを製作できるようになるかもしれません。
このあたりはLTEモジュール側のファームウェアで対応されると思うので、その様子を見ながら、次のステップに進みたいと思っています。

Raspberry Pi Zeroへ接続することも可能。 Raspberry Pi Zeroのピンへの変換には市販品(ITEAD RPI Arduino Shield Add-on)を使用した。

右上:自作したArduinoシールド用の中継基板。スイッチはI2C信号の電圧切り替え(3.3V/5V)
下:Raspberry PiとArduinoシールドの変換基板(今回の記事では使用しない)
by ボクにもわかるIchigoJam用 IchigoSoda / sakura.io
https://bokunimo.net/ichigojam/sakura.html
 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es