RTCとは?Arduinoで学ぶリアルタイムクロックの仕組みと使い方

Arduino

はじめに

文系少女まなみ
文系少女まなみ

ねえ先生、パソコンのコンセント抜いてても、電源入れたらちゃんと時刻あってるよね?なんで?

KYB先生
KYB先生

おっ、いい質問だね!それは RTC(リアルタイムクロック) を使っているからなんだよ。

まなみ
まなみ

RTC?…聞いたことないなあ。どういう仕組み?

KYB先生
KYB先生

RTCはね、時計専用のICなんだ。パソコンなどに組み込むことで、電源が切れていても電池で時刻を刻み続けてくれるんだよ。

今日はArduinoとRTCモジュールを使って、実際に動かしてみよう。


この記事では、RTCとは何か? どんな仕組みなのか? そして実際にArduinoとRTCモジュール(DS3231)を使って時刻を表示する方法を紹介します。

この記事を読んで分かること

  • RTCとは何か、その役割
  • ArduinoでRTCモジュールをどう接続するか
  • 実用的なプログラム例で時刻を読み取る方法

RTCとは??

RTC(リアルタイムクロック)は、現在の時刻や日付を記録し続けるIC です。
マイコン(Arduinoなど)にもタイマー機能はありますが、電源を切るとリセットされてしまいます。
そこでRTCを使うと、電源を落としてもバッテリーで時計を維持でき、再起動後も正しい時刻を保持できます。

なぜバックアップ電源が必要なのか??

RTCは発振回路の信号を利用して時刻をカウントしています。
発振回路は電源がなければ動作しないため、主電源を切るとクロックが止まってしまいます。
※発振回路については、以前の記事(NOTゲートIC(TC74HC14)で発振回路を自作!方形波を発生させる方法)で解説しています。

そのため、RTCにはコイン電池(CR2032など)のようなバックアップ電源を接続し、電源が落ちても時刻を刻み続けられる仕組みになっています。

下記はRTC ICチップ(DS3231)の内部ブロック図です。(データシートより引用)
チップの中に発振回路が内蔵されていることが分かります。

使用したもの

使用したRTCモジュールは以下のような形です。

説明

パラメータ:
1.寸法:38mm * 22mm * 14mm
2.重量:。 8g
3.動作電圧:3.3-。 5 .5 V
4.クロックチップ:高精度クロックチップDS3231
5.範囲内のクロック精度:0-40¡æ、精度2ppm、誤差約1分
6.プログラム可能な正方形-ウェーブ出力
7.リアルタイムクロック。秒、分、時間、日、日付、月、年を生成でき、2100年までの時間を提供し、うるう年の補正が可能です。
8.内部チップ温度センサーには、精度3¡¡¡ AT24C32(32Kのストレージ容量)
10. IICバスインターフェース、400KHzの最大伝送速度(5Vの動作電圧)
11. IIC他のデバイスをカスケード接続でき、24C32アドレスは短絡回路A0によって変更できます/ A1 / A2、デフォルトアドレスは0x57です
パッケージが含まれています:
5 * DS3231 AT24C32クロックモジュールリアルタイムクロックモジュール(バッテリーなし)

回路図(接続方法)

RTCモジュールはI2C通信を利用します。
以下のピンを使用します。

  • SDA
  • SCL
  • VCC → 3.3V
  • GND

※プルアップ抵抗はモジュールに搭載されているため、別途実装する必要はありません。
※RTCモジュールにバックアップ電池(CR2032など)をセットしておくと、電源を切っても時刻を保持できます。

以下はRTCモジュールの回路図です。(商品説明欄より引用)

プログラム

以下は、Arduino + DS3231モジュールを使って、日時(年・月・日・時・分・秒・曜日)をシリアルモニタに1秒ごと表示するサンプルコードです。

使っているライブラリは DS3232RTC.hTimeLib.h です。
現在の時刻を初期設定する必要があるので、動作させるときは時刻を入力して下さい。

#include <Wire.h>
#include <DS3232RTC.h>
#include <TimeLib.h>

DS3232RTC rtc;  // RTCクラス
const char* week_day[] = { “Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat” };
void setup() {
  Serial.begin(115200);
  Wire.begin();  // ハードウェアI2C初期化
  rtc.begin();
  // RTCに時刻を設定する場合のみコメントアウト解除
  // setTime(19, 17, 0, 23, 9, 2025); // 時, 分, 秒, 日, 月, 年
  // rtc.set(now());               // RTCに書き込み
}
void loop() {
  tmElements_t tm;
  rtc.read(tm);  // RTCから現在時刻を取得
  char buf[40];
  sprintf(buf, “%04d/%02d/%02d %02d:%02d:%02d (%s)\n”,
          tm.Year + 1970, tm.Month, tm.Day,
          tm.Hour, tm.Minute, tm.Second,
          week_day[tm.Wday – 1]);  // Wday=1〜7
  Serial.print(buf);
  delay(1000);
}

コード説明

  • Wire.begin() で I2C 通信を初期化
  • rtc.begin() で RTC モジュールを使える状態にする
  • setTime(...)rtc.set(now()) の部分は 初回だけ 実行して現在時刻を RTC に書き込むためのもの。
  • rtc.read(tm) で RTC から読み込み、tmElements_t 構造体に結果を格納
  • 曜日は配列 week_day[] を使って文字列表示

結果

シリアルモニタを Arduino IDE 等で開くと、以下のような表示が1秒ごとに出ます。

まとめ

  • RTC は電源が切れても時刻を保持できるリアルタイムクロックモジュール
  • Arduino と I2C 接続で簡単に使える
  • 年月日・曜日・時刻を読み出すサンプルコードで動作確認できる
  • 次のステップとして、表示モジュール(LCD/OLED)への表示や、ログへの書き出し、アラーム機能などに応用可能

次回は、今回使ったRTCモジュールとArduinoの間でやりとりされる I2C通信の中身をロジックアナライザで解析 してみようと思います。

コメント

タイトルとURLをコピーしました