今回は電子工作の疑似電波時計制作の続きです。年内にはだいたいの所を完成させたいと考えていましたがちょっと遅れ気味です。まだ、年賀状も書いてないし、大掃除もあるしということで、年末の休みは電子工作に使える時間もあまりなさそうなのでちょっとあきらめの心境になってきました。本当は春節になる前に回路とソフトを完成させて基板発注をしたいと思っていたのですが、それも厳しくなりそうな気配です。でも、中途半端に未完成の状態で見切りで基板を発注してもそのまま動かなかったら無駄になるだけなので、きっちり動くことが確認できてからにしようと思っています。そうすると、基板完成が春節明けになってしまい、完成は春頃という感じでしょうか。まあ、のんびりやっていくことにします。
さて、前回は、時刻サーバーから送られてくるデータを、TWILITE STICKで受け取るということをやりました。
alasixosaka.hatenablog.com
しかし、loop関数内に、ウェイトループを置いてしまうと受信がうまくできないことが判明し、ウェイトループによる時間待ちを諦めることになりました。
TWILITEのHPの資料によると、loop関数はその中に居続けるわけでなく、処理が終わるとDOZEモードに入って、割り込み待ちをするとのことでした。DOZEモードの消費電流は資料によるとCPUクロックが最速の32MHzの時でも2mAということで、まあこれくらいなら丸一日くらい待機していても乾電池駆動で行けそうな気がします。そこで、今回は実際にどのくらいの消費電流なのかを調べてみました。
消費電流の測定は、以前購入したμアンペアオシロを使いました。
alasixosaka.hatenablog.com
測定するにあたって、STICKでは余分な回路がついている上に、LEDもあるので、ほぼ同じプログラムをDIPに書き込んで測定してみました。ほぼ同じというのは、STICK用のライブラリをインクルードしないということが違いです。冒頭のインクルードをコメントアウトします。
//#include <MONOSTICK>
また、Setupの中のLEDの設定もコメントアウトします。
//brd.set_led_red(LED_TIMER::ON_RX, 200); // RED (on receiving) //brd.set_led_yellow(LED_TIMER::BLINK, 500); // YELLOW (blinking)
これで測定してみました。
DOZEモードに入らない
まず、時刻サーバーを起動しない状態、つまり、永久に受信待ちになる状態で測定しました。そうすると、だいたい17mA程度消費したままの状態が続きます。ちょっと話が違うぞと思いながら、時刻サーバーを起動すると、スリープに入って電流値がほぼ0になりました。そしてスリープから目覚めると電流値が跳ね上がります。電流値の差が大きいのでグラフではわかり難いのでログのデータを載せておきます。
"7826","-65.5174" "7827","-65.6128" "7828","719.8335" "7829","6745.9114" "7830","15136.2437" "7831","17390.8254" "7832","17293.5506" "7833","17345.3352" "7834","17409.3267" "7835","17421.4384" "7836","17425.1577"
数字の左が、測定開始からの時間、右が電流値です。スリープ中は値がマイナスになっています。単位はμAです。マイナスはあり得ないのですが、それくらい少ないということでしょう。そして、スリープから復帰して、電流値が17mAくらいになります。この状態で受信待ちをし、シグナルを受信したら電流値が20mAくらいまで上がって、またスリープに入るので電流値がマイナスになります。
"7919","17639.9252" "7920","11461.7361" "7921","20074.0838" "7922","20089.4380" "7923","20243.7425" "7924","15929.4147" "7925","15913.1069" "7926","20079.2337" "7927","20139.9827" "7928","20246.2220" "7929","17893.1258" "7930","0.8583" "7931","-61.7981"
電流値が一時的に増えるのは、シリアル通信をするからなのか、無線を受信するからなのかのどちらか(あるいは両方)だと思われます。
いずれにせよ、このプログラムではどうやらDOZEモードには入っていないらしいということがわかりました。DOZEモードに明示的に入れるコマンドがあるのかと思い探してみましたが、C/C++用のコマンドは見つけられたのですが、今回はプログラムしやすいMWXライブラリを使っていて、こちらでは見つけられませんでした。loop関数に何も処理が書いてないのが悪いのかと思って、何か処理を書いてみましたが、結果は同じで、DOZEモードに入る気配はありませんでした。
ということで、単なる待機状態で大量に電流を消費してしまいますので、このままではちょっとまずいことになりました。もちろん、トランジスタスイッチなどを使ってPIC側から強制的にTWELITEの電源を切ってしまうという手段もあるのですが、せっかくプログラムができて、スリープに入れることができるのに、なんかなあ、という感じで気が進みません。
PICとシリアル通信してスリープに入れる
そこで、どうせTWELITEからPICへは時刻データをシリアル通信で送るのだから、PIC側で時間を管理して、一定時間たっても時刻データが送られてこなかった場合は受信失敗とみて、PICからTWELITEにスリープするように命令を出すということを考えました。
まあ、うまくいくかどうかわからないですが、とりあえずやってみることにします。
その結果はまた次回。