google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

Arduinoでリアルタイムクロック(RTC-8564NB)を読む

Arduinoでデーターロガー作りをやっています。前回は気圧と温度計の接続でしたが、今回はRTC(リアルタイムクロック)を接続してみます。

▼リアルタイムクロックモジュール、RTC-8564NB
RTC-8564NB
 秋月で500円で売ってるやつ。

 これを動かすにはI2Cのライブラリを使うわけですが、今回使ったのは、なんでも作っちゃうかもさんの書いたRTC8564というライブラリ。 RTCのライブラリは他にきむ茶工房さんのskRTClibがありこれもいじってみました。そこいらの話は後廻しにして。

 RTCでまず気になるのが精度。ということで、1秒パルスの周期を測ってみました。

▼RTCの精度測定結果
RTCの精度
 パルスの周期は999.99465msなので、誤差は5.35ppm。ということは日差は0.46秒で、一ヶ月だと13.8秒進むことになります。まあこんなもんでしょうね。ちなみにデーターシートによると精度は5±23ppm。
 この周波数カウンタはGPSで校正したルビジウムオシレータのクロックを基準に使っているので、これくらいの桁数の測定精度には問題は無いはずです。

 ついでにI2Cの波形はこんなでした。

▼時刻読み出し時のI2Cの波形全体
I2Cの波形 全体
 上がクロック、下がデータ。最初の2バイトでリクエストを送ると8バイトのデータが返ってきています。

▼波形拡大
I2Cの波形拡大
 クロックの立ち下がりでデータの変化が始まり、立ち上がりではデーターが確定しているのが良く判ります。クロックの周期は約10μsなので転送レートは約100kHzということになります。

 I2Cを使うのは初めてなのでハードの特性が気になって寄り道をしてしまいましたが、ここからは肝心のプログラムというかライブラリの話です。

 とは言っても、ArduinoでRTCを使う方法については色々な方が記事にされているので、ここではライブラリの使い勝手と、Arduino IDE 1.0.1で使った時の修正点などを重点に書いてみたいと思います。

◆ライブラリはRTC8564を使ってみた
 他にskRTClibというのもあるのでこれも使ってみました。実はskRTClibの方が作り込みがしっかりしていて機能も豊富でした。ただ、一番違和感があったのが割り込みの宣言のattachiIntterruptをライブラリの中でやっちゃっていること。attachInterrupt関数はプログラムの流れを示す重要な部品なのに、これをライブラリの中でひっそりとやられてしまっては困ります。こういうのはsetupの中にしっかりと書かないといけないでしょう。まあ、あくまでも個人的な意見です。

 一方で、ライブラリのRTC8564は時計を読む機能に特化していて余分な機能は無いので使い易いと思いました。但し、タイマー割り込みの条件を細かく設定する機能は無いのでプログラム内で設定をやっています。

◆外部割込みピンが余ってなかった
 ということで、プログラムの基本は出来たので、RTCの出力をArduinoの外部割込みに接続しようと思ったら、あらら、外部割込みに使用可能なDigitalの2と3Pinは液晶シールドが使っちゃってます。orz

 仕方がないのでDigitalの6PinにRTCの/INT信号をつなぎ、割り込みは使わずプログラムでポーリングすることに。なんだ、こんなことならskRTClibを割り込み無しで使えば良かったんじゃん、

 それとこれらのライブラリはArduni IDE 1.0が出る以前に作られたと思われ、以下の修正が必要です。
 Wire.send → Wire.write   Wire.receive → Wire.read
 skRTClibは #include "WProgram.h" → #include "Arduino.h"
 RTC8564は22行目の delay(1000);がなぜかエラーになるのでコメントアウトしました(RTCの水晶の発振待ちなので、バッテリーバックアップで使うなら大丈夫と判断)

 動作確認に使ったスケッチ。1秒毎に日付と時刻を液晶とシリアルに流すプログラムです。

◆回路図
 あ、回路図を書くのを忘れてました。回路はごく当たり前で、RTCの電源を+5Vとバックアップ電池(CR2032)の双方からダイオード(SBD)で供給。あとは上に書いたようにRTCの/INT(Pin3)をArduinoのDigital-6Pinに接続してます。というか、先にきっちり回路図を書いてから始めれば割り込みのピンがすでに液晶シールドに使われちゃってるのに気付いたはずなんだよなー。

◆SDカードのピンも液晶シールドが使っていた
 この先はSDカードのインターフェイスを作る予定なのですが、ここでも問題が。というのはSDカードのインターフェイスにはデジタルの11,12,13番ピンを使うのですが、11と12番ピンは液晶シールドが使っちゃってるんですよね。リストにするとこんな感じ。

デジタルPin
Pin 0
Pin 1
Pin 2 LCD ←外部割込み入力に使いたかった
Pin 3 LCD ←    同上
Pin 4 LCD
Pin 5 LCD
Pin 6     ← Pin2,3が使えないのでRTCの/INTの入力に使用
Pin 7
Pin 8
Pin 9
Pin 10
Pin 11 LCD ←SDカードインターフェイス
Pin 12 LCD ←SDカードインターフェイス
Pin 13     ←SDカードインターフェイス

 うーん困った。液晶のピンアサインの変更は簡単なので変えちゃうか、でも液晶シールドが使えなくなって不便。だったらI2Cの液晶にでもするしかないか。Aitendoあたりに良さそうなのがあったような。

 Arduinoで簡単なスケッチを書いている段階だとこんな問題は発生しなかったのですが、ある程度複雑な物を作る時は、きちんと調べてから取り掛かからないとヤバイみたいです。反省;

【2013/11/30追記】
 RTCのライブラリ(RTC8465)の修正方法のまとめ記事を作りました。詳しくは下記をご覧ください。
http://radiopench.blog96.fc2.com/blog-entry-443.html

tag : RTC ライブラリ 液晶

カレンダー
07 | 2012/08 | 09
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード