RAVPowerを電源にしたときに苦労したこと
意外にプログラムの改修まで必要だったのがこの電源の仕様。
一度開錠した後30秒ほど経過したら自動的に電力供給を停止してしまうというもの。
もちろん、モバイルバッテリーじゃなければボタン電池や単4電池などを利用したらよいわけで、この問題は発生しないが、その代わりになるべく電力消費を抑えるような工夫が必要になってくる。それはArduinoのSleepモードを利用するということで、Watchdogの仕組み、Wakeup用のシグナルをどのpinから取得するのか、物理ボタンなのか、RFIDからなのか(さすがに低電力からRFID信号もらうのは無理かも…)なんていう悩みが発生するので見送った。
モバイルバッテリーに電力消費を抑える仕組みがあるのなら、それに合わせてシステムを組んでいくほうが良いなと考えて下記のようなプログラムにした。
pulse_count = pulse_count + 1; //Serial.println(servodegree_pulse); // 一定時間でサーボモータに電力消費を促す(0.2s * 20 = 4秒) if ( ! rfid.PICC_IsNewCardPresent() || ! rfid.PICC_ReadCardSerial()){ delay(200); if ( pulse_count > 20 && close_flag == false){ servodegree_pulse = 75; myservo.write(servodegree_pulse); pulse_count = 0; delay(500); } else { myservo.write(servodegree); delay(500); } return; |
(
具体的には、開錠をしたときに10分~30分、SG90のモーターを4秒おきに小刻みに動かし、電力消費するようにした。
また、バッテリーが減ってくると施錠した状態でArduinoしか動いていない電力消費でも一定の消費となって自動での電力供給停止が働くなくなり、そのままバッテリーが枯渇するまで動き続けるという逆の問題も発生した。それについては30秒ほどでSleepモードに移行してより消費を少なくすることで解決した。
delay(200)の部分で0.2秒待ち、20回たまったら(開錠している条件も確認して)servodegree_pluseを75度に変更する。
そのあとでdelay(500)を入れているのは、モーターが動く時間を作ってあげないと動く前に元の角度に戻せっていう信号を送る処理に切り替わり
ピクリとも動かなかったから。
どうも、RAVPowerの電源消費を検知して動いたり止まったりするシステムは、現在の電力容量の一定割合を消費しているかどうかで
判断するらしく、電力容量が減ってきたらArduinoが何も動作せずにループしているだけという状況でも電力を供給し続けてしまった。
そうなると、一定の電力残量以降は一気に消費しつくすので充電間隔が想定よりも短くなることが懸念された。
消費電力が少なくなってきたときには施錠後のアイドル時間を検出してスリープモードに移行するようなスケッチを書いた。
// 開いて一定時間で自動施錠 checktime = millis(); if (unlocktime != 0 && unlocktime < checktime ){ //Serial.println(unlocktime); //Serial.println(checktime); servodegree = 180; myservo.write(servodegree); // deglee 180 is lock close_flag = true; // 閉めたら1 sleeptime = unlocktime + 60000; } // 自動施錠した後に一定時間でスリープする if (sleeptime != 0 && sleeptime < checktime ){ //Serial.println(checktime); //delay(3000); ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約) set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード sleep_enable(); sleep_mode(); // ここでスリープに入る } |
開くっていう処理(RFIDが検出されたとき)にunlocktimeをあらかじめ設定。変数の値にもよるけれど30分後。
施錠したところで、スリープに移行する時間sleeptimeをあらかじめ設定。
sleeptimeを経過したことを検知したらパワーダウンモードに。
ここで、スリープの例だとwake upをwatch dogなどで一定間隔にて起動したり、物理スイッチのONなどを検知して
スリープモードの解除をスケッチ上に実装していたが、RAVPowerの物理スイッチ1つだけでも老人には負担だったので
物理スイッチでのスリープ解除はせず、電源が切れるところまでもっていくような処理にした。
電源が落ちれば、「RAVPowerのボタンを押して起動、RFIDカードで開錠」という通常操作に戻るので。