Linux,Unix,BSD

[라즈베리파이] RTC 모듈(DS3231) 설정하기

채윤아빠 2022. 5. 1. 10:51
728x90
반응형

개요

인터넷이 연결된 상태에서 내부 시계를 맞춘 후에 전원을 끄고 1시간이 지난 후, 인터넷과 연결되지 않은 상태로 전원을 켜면 라즈베리파이의 시각은 1시간 전 그대로의 시각을 표시합니다.

왜냐하면 라즈베리파이에는 RTC가 없기 때문입니다. 그래서 외부 인터넷과 연결되지 않은 상황에서는 위와 같이 내부 시각이 맞지 않는 문제가 발생합니다. 인터넷 망이 연결된 상태에서는 외부 time 서버에서 현재 시각 정보를 가져와 갱신하기 때문에 시간이 맞지 않는 문제는 없습니다.

본 문서에서는 라즈베리파이에 외부 RTC 모듈(DS3231)을 연결하고, 실제로 RTC와 시각 정보를 동기화할 수 있도록 설정하는 방법을 설명합니다.

RTC 모듈(DS3231)의 연결

RTC 모듈(DS3231)은 I2C 방식으로 통신을 하게 되고, 다음과 같이 4개의 핀을 라즈베리파이에 연결합니다.

출처 : How to Add an RTC Module to Raspberry Pi

위 그림에는 Pi Zero 핀맵으로 나오지만, Pi 3, 4 모두 I2C 핀은 동일합니다.


RTC 설정

라즈베리파이에서 I2C 확인을 위하여 "i2c-tools" 패키지를 설치해야 합니다.

$ sudo apt install i2c-tools

"i2cdetect" 명령으로 연결된 RTC 모듈 상태를 확인합니다.

$ sudo i2cdetect –y 1
Error: I2C bus name doesn't match any bus present!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
       i2cdetect -F I2CBUS
       i2cdetect -l
  I2CBUS is an integer or an I2C bus name
  If provided, FIRST and LAST limit the probing range.

위와 비슷하게 관련 정보를 찾을 수 없다면,
다음과 같이 "/boot/config.txt" 파일에 "dtoverlay=i2c-rtc,ds3231" 내용을 추가합니다.

pi@raspberrypi:~ $ sudo vi /boot/config.txt

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=off

# DS3231 I2C
dtoverlay=i2c-rtc,ds3231

위 설정을 적용한 후에 재부팅을 하고, i2cdetect 명령을 실행하면 다음과 같이 "UU"라는 결과를 확인할 수 있습니다.

pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

RTC 설정을 하면 불필요한 "fake-hwclock" 패키지를 다음과 같이 제거합니다.

pi@raspberrypi:~ $ sudo apt -y remove fake-hwclock
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  fake-hwclock
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 32.8 kB disk space will be freed.
(Reading database ... 101997 files and directories currently installed.)
Removing fake-hwclock (0.11+rpt1) ...
Processing triggers for man-db (2.8.5-2) ...

"fake-hwclock" 관련 서비스를 중지합니다.

pi@raspberrypi:~ $ sudo update-rc.d -f fake-hwclock remove
pi@raspberrypi:~ $ sudo systemctl disable fake-hwclock
Synchronizing state of fake-hwclock.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable fake-hwclock
Unit /etc/systemd/system/fake-hwclock.service is masked, ignoring.
p

"/lib/udev/hwclock-set" 파일에서도 불필요한 다음 부분들을 주석 처리합니다.

pi@raspberrypi:~ $ sudo vi /lib/udev/hwclock-set


#if [ -e /run/systemd/system ] ; then
# exit 0
#fi


#  /sbin/hwclock --rtc=$dev --systz --badyear


#  /sbin/hwclock --rtc=$dev --systz

설정이 모두 정상적이라면, 다음과 같이 RTC 모듈의 시각 정보를 확인할 수 있습니다.

pi@raspberrypi:~ $ sudo hwclock -r
2000-06-19 19:31:36.234850+09:00

RTC 모듈에 시각이 맞지 않으면, 라즈베리파이를 인터넷 망에 연결하여 현재 시각을 갱신한 이후에 다음과 같이 RTC 모듈의 시각을 현재 시간으로 수정합니다.

pi@raspberrypi:~ $ sudo hwclock -w
pi@raspberrypi:~ $ sudo hwclock -r
2022-05-04 19:13:35.892643+09:00

이제 RTC의 현재 시각까지 맞추었으므로 모든 설정이 완료되었습니다.

라즈베리파이를 새로 켜거나 재부팅될 때마다 RTC 모듈의 시각 정보를 가져와 라즈베리파이의 시각을 동기화하여 현재 시각을 갖게 됩니다.


RTC 시각 동기화 시험

다음은 라즈베리파이 시각을 예전 시각으로 맞추고 재부팅하였을 때, RTC 모듈의 시각으로 동기화되는지 확인해 보도록 하겠습니다.

다음과 같이 라즈베리파이의 시각을 과거의 시간으로 설정하고, RTC 모듈의 시각과 비교합니다.
아래와 같이 설정한 경우, 약 22년의 시간 차가 있습니다.

pi@raspberrypi:~ $ sudo date -s "2000-05-04 19:13:35.892643+09:00"
Thu 04 May 2000 07:13:35 PM KST
pi@raspberrypi:~ $ date
Thu 04 May 2000 07:13:42 PM KST
pi@raspberrypi:~ $ sudo hwclock -r
2022-05-04 19:15:11.345107+09:00

라즈베리파이를 재부팅합니다.

pi@raspberrypi:~ $ date
Wed 04 May 2022 07:17:58 PM KST

재부팅 이후에 라즈베리파이의 시각 정보를 확인해 보면 위와 같이 RTC 모듈의 시각과 동기화 되었음을 확인할 수 있습니다.

이제는 라즈베리파이의 전원을 한 참을 껐다가 다시 켜더라도 현재 시각으로 동기화되어 동작하게 됩니다.


참고자료