はじめに †
Raspberry Pi 3にRTCを接続します。
使用デバイス †
概要 †
使用したデバイスはMaximのDS3231です。I2CインタフェースのRTCですので、Arduino/Raspberry PiのRTCとしてポピュラーな石です。
特徴をデータシートから引用すると
- Real-Time Clock Counts Seconds, Minutes, Hours, Date of the Month, Month, Day of the Week, and Year, with Leap-Year Compensation Valid Up to 2100
- Accuracy ±2ppm from 0°C to +40°C
- Accuracy ±3.5ppm from -40°C to +85°C
- Digital Temp Sensor Output: ±3°C Accuracy
- Register for Aging Trim• RST Output/Pushbutton Reset Debounce Input
- Two Time-of-Day Alarms
- Programmable Square-Wave Output Signal
- Simple Serial Interface Connects to Most Microcontrollers
- Fast (400kHz) I2C Interface
- Battery-Backup Input for Continuous Timekeeping
- Low Power Operation Extends Battery-Backup Run Time
- 3.3V Operation
- Operating Temperature Ranges: Commercial (0°C to +70°C) and Industrial (-40°C to +85°C)
- Underwriters Laboratories® (UL) Recognized
3.3V~5Vで動作する、I2Cインタフェースの高精度なRTCといったところでしょうか。
リファレンス回路 †
データシートからリファレンス回路を引用します。

購入先 †
Amazonでモジュールを購入しました。
2個 ¥430 です。
ハードウェア構成 †
購入したモジュールの構成 †
実際に購入したモジュールは
- バックアップ電池
- 電源用パスコン
- SCK、SDAのプルアップ(4.7KΩ)
のみ実装されていました。プルアップ抵抗は、今後のモジュール増設に応じ、削除の検討が必要です。
実装方法 †
秋月電子で購入した「Raspberry Pi Model B プロトタイプ基板」です。(申し訳ありません。正式な販売名は忘れました)
今後、LCDモジュール等を増設予定で、3.3Vバスの各種モジュールを混載できるように考えておきます。

ソフトウェア †
では、実際にCentOSから使用できるようにしましょう。
アドレス †
まず、どこにRTCがマップされているかを確認します。
[root@akari ~]# /opt/i2cdetect/bin/i2cdetect
0x03 : 0x06 : Unknown device
0x68 : 0xD0 : Unknown device
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
[root@akari ~]#
0x68にマップされています。DataSheet?の通りですね。

ドライバの有効化 †
I2Cインタフェースのドライバの有効化とDS3231ドライバを有効化します。
#
dtparam=i2c_arm=on
dtparam=i2c1=on
dtoverlay=i2c-rtc,ds3231
モジュールがロードされているか確認します。
[root@akari ~]# lsmod
Module Size Used by
dm_mirror 15332 0
dm_region_hash 13392 1 dm_mirror
dm_log 11207 2 dm_mirror,dm_region_hash
dm_mod 115340 2 dm_mirror,dm_log
rtc_ds1307 13844 0
hwmon 10552 1 rtc_ds1307
brcmfmac 289093 0
brcmutil 9863 1 brcmfmac
cfg80211 543000 1 brcmfmac
rfkill 20896 1 cfg80211
i2c_bcm2835 7103 0
bcm2835_gpiomem 3940 0
fixed 3285 0
uio_pdrv_genirq 3923 0
uio 10268 1 uio_pdrv_genirq
i2c_dev 6913 0
i2c_bcm2708 5994 0
ip_tables 13161 0
x_tables 20830 1 ip_tables
ipv6 418247 33
crc_ccitt 1771 1 ipv6
[root@akari ~]#
rtc_ds1307がロードされています。ds3231じゃないんですね
確認 †
リブートしてから確認
[root@akari ~]# hwclock -r
2001年01月01日 00時00分15秒 -0.476564 秒
[root@akari ~]# hwclock --systohc
[root@akari ~]# hwclock -r
2020年06月13日 14時35分23秒 -0.543832 秒
[root@akari ~]# timedatectl
Local time: 土 2020-06-13 14:35:26 JST
Universal time: 土 2020-06-13 05:35:26 UTC
RTC time: 土 2020-06-13 05:35:26
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: no
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
[root@akari ~]#
ちなみに、通常NW接続ではNTP同期です。
[root@akari ~]# timedatectl
Local time: 土 2020-06-13 14:38:51 JST
Universal time: 土 2020-06-13 05:38:51 UTC
RTC time: 土 2020-06-13 05:38:51
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@akari ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.0.xxx 219.164.211.137 5 u 28 64 1 0.559 0.014 0.008
[root@akari ~]#
頑固にntpdを使用してます。
お疲れ様でした。