はじめに

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

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

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

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.h
と TimeLib.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通信の中身をロジックアナライザで解析 してみようと思います。
コメント