ボクにもわかるIchigoJam用マイコンボード

[IchigoJam メニューへ戻る]

IchigoSoda / sakura.io の接続方法

さくらのIoTを使った簡単&低コストなモバイルIoT実験


sakura.ioモジュール を IchigoJam 互換機 IchigoSoda の裏面に実装し、モバイル回線LTEへ接続したときの様子

さくらのIoTでモバイル回線LTE接続

 本ページでは、さくらのIoT sakura.ioモジュールをIchigoJamへI2C接続し、モバイル回線LTEへアクセスする方法について説明します。IchigoSoda + sakura.ioで、モバイルIoTの実験をしてみましょう。
 sakura.ioモジュール ABiT製 SCM-LTE-01 AX-919-2は、ソフトバンクのLTEモバイル回線に接続可能なIoT専用の通信モジュールです。付属のSIMカードを使って、さくらインターネット社のIoTクラウドサービスへ接続することが出来ます。LTE回線とIoTサービスの月額は60円(税別)と安価であることも特徴の一つです。毎月1万回分の通信料ポイントが月額に含まれており、これは1時間あたり13.7回、約4.4分ごとの通信に相当します。温度センサや、人感センサ、ドアセンサといった用途であれば月額だけで十分でしょう。
 (月1万回に満たなかった余剰ポイントは、3か月、有効。ポイントが不足した場合は、2万回の通信分ごとに(通信料100円を)課金。課金による清算後の余剰ポイントは、2年間、有効。)



IchigoJam 互換機 IchigoSoda の裏面に取り付けることが可能なsakura.ioモジュール。SIMカード、アンテナが付属する。

さくらのIoT sakura.ioモジュール

 このsakura.ioモジュールには、イスラエルのAltairセミコンダクタが開発したIoT用のチップセットが採用されています。現行品は LTE Category 1(Down 10Mbps/Up 5Mbps)規格のモバイルインターネット回線用ですが、将来的にはIoT専用の通信規格 3GPP Release-13で定義された NB-IoTへのアップデートも予定されています(Altairによるアップデートであり、さくらインターネット社の対応予定については不明)。モジュール基板の左上に見える半導体は、スイスSTマイクロ製のマイコン STM32L431KC(32bit ARM Cortex-M4)です。
 本モジュールの開発・製造には、国内企業もかかわっています。金属シールドで覆われたLTE通信部は太陽誘電が同社の積層部品を多用して開発したもので、またAltairのチップセットを制御するためのマイコン用のソフトウェアや、モジュール基板はABiT社が開発した日本製品です。


必要なハードウェア

 アマゾンや秋月電子通商などで販売されている IchigoSoda(SCO-ICG-02)とsakura.ioモジュールを購入し、IchigoSodaの裏面へsakura.ioモジュールを装着することで、簡単にハードウェアを準備することが出来ます。
 ほかにも、USB端子つきPS2キーボード、ビデオ入力端子付きテレビ、USB Micro用 ACアダプタDC5V出力などが必要です。


SAKURAインターネットから販売されているIchigoSoda(写真左・IchigoJam互換機)とsakura.ioモジュール(写真右)。写真=さくらインターネット株式会社(https://www.sakura.ad.jp/)のsakura.ioのウェブページ(https://sakura.io/)から使用。

  • IchigoSoda for sakura.io (アマゾンへ・アフィリエイトあり)

  • sakura.io さくらの通信モジュール LTE (アマゾンへ・アフィリエイトあり)

 sakura.ioモジュールをIchigoJam Tへ接続する方法もありますが、I2C信号の電圧レベル変換や、狭ピッチ基板間コネクタの接続方法などの手間などを考えると、IchigoSodaほど簡単ではありません。挑戦してみたい方は、ボクのブログ内の「遠隔地の照度を測るワイヤレスセンサ 」の写真「I2C信号の電圧レベル変換方法」などを参考にしてください。


IchigoJamのファームウェア

 IchigoJamのファームウェアのバージョンは、IchigoJamを起動したときに「IchigoJam BASIC 1.X.X」のように表示されます。バージョンが、1.2.2以上(もしくはベータ版の1.2β40以上)であることを確認してください。本ページでは、主にバージョン1.2.3で動作確認を行っています。
 例えば、バージョン1.2.1でI2CR命令を実行すると、sakura.ioモジュールが応答しなくなるなどの不具合が生じます。IchigoJamファームウェアのバージョンアップを行いたい場合は、jig.jpのページ(IchigoJamのファームウェア)を参照してください。なお、sakura.ioモジュールのファームウェアについては後述の「バージョン確認」以降をご覧ください。


sakura.ioモジュールを登録する

 sakura.ioモジュールが手元に届いたら、sakura.ioのコントロールパネル(コンソール)へアクセスし、sakura.ioモジュールの登録を行います。モバイル回線の契約を伴うので、クレジットカードが必要です。登録方法については、下記のウェブページを参照してください。


プロジェクトを作成し、通信モジュールの登録を行ったsakura.ioのコントロールパネルの様子。


sakura.ioのコントロールパネルより、連携サービスに「WebSocket」を追加したときの様子。プロジェクトの詳細→連携サービス→サービス追加→webSocketを選択する。

電源を入れるだけでLTE接続

 IchigoSodaとsakura.ioモジュールを接続し、電源を入れれば、自動的にLTE網へ接続されます。接続状態はIchigoSoda基板の右上にある「sakura.ioモジュール・ステータスLED」の点滅回数で確認することが出来ます。電源を入れた直後は、点滅回数が3回(準備中)ですが、しばらくすると2回(ネゴシエーション中)、1回(通信可能状態)へと遷移します。

LED点滅数状態
3回LTE準備中
2回接続試行中
1回通信可能状態

IoT.OUTコマンド

 まずは、簡単で分かりやすいIoT.OUTコマンドから説明します。ただし、現在のIchigoJam BASICのファームウェア(バージョン1.2.3)では、サポートされていないコマンドです。今後、標準でサポートされることを見越して、コマンド説明の最初にもってきました。

 IoT.OUTコマンドは、β版のバージョン1.2β57でサポートされたsakura.ioモジュール専用の命令です。バージョン1.2.3以前のIchigoJam BASICでは、次節以降のPOKE命令とI2CR/I2CW命令を使います。

 LTE通信が可能な状態になってから、以下のコマンド(黄色文字の行)をIchigoJamへ入力すると、0〜65535までの数値をLTE送信することが出来ます。

' IoT Command
IoT.OUT 1       :' 数字の1を送信
OK
IoT.OUT 65535   :' 数字の65535を送信
OK
IoT.OUT ana()   :' BTN端子の入力電圧に応じた数字(0〜1023)を送信
OK

 下図は、sakura.ioのコントロールパネル上の連携サービスに「WebSocket」を追加したときの「サービス連携の編集」画面です。IchigoSodaからLTE送信を実行すると、画面の下部に、受信結果が表示されます。IoT.OUT命令ではチャンネル1が用いられます。


sakura.ioのコントロールパネルで、[サービス追加]ボタンから「WebSocket」を連携サービスへ追加したときの様子。本画面表示中にIchigoSodaからLTE送信を実行すると、画面下部に受信結果が表示される。

 なお、次回からは、ログインしたときに表示されるプロジェクト一覧の画面上の「WebSocket」のアイコンをクリックすれば、同じ画面に遷移します。また、ログイン中は、画面上の左上のsakura.ioのアイコンをクリックすることで、プロジェクト一覧表示画面に戻ります。


LTE接続状態の確認

 LTEの接続状態をコマンドで確認するには、以下のコマンドをIchigoJamへ入力します。「0 80」と表示されればLTEに接続された状態です。実際に入力して、確認してみましょう。

' Get connection status
POKE #800,1,0,1,0,0,0,0:?I2CR(#4F,#800,3,#804,3),HEX$(PEEK(#806))
0        80
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#802   3 bytes 送信 Q=01,N=00,XOR=01
' #804 [2]〜#806   3 bytes 受信 S=01,M=01,結果
' #808 [4]〜#8CB 196 bytes 空き領域 変数[4]〜[101]
'
' 結果=80:接続,00=未接続,01=圏外,#02=ERROR,03=異常断

 応答値の最初の「0」はIchigoJamとsakura.ioモジュールとのI2Cインタフェースの通信結果です。通信に失敗すると「1」になります。その次の「80」はLTEの接続状態です。圏外や未登録状態のときは「1」、エラー時は「2」や「3」が表示されます。


アンテナレベルの確認

 アンテナレベルの確認の様子を下記に示します。0(圏外)〜5(非常に強い)までの結果が得られます。

' Get signal quality
POKE #800,2,0,2,0,0,0,0:?I2CR(#4F,#800,3,#804,3),PEEK(#806)
0        5
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#802   3 bytes 送信 Q=02,N=00,XOR=02
' #804 [2]〜#806   3 bytes 受信 S=01,M=01,レベル
' #808 [4]〜#8CB 196 bytes 空き領域 変数[4]〜[101]
'
' レベル=00:圏外,01:弱〜05:強

データ送信コマンド

 下記はデータ送信コマンドです。予め変数Aに送信したい値を代入してから、実行します。

' Tx immediately
A=12 :'送信したい値を変数Aに代入する
OK
POKE #800,#21,#A,1,#49,A,A>>8,0,0,0,0,0,0,A>>8^A^#63:?I2CW(#4F,#800,13)
0
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#80C  13 bytes 送信 Q=21,N=0A,C=1,F=49
' #80E [7]〜#8CB 190 bytes 空き領域 変数[7]〜[101]

 soracom.ioモジュールへのコマンドの末尾には、コマンド列のXOR(排他的論理和)の演算結果を付与します。これをパリティと呼び、モジュール側はパリティが合わないコマンドを拒否します。本例までのコマンドの場合は、パリティの値が既知でしたが、データを送信する場合は、送信したいデータによってパリティが変化します。
 予め変数A以外のパリティを求めておく方法や、1バイト整数の上位1バイトを削除しないでPOKEに渡す方法については、IchigoJamの開発者である福野さんの記事を参考にしました。


sakura.ioモジュール用の基本サンプル・プログラム【送信】

 LTEモジュールを使ったコマンドに慣れてきたところで、基本サンプル・プログラムを紹介します。下記は、IchigoJamのBTN端子の電圧をAD変換した値を送信するプログラムです。BTN端子の電圧が0Vのときは0を、3.3Vのときは1023を送信します。動作状態をテレビ画面に出力するようにしましたので、実際に入力して、動かしてみると理解しやすいでしょう。

new
1 cls:?"SAKURA IoT TX
2 ?"BTN デンアツ ヲ ソウシン
3 T=300:?" シュウキ =";T/60;" ビョウ
4 S=0  :?" スリープ=";S;" (1=ON)

100 ?"== ショキカ ==
110 poke #800,#21,#A,1,asc("I")
120 for I=#806 to #80B
130 poke I,0
140 next

200 ?"== Main ==
210 A=ANA():?" A=";A
220 B=A%256:?" B=";B
230 C=A>>8 :?" C=";C
240 N=12   :?" N=";N
250 poke #804,B
260 poke #805,C
270 gosub 900
280 gosub 300
290 goto 100

300 '== Cyclic Sleep ==
310 led 0:wait T,!S:led 1
320 ?"Wake!
390 return

900 'I2C
910 C=0
920 for I=0 to N-1
930 C=C^peek(#800+I)
940 next
950 poke#800+N,C
960 if i2cw(79,#800,1,#801,N) ERR
970 for I=0 to N
980 ? hex$(peek(#800+I));" ";
990 next:?:return


' メモリ・マップ(参考情報)
' #800 [0]〜#80C 13 bytes Q=21,N=0A,1,49,data,XOR ' #80E [7]〜#8CB 190 bytes 空き領域 変数[7]〜[101]

 行番号100番台は初期化部です。IchigoJamのメモリの#800番地から#80B番地に初期値を書き込みます。アドレス#803番地には、送信する数値データの型として、符号なし整数を示す「I」を書き込みました。
 行番号200番台がメイン処理部です。BTN端子の電圧のAD変換値を変数Aへ代入し、下位8ビットを変数Bへ、上位8ビットを変数Cへ代入し、それぞれ#804と#805番地へ書き込みます。
 行番号300番台は待ち時間処理部です。行番号4で定義した変数Sに1を代入した場合は、待機中にスリープモードへ移行し、テレビへの出力も止まります。
 行番号900番台はI2Cインタフェース通信によりsakura.ioへコマンドを送信する処理部です。

 なお、IchigoSodaの場合は、10kΩのプルアップ抵抗(R24)の影響を受けるので、センサによっては高めの値となってしまう場合があります。BTN端子に何も接続していない状態の場合、IchigoJam Tでは800〜900程度の値が、IchigoSodaでは1000〜1020程度の値が得られます。


データ受信コマンド

 こんどはsakura.ioの受信です。受信を行うには送信ツールが必要です。ここでは、IchigoJamの開発者である福野さんが作成したチャットツール「Message IoT」を使って実験してみます。送受信確認ツール用に少し改造(機能を削減)したコピーを、下記に公開しました。



WebSocket 確認ツール Message IoT - sakura.io の一例。全角のひらがなやカタカナを入力すると、半角カナに変換して送信することが出来る。sakura.ioが送信したデータを受信することも出来る。

 WebSocket Tokenの欄には、Tokenを入力します。Tokenは、sakura.ioコントロールパネル画面の右の方にある「WebSocket」のアイコンを選択すると「サービス連携の編集」に記載されています。しばらくすると、Logに「connected」が表示されます。表示されなかった場合は、ブラウザをリロードしてやり直してください。
 Module IDの欄には、sakura.ioコントロールパネルに登録されているsakura.ioモジュールのIDを入力してください。数字、アルファベットの大文字、小文字が混在しているので、読み間違いに注意するか、クリップボードへコピーしてからペーストしてください。
 Valueの欄に、整数値(0〜32767)を入力し、[送信]ボタンをクリックすると、sakura.ioへ数値が送信されます。

 下記は数値データ受信コマンドです。sakura.ioモジュールへ送られた数値データ(整数0〜32767)が表示されます。

' Rx dequeue
POKE #800,#30,0,#30:IF !I2CR(#4F,#800,3,#804,6) ? [4]
12345
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#802   3 bytes 送信 Q=30,N=00,XOR=30
' #804 [2]〜#809   6 bytes 受信 S=01,M=20,結果
' #80A [5]〜#8CB 194 bytes 空き領域 変数[5]〜[101]

 次は、テキスト文字の受信です。sakura.ioモジュールは、8文字までの文字列を受信することが出来ます。WebSocket 確認ツール Message IoTのMessage欄へ「Hello!」を送信してから、以下の文字列受信コマンドを実行すると、受信することが出来ます。

' Rx dequeue
POKE #800,#30,0,#30:POKE #810,0:IF !I2CR(#4F,#800,3,#804,12) && PEEK(#807) = ASC("b") ? STR$(#808)
Hello!
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#802   3 bytes 送信 Q=30,N=00,XOR=30
' #804 [2]〜#809  12 bytes 受信 S=01,M=20,結果
' #810 [8]〜#8CB 188 bytes 空き領域 変数[8]〜[101]

 上記コマンドの2つ目のPOKE文は、8文字を受信したときに文字列の最後を示す0を付与するためのものです。またアドレス#807には受信したデータの型が代入されています。「I」だと符号なし整数、「b」だと文字列です。IchigoJamの整数型は16ビットですが、sakura.ioでは32ビットまたは64ビットです。ここでは、15ビットの0〜32767までの値を使用することにし、補数の補正を省略しました。

 WebSocket以外の送信方法の一例として、sakura.ioのコントロールパネル(コンソール)やCurlコマンドでWebhook送信を行うこともできます。Webhookを利用するには、連携サービスに「Incoming Webhook」を追加します。追加したIncoming Webhookのアイコンをクリックし、「サービス連携の編集」ページ内の「APIドキュメント(sakura.io)」をクリックすると、Webhockでリクエスト送信が可能な説明画面へ移ります。Tokenは、WebSocket用とWebhook用で異なります。Incoming Webhook用に取得した通信キーとモジュールのID、payload(送信データ・channel=1、type=I、value=12345)を入力し、「Try it out!」をクリックするとリクエストが送信されます。また、Response Codeの部分に200の応答があれば、送信成功です。



sakura.ioコントロールパネル内のAPIドキュメントから、Webhook用のリクエストを送信するときの入力画面。(本図をクリックすると拡大図が表示されます。)

 ただし、sakura.ioのコントロールパネルからはテキスト文字を送信することが出来ません。パソコンやRaspberry Piなどから、Curlコマンドを使ってsakura.ioへ送信して確認してみましょう。
 以下に、テキスト送信の方法の一例を示します。テキスト文字「Hello!」の16進数表記"48656C6C6F21"を、JSON形式で渡します。XXXXの部分はTokenです。

pi@raspberrypi:~ $ curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"type":"channels","module":"あなたのモジュールのID","payload":{"channels":[{"channel":1,"type":"b","value":"48656C6C6F21"}]}}' 'https://api.sakura.io/incoming/v1/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
{"status":"ok"}
pi@raspberrypi:~ $


sakura.ioモジュール用の基本サンプル・プログラム【受信】

 下記は受信用のプログラムです。プログラムを実行した状態で、Message IoT WebSocket 送受信確認ツールから数値もしくは文字列データを送信してみてください。sakura.ioモジュールが数値や文字列データを受け取ると、IchigoJamの画面に受信結果が表示されます。複数のチャンネルを使った受信にも対応しています。

new
1 cls:?"SAKURA IoT RX
2 ?"I2C SDA ポート IN3
3 ?"I2C SCL ポート EX1/SCL
4 W=300:?"RX カンカク W=";W
5 ' CC BY Wataru Kunino

100 ' Get Rx queue length
110 ?".";:wait W
120 poke #800,#32,0,#32
130 if i2cr(#4F,#800,3,#804,4) goto 100
140 N=peek(#807)
150 if N cls

200 ' Rx dequeue
210 if N<1 goto 100
220 poke #800,#30,0,#30
230 if i2cr(#4F,#800,3,#804,12) goto 100
240 ? "Ch=";peek(#806)
250 if peek(#807) = asc("b") goto 300
260 ? peek(#808) + peek(#809)<<8
270 N=N-1
280 goto 200

300 ' Print Strings
310 for I=0 to 7
320 ? chr$(peek(#808+I));
330 next:?
340 goto 100


' メモリ・マップ(参考情報)
' #800 [0]〜#802 3 bytes 送信 Q=30,N=00,XOR=30 ' #804 [2]〜#80F 12 bytes 受信 S=01,M=20,結果 ' #810 [8]〜#8CB 188 bytes 空き領域 変数[8]〜[101]

 行番号100番台では、受信の有無を確認します。この部分を実行すると、sakura.io内の受信用メモリ(キュー)にデータが蓄積されているかどうかを確認し、変数Nに格納数を代入します。
 行番号200番台がメインとなる受信処理部です。受信用メモリ(キュー)内のデータを読み出し、テレビ画面に表示します。
 行番号300番台は、受信したデータが文字列だった時の処理です。受信した文字列を表示します。


ファームウェアバージョン確認

 sakura.ioモジュールのファームウェアバージョンを確認するためのコマンドです。V1.4.1よりも古い場合は、更新が必要です(下記は古いバージョンのsakura.ioモジュール)。

' Get firmware version
POKE #800,#A2,0,#A2:IF !I2CR(#4F,#800,3,#804,34) FOR I=1 TO PEEK(#805):? CHR$(PEEK(#805+I));:NEXT:?
v1.2.1-170425-cd8cace
OK

' メモリ・マップ(参考情報)
' 
' #800 [0]〜#802   3 bytes 送信 Q=A2,N=00,XOR=A2
' #804 [2]〜#825  34 bytes 受信 S=01,M=20,結果
' #826[19]〜#8CB 166 bytes 空き領域 変数[19]〜[101]
'
' 結果=テキスト(最大32バイト)


sakura.ioモジュールのファームウェア更新

 下記はsakura.ioモジュールのファームウェアをバージョンアップするためのプログラムです。プログラムを実行すると、アップデートの実行を開始し、アップデートが完了すると、プログラムが終了します。行番号100番台がsakura.ioモジュール用の更新コマンドです。行番号200番台は、更新が完了するまで約2秒ごとに更新状況を確認するための処理部です。ファームウェア更新中は「Status=80」を出力し続け、1分ほどで終了します。終了したら、前述の「ファームウェアバージョン確認」を行って更新されたことを確認してみましょう。高機能版はGitHub内の「https://goo.gl/H1Q5sD」に公開しています。

new
100 'Firmware update
110 poke #800,#A8,#04,#53,#6B,#72,#61,0:N=6:gosub 900
120 poke #800,#A9,#00:N=2:gosub 900
130 if ver()<12240 end

200 'Status
210 poke #800,#AA,0,#AA,0,0,0:wait 60
220 if i2cr(#4F,#800,3,#804,3) goto 200
230 I=peek(#806):?"Status=";hex$(i)
240 if I>=128 goto 200
250 if I>1 ?"ERROR
260 end

900 'I2C
910 C=0
920 for I=0 to N-1
930 C=C^peek(#800+I)
940 next
950 poke#800+N,C
960 if i2cw(79,#800,1,#801,N) ERR
970 for I=0 to N
980 ? hex$(peek(#800+I));" ";
990 next:?:return

POKE #800,#A2,0,#A2:IF !I2CR(#4F,#800,3,#804,34) FOR I=1 TO PEEK(#805):? CHR$(PEEK(#805+I));:NEXT:?
v1.4.1-01-180621-c7b6a8a
OK


' メモリ・マップ(参考情報)
' #800 [0]〜#806 7 bytes Q=A8,N=4,53,6B,72,61,XOR ' 3 bytes 更新 Q=A9,N=00,XOR ' 3 bytes 状態 Q=AA,N=00,XOR ' #804 [2]〜#806 3 bytes 受信 S=01,M=01,状態 ' #808 [4]〜#8CB 196 bytes 空き領域 変数[4]〜[101]



sakura.io を IchigoJam 用 マイコンボード(IF ICH-KIT)へ接続したときの様子

関連投稿記事


掲載情報について

  • こどもパソコン IchigoJamを用いた電子工作、プログラム等を紹介しています。
  • IchigoJamは株式会社jig.jpの登録商標です。当ページはjig.jp社の作成物ではありません。(本サイトでは jig.jp の商品やソフトの呼称として使用しています。)
  • 出典を明記した情報については前項に関わらず出典元の権利を継承します。
  • 作成にあたりFacebookグループIchigoJam-FANの情報を参照しました。
  • 当ウェブサイトの内容や情報については、ご自身の責任でご利用ください。
    製作品などで事故が発生した場合であっても当方は一切の補償をいたしません。

IchigoJam メインメニューへ戻るページ先頭へ