RTC 모듈 원리 - RTC modyul wonli

DS1302는 시간을 저장하고있는 모듈입니다. 예를들어 아두이노를 시계로 사용하고있는데, 전원이 나가면 시간이 초기화 됩니다. 그러나 DS1302를 연결하면(건전지 사용) 아두이노의 전원이 나가도 시간이 저장됩니다. 

VCC2 : 주 전원 핀 입니다. VCC2 >VCC1 + 0.2V이면 VCC2가 전원을 공급하고  VCC2가 더 작으면 VCC1가 전원을 공급합니다.

VCC1 : 보조 전원 핀 입니다. 보통 배터리를 연결하고, DS1302에 전원이 공급되지 않으면 VCC1가 전원을 공급합니다.

GND : GND

X1 ,X2 : 클럭 공급 핀입니다. 32.768Hz를 사용합니다.

SCLK : 시리얼 인터페이스의 데이터의 이동을 동기화 시켜주는 핀

I/O : 입/출력 핀 

CE : 리셋 핀

전 DS1302모듈을 가지고 실제 회로대로 만능기판에 납땜을 해서 사용했는데, 미리 조립된 DS1302를 사용해도 상관 없습니다. 아두이노 우노에 전원으로 사용할수있는게 5V, 3.3V가 있는데 5V로 해야합니다.

아두이노에는 DS1302헤더파일이 있는데 이걸 사용하면 매우 쉽습니다.

위의 파일을 다운받고 아래의 그림처럼 들어가서 라이브러리를 추가해줍니다

RTC 모듈 원리 - RTC modyul wonli
#include 
DS1302 rtc(2, 3, 4);

void setup()
{
 rtc.halt(false); 
 rtc.writeProtect(false); 
 Serial.begin(115200); 
 rtc.setDOW(TUESDAY);
 rtc.setTime(14, 41, 0);
 rtc.setDate(22, 8, 2017);
}
 
void loop()
{
 Serial.print(rtc.getDOWStr());
 Serial.print(" ");
 
 Serial.print(rtc.getDateStr());
 Serial.print(" -- ");
 
 Serial.println(rtc.getTimeStr());
 
 delay (1000);
}

코드에서 보면 setup부분에 setDOW,setTime,setDate함수로 날짜를 업데이트 합니다. 이 날짜는 DS1302에 저장이되므로 날짜를 넣은 이후에 날짜를 새로 갱신하지않기위해서는 코드를 지워야합니다.

  if(!strcmp(rtc.getDateStr(),"01.01.2000"))
    rtc.writeProtect(false); 
  else
    rtc.writeProtect(true);

만약 위의 방식과 다르게 지우는방식이 싫다면, 위와같은 코드를 넣으면 처음 한번만 날짜값을 업데이트합니다. 왜냐하면 처음 DS1302를 연결해서 rtc.getDataStr()함수를 호출하면 01.01.2000가 읽힙니다. 그래서 01.01.2000이 맞다면 날짜값을 업데이트 가능하게 해주고(rtc.writeProtect(true)) 그렇지 않다면 날짜값 업데이트를 막습니다.(rtc.writeProtect(false)) 이 방식의 단점은 처음 날짜값을 업데이트하고나서 새로 날짜를 업데이트하려면 rtc.getDataStr()값을 01.01.2000으로 만들어야 한다는 점입니다. 값을 01.01.2000으로 만드는 방법은 DS1302에 연결해있는 배터리를 뺐다끼면 됩니다

실습은 개인 학습을 위해 "주) 엘케이 임베디드" 사이트에서 구매한 아두이노 코딩 배우기 고급 키트를 이용한 학습입니다. 동봉된 책을 기반으로 학습하면서 개인적인 궁금증과 추가 필요한 부분을 정리한 블로그임을 미리 알려드립니다.

 

< 준비물 >

아두이노 우노 : 1개

USB 케이블  : 1개 

점퍼 케이블(숫암) : 4개

RTC 시계모듈 : 1개

RTC 모듈 원리 - RTC modyul wonli

 

시계 모듈인 RTC 모듈의 간단한 사용법 실습입니다. 가장 기초적인 사용법을 익혀 뒤에 다른 모듈과의 조합으로 많은 작품을 만들어 보세요....

RTC 모듈 원리 - RTC modyul wonli

< 참고 지식 >

⦿ RTC 시계 모듈(DS1302)

RTC 모듈 원리 - RTC modyul wonli

RTC 시계모듈에는 DS1302, DS3231, PCF8563 등 여러 가지 종류가 있습니다. 그중 오늘 사용할 모듈은 가장 저렴한 DS1302를 사용할 예정입니다. 

 우선 RTC는 실시간 시계라는 의미로 Real Time Clock의 약자입니다. 전원 공급이 없어도 시간 정보를 유지해야 하기 때문에 보통의 경우 동전 배터리(CR2032)를 장착하고 사용합니다. RTC 모듈과 아두이노의 연결 시에는 Vcc와 GND핀이 반대가 되지 않도록 주의가 필요합니다. 또한 배터리가 모두 방전이 되면 시간 정보를 기억하지 못합니다. 이때에는 배터리를 교체해 주세요.....

 

< 라이브러리 >

RTC 시계모듈을 사용하기 위해서는 필요한 라이브러리를 설치해야 합니다. 라이브러리 관리에서도 추가할 수 있지만 .zip 라이브러리 추가하는 방법으로도 가능합니다. 우선 아래 파일을 다운로드합니다.

일반적으로 (🤔?) RTC 모듈로써 동작하기 위해서는 1초 라는 시간을 count 할 수 있어야 한다. 이를 위해 대표적으로 사용되는 클럭 주파수 값은 32.768 kHz 이다. 임베디드 시스템에서는 주로 더 높은 주파수의 클럭을 분기 (divide)해서 32.768 kHz 주파수를 생성하거나, 메인 프로세서 주변에 32.768 kHz 의 진동수를 생성하는 외부 크리스탈 (Crystal) 발진기 (Oscillator)를 연결해 사용하기도 한다.

32.768 kHz 의 주파수로 생성되는 클럭의 한 주기는 약 30.52 us 이므로, 꽤 정밀하게 1초 라는 시간을 count 할 수 있다. coin cell0 BLE 프로세서에서는 소프트웨어적으로 RTC 를 구현하기 위해 32.768 kHz 의 클럭 주파수를 내부의 coin cell2 레지스터 값을 이용해서 coin cell3 로 다시 한 번 분기한다.

coin cell4 = 32.768 kHz/coin cell3 = coin cell7

따라서, 최종적으로는 약 coin cell8 정도의 클럭 주파수를 생성할 수 있으며, 해당 클럭의 한 주기는 coin cell9 에 해당하므로 1초 라는 시간을 counting 할 수 있게 된다 ⏱.


7.2 DS1307 제어하기

7.2.1 준비 과정

다음으로 32.768 kHz1 이라는 RTC 모듈 제어하는 방법을 간단하게 소개하고자 한다. 구체적인 소스 코드는 없으나, 데이터 시트를 보면서 어떤 식으로 32.768 kHz1 모듈을 제어해야 하는지에 대해 소개하고자 한다 📜.

DS1307 RTC DataSheet 링크: https://datasheets.maximintegrated.com/en/ds/DS1307.pdf

RTC 예제를 검색해보면 아두이노 보드를 가지고 32.768 kHz3 RTC 모듈을 제어하는 예제가 많은데, 본인의 경우 32.768 kHz4 보드를 이용해 RTC 모듈을 제어하려고 했기 때문에 32.768 kHz5 통신으로 제어가 가능한 32.768 kHz1 모듈을 이용했다.

아두이노 계열 보드의 경우 단순히 예제 찾아서 동작시키는데는 문제가 없는데 라이브러리가 아두이노 IDE 환경에 맞게 설계되어있다 보니 원래의 소스 코드를 다시 분석해서 이를 제어하기 위한 별도의 라이브러리를 구축하는게 여가 귀찮은 일이 아니다.

RTC 모듈 원리 - RTC modyul wonli

아무튼 여차저차해서 32.768 kHz1 RTC 모듈을 구매했는데 구글에 검색해보면 가격이 너무 저렴해서 (중간에 880 원은 뭐야) 제대로 동작하기는 하는 건지 의심부터 든다. 일단 구매후 아래와 같이 전원과 GND, 그리고 32.768 kHz5 통신을 위한 32.768 kHz9, 32.768 kHz0 라인을 연결해주었다.

RTC 모듈 원리 - RTC modyul wonli

NOTICE: 32.768 kHz1 데이터시트를 보면 권장되는 Supply voltage 값은 32.768 kHz2 이지만 nRF52840-DK 보드의 시스템 제어 레벨이 32.768 kHz3 이므로, 위 그림에서는 RTC 전원을 32.768 kHz4 에 연결해주었다 (nRF52840-DK 보드의 VDD 핀 전압은 약 2.95 ~ 3 V 정도). 또한, nRF 보드의 경우 내부의 풀업 저항 (pull-up resistor) 가 내장되어 있으므로 곧바로 32.768 kHz9, 32.768 kHz0 라인을 연결했지만, 풀업 저항이 없는 프로세서를 이용하는 경우 연결해줘야 정상적인 32.768 kHz5 통신이 가능하다

7.2.2 DS1307 주요 레지스터

32.768 kHz1 의 32.768 kHz5 슬레이브 주소 (slave address) 값은 32.768 kHz0 이며, 주요 레지스터 주소는 다음의 그림과 같다 (데이터시트 참조).

RTC 모듈 원리 - RTC modyul wonli

처음 구동 시, RTC 모듈을 연결해서 위 그림의 레지스터 주소 값들을 읽어 보면 아래 그림처럼 고정된 값만 계속 읽히는 것을 확인할 수 있을 것이다. 해당 내용 관련해서는 데이터 시트에 명시되어 있는데, “0번 주소” 32.768 kHz1 (32.768 kHz2) 값이 ‘32.768 kHz3’ 로 설정되어 있는 경우 RTC 모듈의 counting 기능이 비활성화 된다.

RTC 모듈 원리 - RTC modyul wonli

따라서, 처음 RTC 구동 후 “0 ~ 6번 주소” 의 레지스터에 현재 시간 정보를 입력해주어야하고, 이 과정에서 0번 레지스터의 BIT7 값도 ‘32.768 kHz4’ 으로 설정해줘야 한다.

다음의 그림은 RTC 레지스터에 현재 시간 정보를 입력한 이후 1분 간격으로 시간 정보를 읽은 결과를 보여준다. 그림에서 빨간색으로 표시한 영역이 분 (minute) 영역의 데이터에 해당하며, 정상적으로 RTC 모듈이 활성화 된 것을 확인할 수 있다.

RTC 모듈 원리 - RTC modyul wonli

7.3 DS1307 소비 전류

32.768 kHz5 보드를 이용해 32.768 kHz1 모듈의 소비 전류를 측정해본 결과 외부 전원 (32.768 kHz4)이 공급되는 경우에는 약 32.768 kHz8 의 전류를 소모하고, 외부 전원이 차단되는 경우에는 평균적으로 32.768 kHz9 정도의 전류를 소모한다.