ウォッチドックタイマーによるスリープモードの復帰のやり方
前回は外部からのトリガー「ボタンを押す」によってスリープモードへの移行や復帰を行いました。
しかし、実際に運用していく際は、一定時間の間隔おきにArduinoを起動させることの方が多いと思います。
本ブログでも製作している「自動水やり機」でも一定時間おきに土の状態を読んで必要に応じて水やりを行うプログラムが理想的です。
今回はウォッチドックタイマー(WDT)を使って、一定時間おきに
「起動」→「スリープ」→「起動」→「スリープ」
を繰り返すプログラムを考えていきたいと思います。
- ウォッチドックタイマーとは
- 作成するプログラムの流れ
- プログラム作成
- 消費電力
ウォッチドックタイマーとは
プログラムが問題なく作動しているかを見張る番犬のような機能です。外部回路で動いているタイマーのカウントがあふれる前にタイマーのクリアを行わないとマイコンのリセットが行われる仕組みです。
作成するプログラムの流れ
今回作成するプログラムの流れは下の写真の通りです。
プログラム作成
1 2 |
#include <avr/sleep.h> #include <avr/wdt.h> |
スリープモードを使用するためのライブラリ「avr/sleep.h」に加え、今回はウォッチドックタイマーを使用するためのライブラリ「avr/wdt.h」も読み込んでいきます。
1 2 3 4 5 |
void setup() { pinMode(7, OUTPUT); set_sleep_mode(SLEEP_MODE_PWR_DOWN); wdt_enable(WDTO_8S); } |
起動時にLEDを点灯させるためのピンの設定に加え、スリープモードの設定もここで行っています。今回はパワーダウンモードを使っていきます。
また、ウォッチドックタイマーの設定もここで行います。wdt_enable(WDTO_●●)の赤字の部分を変更することでウォッチドックタイマーによるリセットまでの間隔を指定します。指定できる間隔は10通りです。
設定時間 | コード |
0.015秒 | WDTO_15MS |
0.03秒 | WDTO_30MS |
0.06秒 | WDTO_60MS |
0.12秒 | WDTO_120MS |
0.25秒 | WDTO_250MS |
0.5秒 | WDTO_500MS |
1秒 | WDTO_1S |
2秒 | WDTO_2S |
4秒 | WDTO_4S |
8秒 | WDTO_8S |
1 2 3 4 5 6 |
void loop() { digitalWrite(7, HIGH); delay(1000); digitalWrite(7, LOW); sleep_mode(); } |
7ピンを「HIGH」にすることでLEDを点灯させます。1秒間点灯させた後に7ピンを「LOW」にしてLEDを消灯させ、その後にスリープモードにします。
プログラム上はそのままスリープモードが継続いたしますが、8秒経過した時点でマイコン自体がリセットされるため、再度プログラム最初から処理が始まります。
下記にすべてをまとめとプログラムを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <avr/sleep.h> #include <avr/wdt.h> void setup() { pinMode(7, OUTPUT); set_sleep_mode(SLEEP_MODE_PWR_DOWN); wdt_enable(WDTO_8S); } void loop() { digitalWrite(7, HIGH); delay(1000); digitalWrite(7, LOW); sleep_mode(); } |
消費電力
スリープモードの有無で消費電力を確認してみました。結果としてはLED点灯時の消費電力に差はありませんでしたが、LED消灯時はスリープモード有の方が3割ほど消費電力が低い結果となりました。スリープモードはきちんと動作しているようです。
スリープモード | |||
無のプログラム | 有のプログラム | ||
LED点灯時 | LED消灯時 | LED点灯時 | LED消灯時 |
5V 42mA | 5V 30mA | 5V 42mA | 5V 20mA |