topmenu

トップコンピュータカメラ雑記プロフィールこのページについて

2018/12/03

Adafruit のライブラリ SleepyDog を見る

このライブラリは、Arduino などで Watch Dog Timer(WDT) と Sleep を利用するためのライブラリである(https://github.com/adafruit/Adafruit_SleepyDog)。

ウォッチドッグタイマ(Watch Dog Timer; WDT)とは

WDT はハードウェアのタイマの一種であり、主にシステムの監視に使われるタイマのことである。Watch dog は、日本語では「番犬」や「監視役」を意味する。


スリープ(Sleep)とは

スリープとは、省電力の待機電源モードのことである。通常の起動状態と比べると電力を節約できる。

ここでは、 Arduino Nano (ATmega328P) に焦点を当てる。
Sleep モードは数種類存在するが、このライブラリでは、Power-down(SLEEP_MODE_PWR_DOWN) に移行する。

その他のモードは、ハードウェアマニュアルに記載されている。
Table 14-1. Active Clock Domains and Wake-up Sources in the Diddedrent Sleep Modes.

Power-down では、INT, PCINT のような IO割り込み、WDT しか動作しなくなる(クロック供給が止まると思われる)。周辺機器などへのクロック供給が止まることで、回路が動作しなくなり、消費電力が少なくなるメリットがある。(デメリットは当然、使える周辺機器が減ることである。)

なお、計測機器として利用するときには、ADC Noise Reduction Mode が存在するので、
このモードに移行させれば、クロック由来のノイズが減少し、より精度良く計測できると思われる。
 
特に長時間動作が要求される組込み機器として、どちらも重要な要素である。


対応するハードウェア

このライブラリは以下のようなハードウェアに対応している(2018.12 現在)。
・Arduino Uno or other ATmega328P-based boards.
・Arduino Mega or other ATmega2560- or 1280-based boards.
・Arduino Zero, Adafruit Feather M0 (ATSAMD21).
・Arduino Leonardo or other 32u4-based boards (e.g. Adafruit Feather)
・Partial support for Teensy 3.X and LC (watchdog, no sleep).

Arduino(Uno, Mega, Zero, Leonardo), Adaftuiy Feather M0, 32u4 搭載ボード, Adafruit Featherに対応。
 また、Teensy 3.X(MK20DX128, MK20DX256, MK64FX512, MK66FX1M0), LC(MKL26Z64)も部分的(Watchdog) に対応。


ライブラリ SleepyDog の使い方

(このライブラリでの)ウォッチドッグタイマの基本的な使い方は、以下のように2つある。

  1. 任意の時間をセットしておいて、その時間になったら自動的に CPU がリセットされる。任意の時間になる前にタイマをリセットすることで、プログラムが正常に動作しているかを監視する。
  2. Sleep したい任意の時間にセットすると、Power-down モードに移行する。任意の時間になると Sleep が解除されて起床する。起床したあとは、通常通り動作する。
 
このライブラリを使うには、

#include <Adafruit_SleepyDog.h>
が必要となる。

1.の場合

任意の時間(ここでは 4000ms)を設定するとともに、WDT を有効化する。
int countdownMS = Watchdog.enable(4000);

注:戻り値は、実際に設定された時間が返ってくる。そもそも DWT は、他のタイマと比べ、その用途からタイマとしての分解能がない。
そのため、引数で与えた任意の時間では設定できない場合もあり、その与えられた時間に近い値が選ばれる。その値を戻り値として返すようになっている。
(設定可能な時間: 8000ms, 4000ms, 2000ms, 1000ms, 500ms, 250ms, 120ms, 60ms, 30ms, 15ms)

WDT をリセットするには、以下を呼び出す。
Watchdog.reset();

もし 4 秒(4000 ms)間、この関数が呼び出されなければ、CPU がリセットされる。

WDT を止める場合は、以下を呼び出す。
Watchdog.disable();


2.の場合

Sleep したい時間を設定し、Sleep に移行させるには以下を呼び出す。

int sleepMS = Watchdog.sleep(4000);

次のように時間を設定しないで、以下のように実行させた場合、8s(WDTの設定可能な最大時間)となる。
int sleepMS = Watchdog.sleep();

注:SleepMS は、 1.の場合にある(注)と同じ理由で、実際に設定された値となる。

設定された時間が経過することで、スリープモードから起床した後は、次の行から実行される。


Arduino IDE を使う場合

ライブラリのインストール方法
ツールバーから Sketch -> Include Library とたどり、 Manage Libraries をクリックして「Adafruit SleepyDog」と検索する。

Arduino IDE でライブラリをインストールした場合、以下のディレクトリに保存される。
C:\Users\(ユーザ名)\Documents\Arduino\libraries\Adafruit_SleepyDog_Library

1.のサンプルプログラム examples\BasicUsage\BasicUsage.ino
2.のサンプルプログラム examples\Sleep\Sleep.ino