カテゴリー
IchigoJam

超簡単BASICでクラウド連携する乾電池駆動のIoTセンサ

前回、IchigoJamを使ったIoTセンサをクラウドサービスAmbientへ送信する方法について説明しましたが、電源にはUSBアダプタを使用していました。
今回は、電源に単3アルカリ電池を使用して長期間の駆動が可能なIoTセンサを作成したので紹介します。

単3アルカリ電池で長時間の駆動が可能な IchigoJam + MixJuiceによるIoTセンサの製作例。IchigoJamとMixJuiceのスリープ機能を使用して実用的なIoTセンサの実験を行った。

IoTセンサ用クラウドサービスAmibient

センサ情報をクラウドへ送信したときの様子を下図に示します。

IoTセンサのセンサ値をグラフ化して表示するクラウドサービスAmbient。ユーザ登録を行い、チャンネルを作成すると、①チャネルID、②リードキー、③ライトキーが発行される。このうちの①チャネルIDと③ライトキーをプログラムに組み込んで、Ambientへのデータ送信を行う。https://ambidata.io/

乾電池駆動を実現するための工夫

単3アルカリ乾電池で長期間の駆動を実現するには、MixJuiceやIchigoJamの消費電力を下げなければなりませんが、既製品の動作時の電力を抑えるのは難しいでしょう。
そこで、動作時間をなるべく短くし、何もしていない時間を増やすことで平均の消費電力を抑えます。MixJuiceとIchigoJamが動作しているときの消費電力は90mAほどあり、乾電池では丸一日くらいしか持ちません。一方、待機中は1mAほどまで下がります。この100倍近くの違いを活用します。
例えば60分に一度だけ送信し、残り時間は待機するような動作を行えば、何か月も動かし続けることができるようになるでしょう。
今回の実験では、このような乾電池駆動を実現するためのポイントについて説明します。実際に何か月も動かすにはMixJuiceの電源回路を改造したり、スリープ時間をより長くするような改造が必要です。

必要なもの

  • IchigoJam U または IchigoJam T (http://ichigojam.net/)
  • MixJuice (http://mixjuice.shizentai.jp/)
  • 超ミニ・ブレッドボード
  • 照度センサ NJL7502L
  • 抵抗器 10kΩ
  • ジャンパ線 橙2本、黄1本、青1本
  • 電池ボックス・ジャンパワイヤ

MixJuiceのファームウェア Ver 1.2

MixJuiceについては執筆時点で最新のファームウェアが必要です。必要に応じて、前回の記事などを参照して、ファームウェアをバージョンアップしてください。
バージョンを確認するには、IchigoJamから以下のコマンドを入力します。

?"MJ VER

ファームウェアのバージョンアップ方法については、下記のサイトを参考にしてください。
IchigoJam + MixJuiceで製作するIoTセンサ
/MixJuice用ファームウェアのバージョンアップ
なお、IchigoJam側のファームウェアについては、Version 1.2.1で動作確認しています。

ハードウェアの製作

照度センサNJL7502LをIchigoJamへ接続します。MixJuiceの基板上にもIchigoJamのCN3とCN4(MixJuice上はCN3とCN2)が出ているので、写真のように実装すると良いでしょう。
なお、MixJuiceのスリープ機能を使用するにはCN4の2番ピンと6番ピンを接続する必要があります。

照度センサNJL7502LのコレクタをIchigoJamのVcc(3.3V)へ、エミッタ側をIchigoJamのIN2端子へ接続する。IN2端子側には10kΩ~100kΩ程度の抵抗器を接続し、抵抗器の反対側をGNDへ接続する。さらにMixJuiceのCN4の2番ピンと4番ピンに黄色のジャンパを接続する。電源には単3電池3本を使用し、CN5へ接続する。

もちろん、CQ出版社「IchigoJam用コンピュータ電子工作学習キット(IF ICH-KIT)」で製作したPersonal Computer基板や Micro Computer基板でも動作します(ただし、CN9の5VをMixJuiceのCN5の一番奥のピンへ接続する必要がある)。

IchigoJam BASIC用サンプルプログラム

IchigoJam用のサンプルプログラムを以下に示します。
new
1 cls:?"Ambient":uart1
2 'MJ PCT application/json
3 'MJ POST START ambidata.io/api/v2/channels/ここにチャネルIDを書く/data
4 '{"writeKey":"ここにライトキーを書く","d1":"#"}
5 'MJ POST END
6 ?"アナログ ニュウリョク A=IN2
7 W=3000:?"ソクテイ カンカク W=";W
8 ' CC BY Wataru Kunino
rem https://bokunimo.net/ichigojam/
100 'MAIN
110 P=#C1A
120 A=ana(2):?"ana(2)=";A
130 gosub600:gosub600:gosub600:gosub600
200 'SLEEP
210 ?"MJ SLEEP ";W/60:wait30
220 ifinkey()goto220
230 led0:waitW+360,0:led1
240 ifinkey()goto240
250 ?"MJ APS":wait30
260 ifinkey()<>asc("1")goto250
270 goto100
600 'TX
610 ifpeek(P)<>asc("'")letP,P+1:goto610
620 P=P+1:ifpeek(P)=asc("#")?A;:goto620
630 ifpeek(P)<>0?chr$(peek(P));:goto620
640 ?:return
行番号2~5には、MixJuiceへ送信するコマンドが記述されています。行番号3にAmbientから発行されたチャネルIDを、行番号4にライトキーを書いてください。
実行すると、約1分おきにIN2端子に接続した照度センサの値をAmbientへ送信します。行番号7のWの値を600くらいにしてスリープ時間を10秒くらいにして実験してみると分かりやすいでしょう。
以下は、サンプルプログラムの解説です。
本プログラ
ムを応用したい場合は行番号100~150を確認してください。行番号110では、行番号2に書かれたコマンドの位置を示すための変数Pを定義しています。行番号1の命令(起動時の表示)を短くした場合は、この数値も減らす必要があります。MixJuiceへコマンドを送るにつれて、変数Pの値が増大します。Amibientへの送信が終わり、次の送信を行う前に初期値へ戻します。
行番号110:プログラム内に書かれたMixJuice用コマンドの位置情報です。
行番号120:IN2のアナログ値を入力するコマンドです。
行番号130:MixJuice用コマンドを実行するためのgosub命令です。
行番号210:MixJuiceをスリープモードに移行します。
行番号220:キーバッファをクリアします(wait命令が適切に動かすため)。
行番号230:IchigoJamをスリープします(MixJuiceよりも6秒だけ長く)。
行番号240:キーバッファをクリアします。
行番号250:MixJuiceが動作状態かどうかを確認します。
行番号260:動作状態でなければ行番号250に戻ります。
行番号270:行番号100に戻って繰り返し処理を行います。

より長く持続させるために (追記 2016/12/4)

より電池寿命を延ばすには、低消費電力のレギュレータへ交換します。レギュレータによってはスタンバイ電流が0.1mA以下のものもあり、待機電力を大幅に削減することができます。
また、よりスリープ時間を長くします。例えば20分に1回とか、60分に1回などにします。wait命令は最大9分までしか指定できないですが、動作が機敏なので下記のようにwaitを複数回に分けて実行します。行番号7の変数Wには測定間隔を「分」の単位で入力してください。行番号8で「秒」に変換して使用します。
実験の様子は下記で公開しています(2016/12/4から開始)。
長期間駆動の公開実験(単4アルカリ乾電池を使用):
修正したプログラム(赤文字部分):
new
1 cls:?"Ambient":uart1
2 'MJ PCT application/json
3 'MJ POST START ambidata.io/api/v2/channels/ここにチャネルIDを書く/data
4 '{"writeKey":"ここにライトキーを書く","d1":"#"}
5 'MJ POST END
6 ?"アナログ ニュウリョク A=IN2
7 W=20:?"ソクテイ カンカク W=";W;" min."
8 V=W*60/63*60:video0
9 ' CC BY Wataru Kunino
rem https://bokunimo.net/ichigojam/
100 'MAIN
110 P=#C1A
120 A=0:forI=1to10:A=A+ana(2):next:?"ana(2)=";A
130 gosub600:gosub600:gosub600:gosub600
200 'MJ SLP
210 ifinkey()goto210
220 ?"MJ SLEEP ";W*60:wait30:I=0
230 ifinkey()goto230
240 ?"MJ VER":wait30
250 ifinkey()=asc("'")goto200

300 '15 SLP
310 ifinkey()goto310
320 led0:wait57,0:led1:I=I+1
330 ifI<Vgoto310
340 ifinkey()goto340
350 ?"MJ APS":wait33
360 ifinkey()<>asc("1")goto300
370 goto100
600 'TX
610 ifpeek(P)<>asc("'")letP,P+1:goto610
620 P=P+1:ifpeek(P)=asc("#")?A;:goto620
630 ifpeek(P)<>0?chr$(peek(P));:goto620
640 ?:return
主な修正部の解説:
行番号7:測定間隔を「分」の単位で入力するように修正(1分から60分)まで設定可能。
行番号8:IchigoJamのスリープ時間Vを設定。MixJuiceよりも5%だけ短くする。TV出力OFF。
行番号120:IN2端子から10回入力。変数Aは、その合計値。
行番号220:MixJuiceをスリープに移行する。変数Iを0にセットする。
行番号300:ここからがIchigoJamのスリープ処理。
行番号320:約1秒間だけスリープを実行する。変数Iに1を加算する。
行番号330:スリープ時間がV(秒)以上になるまで行番号310に戻る。
行番号350:ネットワークに接続されているかどうかを確認する。
照度センサ部を電池電圧の検出回路に変更:
[電池(+)]━━━━[82kΩ]━━●━━[可変抵抗47k]━━━━[GND/電池(-)]
                    ┃
                    ┗━━[ESPモジュールTOUTへ]
公開実験用に製作した回路。容量が単3電池の約半分となる単4電池を使用した。IchigoJamとMixJuiceには純正品を使用した。また、照度センサの代わりに電池電圧を測定するための可変抵抗器に変更。レギュレータのスタンバイ電流が大きいので、長くても1か月程度で実験が完了する見込み。この実験の結果によっては、BTN信号による割り込み起動で動作させるように変更する予定。最終的には単3で3か月は動かしたい。
関連情報
IchigoJam用コンピュータ電子工作学習キット(IF ICH-KIT)
https://bokunimo.net/ichigojam/pcb.html
by ボクにもわかるIchigoJam用マイコンボード
https://bokunimo.net/ichigojam/