Arduino Pro Miniを電池2本で動作させるための省電力トライ
WDTの発信はRCのため、正確な時間測定は出来ないが、設定は以下の通り。
WDP3 |
WDP2 |
WDP1 |
WDP0 |
Time Out時間 |
疑問 |
|
0 |
0 |
0 |
0 |
0 |
16msec |
|
1 |
0 |
0 |
0 |
1 |
32msec |
|
2 |
0 |
0 |
1 |
0 |
64msec |
|
3 |
0 |
0 |
1 |
1 |
128msec |
|
4 |
0 |
1 |
0 |
0 |
250msec |
256msec? |
5 |
0 |
1 |
0 |
1 |
500msec |
512msec? |
6 |
0 |
1 |
1 |
0 |
1.0sec |
1024msec? |
7 |
0 |
1 |
1 |
1 |
2.0sec |
2048msec? |
8 |
1 |
0 |
0 |
0 |
4.0sec |
4096msec? |
9 |
1 |
0 |
0 |
1 |
8.0sec |
8192msec? |
これ以降は未定義?
Arduino本家の記事から、いくつか参照。
Sleepからの復帰
-
PINからのイベント割り込み(PIN2, PIN3)
- どちらのピンからの割り込みが入ったかで処理を変える事も可能。
-
USART(シリアルポート)からの復帰
- これを使うには、POWER_MODE_IDLEでなくてはいけない。このモードは、USARTの電源が切られないため。これ以外のモードではだめ。当然、Sleep時の消費電力は他のモードに比べ下がらない。
-
WDTからの割り込み
avr/power.hに定義されている、各種の電源制御関連関数のいろいろ。(使用例)
Disable系 |
Enable系 |
power_adc_disable() |
|
power_spi_disable() |
|
power_timer0_disable() |
|
power_timer1_disable() |
|
power_timer2_disable() |
|
power_twi_disable() |
|
=====================================================================
DeepSleep01
普通にライブラリを使って、Deep Sleepへ入る。
Power LEDやLDOも付いたままで、Sleep時、約 1.1mA。復帰時約5mA
電源は、単三アルカリ2本直列。約3V ~ 2.9V
WDTのタイマーがRC発振のため、電源電圧に振られるのか、設定時間より長い。
空きピンの処理は、すべてPullup付のINPUTにして設定した。ネットの記事によると、この方が消費電力が少なるという説明もあるが、この時点で、InputをOutputに変えてみても、目立つ変化はなかった。 もっと微妙な差分なのだろう。
FTDIでシリアル通信出力を出してみたが、モニターに何も出てこない。なぜだろう?とりあえず、コメントアウトしておく。・・・あっ、シリアルの初期化をしていなかった。それが原因かな。あと、関係する周辺回路を、Wakeup後にちゃんと、電源ONしておかないといけないはず。
割り込みの中で、変数を使うためには、Volatile宣言が必要。
AtMega328Pの内部の動作の電源を切って消費電力を抑える関数を使ってみた。ADCも当然OFFされる。ただ、Delay関数がTimer0を使っているため、Timer0だけは、電源を入れておかないと、Delayが動作しない。
★コード (DeepSleep01)
DeepSleep02
ライブラリを使わず、Assembly言語で少し書く。
(参考:ArduinoとSleep – TetsuakiBaba.jp)
Power LEDを外してみた(1kΩの抵抗だけを外した)。LDOはそのまま。
BOD(Brown Out Detect)回路の設定が効いているのかな?
WDTも完全に切って、単純にDeep Sleepに落ちるだけ。復帰しないコード。
空きピンは、この例では、OUTPUTにしてみたが、それほど変化を感じない。
この状態で、33uAまで落ちた。
電源は同じく、アルカリ単三電池2本(ちょっと古め)
Net情報では、数uA程度まで落ちているらしいが、Arduino Pro Mini環境としては、多分最小なのではと思う。(あと、LDOを外すと、どのくらい減るのかは楽しみだが)。
電流の測定が、適当なテスターの uAレンジなのだが、mAレンジだと起動するのに、uAレンジだと電池で起動しない事がある。テスターの内部電圧ドロップで、ATMEGAへの電圧不足か。(既に、だいぶ使った単三アルカリ電池2本直結なので)
★コード (DeepSleep02)
=====================================================================
DeepSleep03
02と同様に、アセンブラを一部使ってSleepに入り、WDTで復帰する。
なぜか、使っているうちに徐々に電流消費量が増えてきている気がする。
最初は 48uA程度でSleep出来ていたと思うのだが、使っているうちに、約90uA程度要するようになってきている。02に比べ、WDTを走らせているので消費電力はおおくなると思うが、現時点(2018/03/06 )で、当初出ていた 48uAでSleepすることは出来なくなっている。何か、コード上の間違いをしているのかもしれないが、何度見ても、おかしくない気がする。
オリジナルのネット上のコードとの違いは、割り込み中の処理を最小限にしたことと、WDTやBODの設定を、毎回Sleep時に行わず、初期設定だけで行っている事。 これをもう一度、戻したときに、消費電力がどうなるのか、確かめる必要はあると思われる。
LED Blinkの関数をちょっと変えた。
★コード (DeepSleep03)
============================================================
LDOを外してみる。(使っていないLDOを外してどれだけ減るのか?)
まだ、試していない・・・。
電流と電圧を正確に測定するために工夫が必要。
INA226を使った電圧・電流計を製作し、出力をProcessingを使ってプロットした。たとえば、こんな感じで出力できる。(製作記事)
ちなみに、この測定は、2msec割り込みで500サンプルとった場合(ひとメモリ:50sample, 100msec, グラフ全体で1秒。LEDをチカチカさせたもの。50msecのONと50msecのOFFを4回繰り返す例)
LED点灯時は7.5mA、LED消灯時は3.7A程度、DeepSleep時は測定ノイズ程度と分かる。Deep Sleep時の正しい電流を測定するには、今のINA226のシャント抵抗値では無理(25mOhmで、分解能は 0.1mA)。