google-site-verification: google3bd66dd162ef54c7.html

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 ライブラリ 液晶

コメントの投稿

管理者にだけ表示を許可する

RTC8564は22行目の delay(1000);がなぜかエラー

delay(1000)でエラーの件

頭の方に取り敢えず
  #include "Arduino.h"

と書いたらエラーが出なくなりましたよ。

re:RTC8564は22行目の delay(1000);がなぜかエラー

akaさん、連絡ありがとうございます。

RTC8564.cppの #include の最後に
 #include "Arduino.h"
を入れたらコンパイラが通るようになりました。

他のライブラリ見ると同じ宣言がある、またはインクルードしている hoge.hの中に同じ宣言がある。
なので、この対策が正解なんでしょうね。

参考にさせて頂いてます。

いつも参考にさせて頂いております。
記事を参考に追試させて頂きました。気圧センサー
モジュールはLPS331APですが、RTC-8564NBと合体
させ、ほぼいい感じで動作しております。この模様を
当方の拙いヴログに掲載しても構いませんでしょうか?
宜しくお願い致します。

re:参考にさせて頂いてます。

ゐとうさん、今晩は、コメントありがとうございます。

そちらのブログ拝見しました。これからちょくちょく寄らせていただきますね。

気圧センサーでLPS331APなんてのがあるんですね。精度が高くて良さそうです。

それと、ブログへの掲載とかは勝手にやっていただいてかまいません。引用するときにちょこっと書いていただければ嬉しいですが、ネットに情報公開した段階で何されても文句言えないと思ってますです。

RTC

当方素人でRTCとSDカードの連携で環境測定ロガーを作ろうとして、
どうしても連携がうまくいかず長く挫折しておりましたが、
ラジオペンチ様の記事と“なんでもつくっちゃう、かも。”さんのライブラリで
ようやく稼働までこじつけることができました。
大感謝です。
とにかく感謝を伝えたく書き込みいたしました。
ありがとうございました。
これからも更新頑張って下さい。

re:RTC

マクオさん、おはようございます

お役に立てたようで何よりです。これからも記事の更新がんばります。

No title

私も、ラジオペンチさんの気圧データーロガーの記事を参考にしてソーラーパネルのデーターロガーや湿度計のロガーを初めて作ることが出来ました。
まだ難しく理解できない所もありますが入門者にも優しく丁寧な記事のお陰で、挑戦してみようと意欲が湧きます。
これからも沢山電子工作記事が増えたら良いですね。最近、加速度センサーを購入しましてarduinoに繋げて遊んでみました。
こちらのBlogで数字をグラフにすると面白いという事を知ってしまったので、これを地震計として使えないかなと思っています。
でも私のスキルだとまだまだ難しい。ラジオペンチさん、もし気が向いたらと希望的リクエストです。興味ないでしょうか。

hiroさん、おはようございます

それだけご自分で出来るようになったら楽しいですよね。

地震計はとりあえず考えていないです。ある程度ちゃんとやるためには3軸の加速度センサーが必要になるし、大きなダイナミックレンジが入りそうなのでやっかいかなと思ってます。

No title

最近、arduinoを覚えたばかりで電子工作・テストが面白くて、センサーの応用などいろいろ空想だけはしてしまうのですが
実際は知識やプログラムが出来なくて企画倒れだらけです。今回、震度計と言っても実際の震度は測れないので簡単な物しか出来ないですが
先の大地震で震度6強で被災し家中の物が破壊散乱してしまい、またいつ来るかわからない防災対策として何か役に立つ物が作れないか思考錯誤中です。もうあんな経験はしたく有りませんが本音ですが、こればかりは、、。
「大きなダイナミックレンジ」とはちょっと難しい言葉なのでわかりませんが、私の使用してるセンサー(秋月で購入のKXR94-2050)では、arduinoで5v基準電圧にしてad変換させ、いまちょっと揺れたこれから来るか!の地震だとad変換数値の変化は2とか3程度でした。もう少し、数値が大きく振れてくれればと使いやすいです。
色々やり始めなので、プログラムなどで悩むみ相談すると思います。その時はよろしくお願いします。
raspberry piでUSBメモリカードを使用の記事、私もそのままでは書込みできなく早速役に立ちましたありがとうございます。

hiroさん、おはようございます

3.11の地震で被害に遭われていたんですね。それなら地震系に対する思いもわかってきます。

サンサーのKXR94-2050についてちょっと調べました。3軸なんですね。フルスケールが2Gなので大きな揺れの検出には向いているように思います。使いこなせると面白い応用がありそうな気がしました。
カレンダー
05 | 2017/06 | 07
- - - - 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 -
プロフィール

ラジオペンチ

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

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