2011年3月20日日曜日

Arduinoとリアルタイムクロック -1: 定周期タイマー割り込み & スリープ



秋月電子のRTC8564モジュール


< Arduino と RTC8564 >

畑にセットしていた定点観測データロガーHoneypot
一週間後にSDカード内のデータをチェックしてみると、タイムスタンプ情報が大幅に狂っていた。
チェックしてみた時刻と14時間近くのずれがある。
どうも気温によってArduinoのクロック振動数がかなり変動してしまうらしい。
1日1分程度のずれが生じるらしく、定期的に正確な時刻カウントを継続させるという用途には向いていない。
正確な計測時刻を継続させるにはハードウェア的に無理がある。

RTC(リアルタイムクロック)は、そのような問題を解決してくれる。
Arduinoとは別系統の正確なクロックモジュールを使用するので、時間系の処理はすべて一任できる。
今回調べてみるまでRTCのバックアップ回路の存在を知らなかったので、観測用シールドに組み込むべくいろいろと調査してみた。
以下の回路では、電源をOFFにしても5.5V 1Fの電気二重層コンデンサに溜められた電力によってRTCはカウントを持続できる。
外部EEPROMにタイムスタンプを記録して無理矢理時刻情報を繋げたり、SDカードと電池交換時のタイムラグが発生したりする問題がすべて解決する。


ArduinoとRTC8564回路図
Sketch: Rtc8564AttachInterruptSleep ▼

スケッチ実行には、以下の二つのライブラリが必要となる。



< Arduino RTC8564用定周期タイマー割り込みライブラリ >

なんでも作っちゃう、かも。さんのRTC8564のライブラリを使わせて頂きました。
ありがとうございます。

RTC8564用ライブラリには定周期タイマー割り込みのメソッドが含まれていなかったので、改造してみた。
以下は RTC8564ライブラリをもとに僕が追記したRTC8564定周期割り込みタイマーライブラリである。

■ Rtc8564AttachInterruptライブラリ

Download: Rtc8564AttachInterrupt.zip
Library Code:
    Rtc8564AttachInterrupt.h ▼
    Rtc8564AttachInterrupt.cpp ▼

Rtc8564AttachInterrupt.zip をダウンロード & 解凍し、Arduino/libraries/Rtc8564AttachInterrupt として保存する。
追加したメソッドは以下。

メソッド名 処理内容
 beginWithoutIsValid (void)  RTC日付時刻継続確認なしに日付時刻を初期化する。
 initDatetime (uint8_t date_time[])  日付時刻のプロパティをセットする。
 isInitDatetime (void)  日付時刻プロパティがセットされているか確認する。
 syncInterrupt (unsigned int mode, unsigned long term)  定周期割り込みタイマの設定を初期化する。
 isInterrupt (void)  定周期割り込みタイマがセットされているかの確認をする。

次回は、RTC8564についてもうちょっと詳しく書いてみる。



0 コメント:

コメントを投稿