2016年9月6日火曜日

arduinoでRTC(リアル・タイム・クロック)モジュールを使う

 RTC(リアル・タイム・クロック)モジュールとはコンピュータなどに内蔵されている時計のことで、本体の電源が切れても自身バックアップ用の電源を持っていて絶えず時を刻み、コンピュータからの呼び出しに応じていつでも現時刻を返す働きをする、左写真のような部品です。

 arduino でいろいろ試しているときに RTCモジュールも、、、、とおもっていましたがなぜかそのままになっていました。

 今回トライしたのは DS1307 という RTC 専用のICです。このチップは少し古いですが幅広く使われており基本を学ぶには恰好だとおもいます。

 当初は部品を集めてモジュールを作るつもりで入手した左写真の鉛筆の上にある DS1307 が1個\250でした。

 これに対し、上に示したモジュール(表と裏)は時計専用の32.768kHz 水晶振動子(クリスタル)に加え、データ保管用の EEPROM 24C32 や裏面にバックアップ用電池のホルダーまでも搭載して\100を少し越えただけとは、これも恐るべし中華パワー、、、、で、即採用。

 回路図を示します。
 回路図中に書いてあるように、安価な非充電型のLi電池 CR2032 を使う場合は充電回路を取り外して、単に電池を DS1307 の3ピンに接続するように改造します。

 左写真がbefore 右写真が after です。
 
 左写真にある黄色の線で囲まれたチップ部品(ダイオード1個と抵抗3個)を取り外し、抵抗R6のあったところをジャンパー線でショートすれば出来上がりです。

 非充電型のLi電池 CR2032 でも2~3年は持つのでこれで充分です。

 RTC(リアル・タイム・クロック)モジュールと arduino との接続は右図のように4本のみです。

 VCC(+5V) と GND は当然のこととして、arduino ( ATMega328 )の A5 とモジュールの SCL  、arduino の A4 とモジュールの SDA の接続は I2C (アイ・スクエア・シーインターフェースを形成し、この2線で信号のやり取りをするのです。 

 arduino による「 I2C を使っての RTCモジュール制御」については NETで公開された arduino libraly が多くあり参考になります。

 私は RTClib という libraly を使ってみました。
 左は libraly ファイルのサンプルにあったスケッチです。
 このスケッチを走らせることで時刻データ(年、月、日、時、分、秒)を RTC(リアル・タイム・クロック)モジュールから読み取ってコンピュータへ一秒間隔で表示させることができました。














 このようにして時刻データを取得することで他のアプリケーションと組み合わせ、定刻にブザーを鳴らしたり、一定時間ごとの温度を計測したりするときに役立つのです。

 この RTC モジュールで少々厄介なのは時刻設定です。上のスケッチでは中ほどに 
     RTC.adjust(DateTime(__DATE__, __TIME__));
とありますが、このスケッチをコンパイルしたときの時刻が初期設定値として使われてしまいますので、実際に動かしたときにはどうしても遅れが生じてしまいます。

 このことを避けるため、手動で現時刻をセットするための libraly もありますので( timeset など)試してみるとよいかとおもいます。

0 件のコメント: