소소한 개인 프로젝트로,
RaspberryPI와 Python을 이용한 프로젝트를 진행해보...려고 하였으나
한참의 삽질 끝에 던지고 C로 구현하였다.
역시 난 아직 Python은... 좀 더 공부가 필요할 것 같다.
이름 그대로 BCDBinary-Coded Decimal로 표현된 시계를 구현한다.
여담: BCD
주로 '이진화 십진법'이라고 번역되며, 10진수의 각 자리수를 2진수 4자리에 대응시켜 표현한 값이다.
각 자리수는 2진수 4자리를 필요로 하고
우리가 사용할 LED Matrix Module은 8x8이므로 16개의 숫자를 나타낼 수 있다.
16개의 숫자의 배치 방법은 다양하게 있을 수 있지만
다음과 같은 구조로 설계하였다.
Y0 Y1 Y2 Y3 M0 M1 D0 D1
Y0 Y1 Y2 Y3 M0 M1 D0 D1
Y0 Y1 Y2 Y3 M0 M1 D0 D1
Y0 Y1 Y2 Y3 M0 M1 D0 D1
H0 H1 m0 m1 S0 S1 - WD
H0 H1 m0 m1 S0 S1 - WD
H0 H1 m0 m1 S0 S1 - WD
H0 H1 m0 m1 S0 S1 - WD
상단과 하단으로 나누어
상단에는 년(Y[4]
) 월(M[2]
) 일(D[2]
),
하단에는 시(H[2]
) 분(m[2]
) 초(S[2]
) 요일(WD
)을 배치하였으며
초와 요일 사이엔 공백이 있고 요일은 일요일부터 시작하여 0 ~ 6으로 설정하였다.
예를 들어 2020년 7월 8일 수요일 21시 36분 59초를 나타낸다면
빛이 들어온 유닛을 ○, 그렇지 않은 유닛을 ●로 표기할 때
다음과 같이 나타난다.
● ● ● ● ● ● ● ○
● ● ● ● ● ○ ● ●
○ ● ○ ● ● ○ ● ●
● ● ● ● ● ○ ● ●
● ● ● ● ● ○ ● ●
● ● ● ○ ○ ● ● ●
○ ● ○ ○ ● ● ● ○
● ○ ○ ● ○ ○ ● ○
??? : "아니 이걸 보고 날짜와 시간을 읽는다고?"
사용된 하드웨어는 다음과 같다.
MAX7219는 SPISerial Peripheral Interface를 통해 RaspberryPI와 통신한다.
여담: SPI
길게 말하진 않겠다. 임베디드 시스템 소프트웨어 수업 필기 자료를 첨부한다.
RaspberryPI에서 SPI 통신을 하기 위해서는 관련 설정을 해주어야 한다.
다음 명령어를 통해 RaspberryPI 구성 설정에 진입할 수 있다.
$ sudo raspi-config
방향키를 이용해 P4 SPI
를 선택하고 엔터를 눌러 SPI를 enable 한다.
상하 방향키로 메뉴를 이동할 수 있고 좌우 방향키를 통해 선택/종료를 할 수 있다.
MAX7210 Dot Matrix Module의 핀을 다음과 같이 연결한다.
Pin Name | Remarks | RPI Pin | RPI Function |
---|---|---|---|
VCC | +5V Power | 2 or 4 | 5V |
GND | Ground | 6 or 9 or 14 or 20 or 25 or 30 or 34 or 39 | GND |
DIN | Data IN | 19 | GPIO 10 (MOSI) |
CS | Chip Select | 24 | GPIO 8 (SPI CE0) |
CLK | Clock | 23 | GPIO 11 (SPI CLK) |
VCC와 GND는 명시된 RaspberryPI 핀 중 아무데나 꽂아도 된다.
SPI 통신을 위한 프로토콜은 공식 문서 PDF를 참고하였다.
그리고 jinh
교수님의 임베디드 시스템 소프트웨어 수업 실습도 상당히 도움이 되었다.
작성한 코드는 github 저장소에서 확인할 수 있다.
RPI를 가지고 놀며 이것저것 쌓아갈 계획이긴 한데
과연 무엇을 얼마나 할 수 있을련지는 모르겠다.
C, Python, Rust를 통한 RPI 프로젝트들을 차곡차곡 쌓아보련다.
아무튼...
시연 영상은 다음과 같다.
영상에서도 알 수 있지만 이 코드는 Din을 상단으로 가정하고 작성되었다.
노트북의 시간과 1초의 오차가 있지만 무시하도록 하자.
대부분의 시계는 몇 초 정도의 오차를 가지고 있곤 하니...ㅎ