[권문송의 라즈베리 파이 먹기] (9)팀장님께 사제 폭…아니 탁상 시계를 선물했어요

- Advertisement -

[프로젝트 9]FND로 시계를 만들어봤습니다

안녕하세요. [권문송의 라즈베리 파이 먹기] 시간이 돌아왔습니다. 정확히는 ‘성공은 했는데, 왜 성공했는지 모르겠다’ 시리즈겠죠. 오늘도 크게 다르진 않습니다. 그나마 ‘절반 정도는 이해 한게 아닐까’ 스스로 위로를 해봅니다.

오늘의 주인공은 FND(Flexible Numeric Display)입니다. 7-세그먼트(7-Segment)라고도 합니다. 숫자를 나타내는 디스플레이인데요. 모양은 이렇게 생겼습니다.

뒤집으면 이렇게 보입니다.

자. 이렇게 달랑 놓으면 이걸로 무얼할 수 있을까 막막해집니다. 하지만 우리에겐 서칭이 있잖아요? 어느 커뮤니티의 슬로건 같은 것이 생각나네요. 묻기 전에 검색을 생활화합시다. 역시 온라인에는 선구자이자 선지자이신 분들이 많습니다. 저 같은 문송에게 많은 도움이 됩니다.

우선 FND에 대해 공부를 좀 해봅시다. FND는 위에 보이는 12개 핀으로 제어을 해 특정 숫자를 표시합니다. 때로는 점(Dot)을 표시하기도 합니다. 핀마다 역할이 따로 있는데요. 아래 그림을 먼저 봐야겠습니다.

우선 모델의 시리얼 넘버가 찍혀진 곳에 있는 핀이 1,2,3,4,5,6입니다. 그리고 반대편에 12,11,10,9,8,7 순서로 번호가 있습니다. 사진만 봐서는 잘 모르겠는데요. 핀별로 어떤 역할을 하는지 한참을 고민했습니다.

화면으로 보는 게 답답해 종이로 프린터해 이리저리 메모도 하면서 알아봤습니다. 종이로 보니 훨씬 편하네요.(옛날 사람…)

자 이제 하나하나 뜯어봅시다. 우선 4개 숫자 부분은 왼쪽부터 dig.1 부터 dig.4까지 있습니다. 우선 이 dig 들과 안에 형상을 만들기 위한 7개 분할된 라인이 있습니다. a,b,c,d,e,f,g 입니다. DP라고 하는 건 점입니다. D5와 D6는 콜론(Colon :)입니다.

그럼 dig.4 부분에 숫자 1을 표시하기 위해서는 어떻게 해야할까요. 우선 dig4에 신호를 줘야겠죠. 그리고 b와 c에 신호를 넣습니다. 그럼 이렇게 되겠죠.

즉 특정 칸에 숫자를 나타내려면 두가지 일을 해야합니다. 우선 dig들에게 신호를 주고 다음에 a~g까지 신호를 줘 숫자 모양을 만듭니다. 그러면 분할된 라인 빛을 켜거나 끄는 방식으로 숫자를 표현하겠죠. 이 켜고 끄는 걸 라즈베리 파이 GPIO로 제어합니다.

FND 핀과 라즈베리 파이 GPIO 핀의 회로도를 그려놓은 것이 이 그림입니다.

자. 저는 이제 머리가 아파오기 시작합니다. 영어와 숫자가 많네요. 왼쪽 Seg/digit 부분을 보면 첫번째 bot left(Bottom Left, 아래 왼쪽)는 FND(7Seg)의 첫번째 핀(1)으로 제어합니다. 바로 이녀석입니다.

이 1번 핀을 GPIO 7번에 연결합니다. 그리고 신호를 준다면 어떻게 될까요. 바로…

이렇게 되겠죠. 하지만 첫번째에만 표시하고 싶습니다. 나머지 dig.2~dig.4는 신호를 주지 않는다고 가정합시다. 그리고 dig.1에만 신호를 줍니다. 위에 표를 보면 가장 아래 dig1이 있습니다. 핀은 12번입니다. 이 녀석 이겠죠.

반대쪽에 있어 보이진 않습니다. 1번 핀 반대편에 있는 핀이 12번입니다. 12번 핀을 GPIO에는 어디에 연결해야할까요. 표를 보면 22번으로 되어 있습니다. 다른 신호를 주지 않고 연결된 GPIO7과 GPIO 22에만 신호를 주면 이런 방식으로 뜰 것입니다.

실제로 그런지 한번 해봅시다. 이제 본격적으로 진행해보도록 하겠습니다.

우선 준비물입니다. 점퍼 와이어가 상당히 많이 필요합니다. 총 12개가 필요하네요. 넉넉히 준비를 합시다. 저항이 있는데요. 선지자 분들께서 그린 회로도를 보면 저항도 함께 연결했더라고요. 혹시 전압이 강해서 FND가 날라가 버리면 어찌될까 두려워 그대로 저항도 연결했습니다. 저렇게 생긴 FND는 딱 하나밖에 없습니다.

회로도를 먼저 참고해볼까요.

이런 방식입니다. 복잡하네요. 그런데 이 사진을 보니 뭔가 떠오르는데 아직까지 명확하게 생각이 나진 않네요. 일단 진행해보도록 하겠습니다.

편의상 브레드 보드에 꽂았습니다. 핀은 10번부터 15번까지 연결된 상태입니다. 저항부터 먼저 연결해보겠습니다.

회로도랑 조금 다릅니다. 왜 그런고 하니…브레드 보드 폭이 너무 좁기 때문입니다. 회로도에는 FND를 꽂고 나서 위에 3칸, 아래 4칸의 공간이 있는데, 이 브레드 보드에는 위에 2칸, 아래 3칸 뿐입니다. 그래서 저항의 다른 한쪽을 조금씩 당겨서 연결했습니다. 구조는 동일하다고 봅니다. 다만 저항끼리 서로 맞닿지 않도록 주의를 해야겠죠.

이제 GPIO 차례입니다.

위에 회로도를 보고 그대로 꽂았습니다. 신기한건 5V나 그라운드(GND)에 연결하는 선이 없더군요. 모두 GPIO에 바로 연결합니다. 라즈베리 파이에 먼저 연결한건 사진 찍기 용이해서입니다. 사실 하나하나 연결하는게 헷갈리지 않을 거 같습니다.

7번과 8번에 연결했습니다. FND와 GPIO 핀 연결 표를 다시 한번 보시죠. 7번은 top right(위쪽 오른쪽)이고 8번은 dig.3입니다. 바로 여기 인셈이죠.

해당 부분에 불이 들어온걸 보니 지금까지는 틀린 게 없는 모양입니다. 나머지 점퍼 와이어도 연결해봅시다.

끝났습니다. 혹시나 싶어 점퍼 와이어를 연결하는 동안 라즈베리 파이에 전원은 빼버렸습니다. 아직까지는 아무것도 뜨는게 없죠. 저렇게 보니 역시 무언가 떠오르는데…아직까지는 잘 모르겠습니다.

그리고… 그분이 또 왔습니다.

지옥의 파이썬 시간입니다. 여전히 직접 코드를 짤 수 없어 선구자의 코드로 도움을 받았습니다. 이번에는 외국 선구자입니다. alex라는 분인거 같습니다. 생큐 알렉스~

# code modified, tweaked and tailored from code by bertwert

# on RPi forum thread topic 91796

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

# GPIO ports for the 7seg pins

segments = (11,4,23,8,7,10,18,25)

# 7seg_segment_pins (11,7,4,2,1,10,5,3) + 100R inline

for segment in segments:

GPIO.setup(segment, GPIO.OUT)

GPIO.output(segment, 0)

# GPIO ports for the digit 0-3 pins

digits = (22,27,17,24)

# 7seg_digit_pins (12,9,8,6) digits 0-3 respectively

for digit in digits:

GPIO.setup(digit, GPIO.OUT)

GPIO.output(digit, 1)

num = {‘ ‘🙁0,0,0,0,0,0,0),

‘0’🙁1,1,1,1,1,1,0),

‘1’🙁0,1,1,0,0,0,0),

‘2’🙁1,1,0,1,1,0,1),

‘3’🙁1,1,1,1,0,0,1),

‘4’🙁0,1,1,0,0,1,1),

‘5’🙁1,0,1,1,0,1,1),

‘6’🙁1,0,1,1,1,1,1),

‘7’🙁1,1,1,0,0,0,0),

‘8’🙁1,1,1,1,1,1,1),

‘9’🙁1,1,1,1,0,1,1)}

try:

while True:

n = time.ctime()[11:13]+time.ctime()[14:16]

s = str(n).rjust(4)

for digit in range(4):

for loop in range(0,7):

GPIO.output(segments[loop], num[s[digit]][loop])

if (int(time.ctime()[18:19])%2 == 0) and (digit == 1):

GPIO.output(25, 1)

else:

GPIO.output(25, 0)

GPIO.output(digits[digit], 0)

time.sleep(0.001)

GPIO.output(digits[digit], 1)

finally:

GPIO.cleanup()

이 코드입니다. 그런데 말입니다. 저는 처음에 원하는 부분에 숫자만 띄우는데 만족하려고 했습니다. 그런데 이 코드를 보니 단순히 숫자만 표현하는 코드가 아니더라고요. 무려 ‘시계’였습니다.

여러 선지자들의 블로그를 보면 다양한 FND 표현 코드가 있더군요. 랜덤으로 표현하기도 하고 특정 숫자를 표현하기도 했는데, 이건 ‘시계’입니다. 즉 라즈베리 파이에서 인지하고 있는 현재 시간을 표현합니다.

이 코드를 보니 무척 욕심이 나더라고요. 주제가 ‘FND로 숫자를 표현해봤습니다’에서 ‘FND로 시계를 만들어봤습니다’로 급 변경했습니다.

그리고 나름 코드에 대해 고민해봤습니다. 나름입니다. 아주 대충 해봤습니다. 여러분이 관측하기 전까지 이 코드에 대한 저의 이해는 ‘옳음’과 ‘틀림’이 중첩된 상태인거죠. 확정되면 댓글로 알려주세요. 부탁드릴게요.

라인 34까지(34는 없죠? 33번)는 대충 이해했습니다. GPIO와 숫자를 표시하기 위한 설정인 것 같습니다. 문제는 35번 라인 try 부터네요. 조금 찾아보니 time.ctime()이 현재 시간을 출력하는 명령어더라고요. 그 뒤는 이 시간을 어떻게 표시할 것인가에 대한 코드인 것 같습니다…같습니다…같습니다…ㅜㅜ

파이썬 동영상 강의라도 들어봐야 할까봐요. 기초부터 다져야 라즈베리 파이도 계속 진행할 수 있을 것 같습니다.

라즈비안에서 토니를 열고 코드를 실행해봤습니다.

됩니다!. 뒷걸음 치다 쥐 잡은 꼴이지만, 되긴 됩니다. 야호(…)

현재 시간 오후 4시 18분(16시18분)입니다. 중간에 점(dot)도 깜빡이면서 표시되는군요. 시간 변화도 이상없습니다. 동영상으로 한번 보시죠.

icon-alert

ic_multitracktest

네이버 동영상 플레이어

재생시간, 이 동영상의 길이는 18초 입니다.

화질 선택 옵션

화질 선택 옵션

FND 시계

한손으로 들고 찍으려니 좀 떨리네요. 이렇게 ‘[프로젝트 9] FND 시계를 만들어봤습니다’도 끝났습니다. 근데 아까부터 자꾸 뭔가 떠오르는 건 무엇이었을까요? 다시 결과물을 지켜보며 골똘히 생각해봤습니다.

무엇일까요?

?

??

???

????

?????

??????

???????

사제 폭탄 책상 위에 놓을 수 있는 탁상 시계를 만들었습니다. 지금까지 떠올랐던 게 이거였군요. 훨씬 깔끔해 보이고 허섭한 사제 폭탄 탁상 시계입니다.

사제 폭탄 탁상 시계를 존경하는 팀장님께 드리기로 했습니다. ‘권문송의 라즈베리 파이 먹기’ 코너를 위해 법카도 많이 쓰고, 팀원들한테 간식도 많이 사주는 고마운 분입니다.

팀장님 책상 위에 놓아둔 모습입니다. 참 잘 어울리는 사제 폭탄 탁상 시계죠? 팀장님도 참 좋아라 하셨습니다. 그럼 저는 다음 시간에 다시 돌아오겠습니다. 다른 분들도 혹시 사제 폭탄 탁상 시계를 만들었다면 고마운 분들께 선물해보세요. 고마워 하는 반응이 사제 폭탄의 폭발적입니다. 그럼 Good Bye World~! (판사님 이 글은 문과가 썼습니다.)

※도움받은 글

https://raspi.tv/2015/7-segment-display-python-raspberry-pi-countdown-ticker

https://raspi.tv/2015/how-to-drive-a-7-segment-display-directly-on-raspberry-pi-in-python

https://devicemart.blogspot.com/2019/05/4-digit-fnd.html

https://webcreate.tistory.com/entry/avr-7segment-FND-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC

♥지난 콘텐츠 보기

테크플러스 에디터 권동준

tech-plus@naver.com

*네이버 테크 구독하기*

*테크플러스 텔레그램 구독하기*

- Advertisement -

Related Stories

Enable Notifications    OK No thanks