[권문송의 라즈베리 파이 먹기] (10)>”테크플러스는 당신과 함께 있습니다”

- Advertisement -

[프로젝트 10] 8X8 매트릭스로 “Techplus is with you” 출력

안녕하세요. [권문송의 라즈베리 파이 먹기] 시간이 돌아왔습니다. 제가 싫어하는 말 중에 ‘실패는 성공의 어머니”라는 말이 있습니다. 여러 번의 실패가 있어야 비로소 성공할 수 있다는 좋은 의미를 가지고 있죠. 하지만 너무 진부한 표현이라고 생각합니다. 그래서 즐겨 찾지 않는 말입니다.

그런데, 이번 화 제목을 ‘[권문송의 라즈베리 파이 먹기]<10>성공의 어머니를 만났습니다’로 할까 했습니다. 이 코너를 시작하고 나서 처음으로 실패할 뻔했기 때문입니다. 처음 코너를 시작할 때 실패기도 가감 없이 보여드리겠다고 했지만, 실제 실패하면 어쩌나 노심초사하고 있습니다. 그래도 어찌어찌 돌아가게는 했습니다. 왜 그런지는 잘 알 수 없지만 말이죠.

우선 지난번 사제폭탄 탁상시계를 만들어 팀장님께 선물을 드렸죠. 하지만 저에겐 라즈베리 파이가 하나밖에 없어서 다시 뺏어 돌려받았습니다. 허접한 케이스는 뜯어버리고 본연의 모습으로 돌아왔습니다. 다음 프로젝트를 진행해야 하니까요.

오늘 함께 할 아이는 바로 8X8 도트 매트릭스 LED입니다. 이렇게 생겼죠.

가로 세로 8개의 LED가 있는 디스플레이 모듈입니다. 총 64개 점(도트)로 간단한 문자를 쓸 수 있습니다. 설정하기에 따라서 문자열을 좌우나 상하로 움직이게 할 수 있습니다. 오늘의 목표는 이 8X8 도트 매트릭스 LED로 “테크플러스는 당신과 함께 있습니다”라는 문구를 써볼 계획입니다. 테크플러스는 여러분과 함께하고 있으니까요.

앞으로 8X8 도트 매트릭스 LED는 그냥 매트릭스 LED라고 하겠습니다. 우선 이 매트릭스 LED의 원리를 조금이나마 알아보고 가겠습니다. 매트릭스 LED는 라즈베리 파이와 연동할 때 GPIO를 사용하지 않는다고 합니다. SPI(Serial Peripheral Interface)라는 직렬 통신용 핀을 활용합니다.

분명 라즈베리 파이에서 핀들은 모두 GPIO였습니다. 근데 갑자기 SPI는 어디에 있을까요. 이 사진을 보면 알 수 있습니다.

라즈베리 파이 GPIO 핀입니다. 그런데 GPIO 7, 8, 9, 10, 11을 보면 괄호가 있죠. 그 안에 (SPI_)라고 적혀있습니다. 핀 색으로 보면 핑크색입니다. 핫핑크인가요. 여하튼 이 5개의 핀을 인터페이스 설정에 따라 GPIO 대신 SPI로 사용할 수 있습니다.

SPI는 데이터를 보내는 쪽과 받는 쪽으로 나눠 서로 동기화합니다. 여기서 데이터를 보내는 주인님(Master)은 라즈베리 파이입니다. 채찍질을 맞으며 시키는 대로 일을 하는 노예(Slave)는 매트릭스 LED입니다. 노예는 좀 그런가요? 종속 장치라고도 하죠.

그런데 SPI를 보면 _ 뒤에 여러 가지 단어가 있습니다. 7번부터 보면 CE1, CE0, SCLK, MISO, MOSI입니다. CE는 칩셋 설정을 할 때 사용합니다. 칩셋 설정은 뒤에 좀 더 다뤄보도록 하겠습니다. 이번에는 CE0을 사용합니다. 그리고 SCLK는 주인님의 시간과 맞추기 위한 CLOCK 설정에 사용합니다. 제대로 된 동기화를 위한 거죠.

다음에는 MOSI와 MISO가 있습니다. MOSI는 Master Output Slave Input입니다. 노예가 명령(?)을 주면 주인님이 받아 수행하는 겁니다. 좀 이상하네요. 다음 MISO는 Master Input Slave Output로 그 반대입니다. 주인님이 명령을 입력하고 노예가 받아 수행합니다. 아까 주인님이 라즈베리 파이고, 노예가 매트릭스 LED라고 했죠. 그러니 MISO를 사용할 겁니다. 사실 누가 주인님이고 누가 노예면 어떻습니까. 다 제 손바닥 안에 있는데 말이죠(건방 건방… 죄송합니다)

다시 매트릭스 LED로 돌아옵시다. 왼쪽 5개 핀이 보이죠. 라즈베리 파이의 SPI 핀과 이 핀을 연결할 겁니다. 그런데 핀 옆에 보면 작은 글씨가 있습니다. 좀 확대해볼게요.

위에서부터 VCC, GND, DIN, CS, CLK 라고 적혀져 있습니다. VCC는 전원(+)을 공급하는 핀입니다. GND는 익숙하죠? 그라운드(-)입니다. DIN은 데이터를 입력하는 핀입니다. CS는 칩셋을 선택하는 핀입니다. 그리고 CLK가 클락입니다.

이렇게 보면 아까 라즈베리 파이의 SPI핀과 매트릭스 LED의 어떤 핀과 연결해야 하는지 대충 짐작이 가시죠? VCC는 5V와 연결합니다. GND는 역시 GND와 연결해야겠죠. 데이터를 입력하는 DIN은 MISO와 연결됩니다. CS는 CE0, CLK는 SCLK와 각각 연결하면 됩니다. 이제 연결해볼까요.

?

처음부터 난관에 직면하는군요. 보다시피 라즈베리 파이 핀과 매트릭스 LED 핀이 모두 수놈입니다. 저한테는 암수 와이어 점퍼밖에 없죠. 서로 연결할 수 없습니다. 그래서 이 녀석을 다시 꺼내들었습니다.

GPIO 확장 모듈입니다. 이걸 브레드 보드와 연결해서 암수 점퍼 와이어를 꽂을 수 있도록 했습니다. 이제 다시 라즈베리 파이와 매트릭스 LED를 연결해봅시다. 회로도와 간단한 표로 나타내면 다음과 같습니다.

이렇게 됩니다. 중간에 매트릭스 LED 전체에 불이 들어왔습니다. 전원이 바로 공급되어서 그런 듯합니다. 연결 작업 중에는 라즈베리 파이를 꺼두는 게 좋을 거 같습니다. 전 5V 전원 케이블을 뺐다가 다시 꽂았습니다.

이제 라즈베리 파이로 SPI 핀을 제어할 수 있도록 설정을 좀 해볼까요. 기존에는 SPI 핀이 아닌 GPIO로 되어 있기 때문에 SPI핀을 사용할 수 있도록 설정을 바꿔줘야 합니다.

라즈비안에서 Raspberry Pi Configuration에 들어가면 중간에 SPI가 있습니다. 이걸 사용 가능(Enable)하게 바꾸면 끝입니다. 간단하죠? 물론 터미널에서도 설정하는 방법이 있습니다. sudo rasp-config라고 명령어를 친 다음 소프트웨어 Configuration Tool 화면에서 SPI를 Enalbe 하면 됩니다.

이제 필요한 라이브러리를 설치해야 하는데요. 처음에는 한 유튜브 채널에서 아주 간단하게 매트릭스 LED를 제어하는 동영상을 봤습니다. 바로 아래 영상입니다.

영상을 보면 앞의 과정은 지금까지 했던 것과 같습니다. 문제는 MAX7219 드라이브라는 것입니다. 이걸 설치해야 한다고 하는데요. MAX 7219란 무엇일까요.

원래 8X8 도트 매트릭스 LED는 이렇게 생겼습니다. 첫 사진과 차이가 있죠. 여기 하단에 여러 개의 핀이 있어 행렬에 맞춰 LED 불을 밝히는 모양입니다. 도트 하나하나 제어해야 하니 굉장히 어려울 것 같습니다. 이걸 쉽게 제어해주는 것이 바로 MAX 7219칩입니다.

바로 이 녀석입니다. 자세히 보면 칩 윗면에 MAX7219 어쩌고 모델명이 적혀있죠. 만약 이 칩이 없으면 굉장히 고생을 해서 매트릭스 LED를 구동하는 것 같습니다.

바로 이런 식으로 말이죠. 복잡한 회로도를 보니 숨이 막히면서 가슴이 답답해지네요. MAX 7219가 이 고통을 대신해줄 것이라고 믿고 드라이브를 설치해보겠습니다.

유튜브 영상 하단에 MAX 7219 기반 매트릭스 LED의 파이썬 모듈이 있습니다. 주소는 다음과 같습니다. https://github.com/rm-hull/luma.led_matrix

이걸 라즈비안 터미널을 통해 설치합니다. 자세한 설치 과정을 문서로 만든 것이 있는데, 역시 동영상 하단 링크에 있습니다. 다음과 같습니다. https://drive.google.com/file/d/1navrNF8bcX_BMGakJ11DJKT7M4ZhL5UB/view

파이썬 모듈을 내려받고 SPI가 제대로 작동하는 건지 확인해봤습니다. $lsmod | grep -i spi 입니다

이제 라이브러리를 설치해봤습니다. 링크된 문서에 따르면, 명령어는 다음과 같습니다.

$ sudo usermod -a -G spi,gpio pi

$ sudo apt-get install build-essential python3-dev python3-pip libfreetype6-dev libjpeg-dev

$ sudo -i pip install –upgrade pip setuptools

$ sudo apt-get purge python3-pip

이것저것 설치하는 장면입니다. 여기서 pip라는 게 자주 등장합니다. 찾아보니 파이썬 패키지 매니저라고 하는군요. 이후 문서에 시키는 대로 따라 진행해봤습니다.

라즈비안에 있는 기본 pip는 오래된 버전이라고 하네요. 그래서 위 명령어를 입력, 최신 버전을 설치합니다.

마지막으로 최신 버전의 라이브러리를 설치합니다.

$sudo -H pip install –upgrade lume.led_matrix

마지막 단계까지 진행하니 No module named pi라느니 아래 빨간색으로 ERROR 라느니 오류 메시지가 잔뜩 뜨네요. 무엇이 문제일까 한참을 고민해봤습니다. 전 시킨 대로 한 잘못밖에 없다고 생각했는데, 라즈베리 파이는 뭔가 마음에 안 드는 모양입니다. 그래도 혹시 모르니 계속 진행해봤습니다.

라즈비안에서 파이썬 실행기 토니를 열고 코드를 넣어줬습니다. 이제 파이썬 코딩에 대한 고민은 하지 않기로 했습니다. 따로 공부하기로 하고, 우선 실습에 주안점을 뒀습니다. 유튜브 링크의 문서에 보면 예시로 둔 코드가 있습니다. 이걸 참고하시면 됩니다. 사실 너무 복잡해서 이해도 잘 안 가고 설명하기 어렵네요… (ㅜㅜ)

import re

import time

import argparse

from luma.led_matrix.device import max7219

from luma.core.interface.serial import spi, noop

from luma.core.render import canvas

from luma.core.virtual import viewport

from luma.core.legacy import text, show_message

from luma.core.legacy.font import proportional, CP437_FONT, TINY_FONT, SINCLAIR_FONT, LCD_FONT

def demo():

#create matrix device

serial = spi(port=0, device=0, gpio=noop())

device = max7219(serial)

print(“Created device”)

# start demo

msg = “MAX7219 LED Matrix Grid Demo”

print(msg)

show_message(device, msg, fill=”white”, font=proportional(CP437_FONT), scroll_delay=0.05)

time.sleep(0.5)

msg = input(‘Enter your text:’)

print(msg)

show_message(device, msg, fill=”white”, font=proportional(LCD_FONT), scroll_delay=0.1)

print(‘Brightness’)

show_message(device, msg, fill=”white”, scroll_delay=0.1)

time.sleep(0.5)

print(‘Alternative font!’)

show_message(device, msg, fill=”white”, font=SINCLAIR_FONT, scroll_delay=0.1)

time.sleep(0.5)

print(‘Proportional font – characters are squeezed together!’)

show_message(device, msg, fill=”white”, font=proportional(SINCLAIR_FONT), scroll_delay=0.1)

if __name__ == “__main__”:

try:

demo()

except KeyboardInterrupt:

pass

역시 실행되지 않습니다. 좌절했습니다.

권문송의 라즈베리 파이 먹기 시리즈 코너를 진행하고 나서 첫 실패 사례를 남겨야 하느냐. 여기가 이번 10화의 제목을 ‘[권문송의 라즈베리 파이 먹기]<10>성공의 어머니를 만났습니다’라고 할까 고민했던 부분이었습니다.

한참을 고민하다가 퇴근했습니다. 퇴근 시간이 다 됐기 때문입니다. 모든 직장인들이 ‘칼퇴’하길 바랍니다. 우울한 마음을 안고 귀가하고 다음 날이 밝았습니다.

실패기로 올리면 여기까지가 끝입니다. 마감 시간이 있다 보니 여기서 끝내는 게 더 수월할 수 있다고 생각했습니다.

포기하면 편하다는 안 선생님 악마와 그래도 어떻게든 성공을 해봐야 하지 않겠냐는 정대만 천사가 다툼을 시작했습니다. 그리고 정대만은 머리를 깎게 되죠(스포 금지)

그래도 칼을 뽑았으니 무라도 썰어보겠다는 심정으로 다시 라즈베리 파이 앞에 섰습니다. 아니 앉았습니다.

어제 문제점이 무엇이었을까 생각하다가 ‘버전’이 떠올랐습니다. 뭔가 구동해야 할 드라이브와 라이브러리 등의 버전이 서로 맞지 않아 오류가 생긴 게 아니었을까요. 인터넷 검색을 한참 하던 중 새로운 선지자를 만났습니다.

바로 빅코드님의 블로그(https://bigcode.tistory.com/32)입니다. 여기서 이런 문구를 발견하게 되죠.

이왕 이렇게 된 거 빅코드님의 블로그 대로 다시 진행하기로 했습니다. 블로그 안에 아예 설치를 위한 매뉴얼이 있더라고요. 앞서 매트릭스 LED 드라이버 이름이 Luma.LED 였습니다. 이걸 내려받아 설치했는데, 이 Luma.LED 측에서 설치 매뉴얼을 제공하고 있었습니다.

https://luma-led-matrix.readthedocs.io/en/latest/install.html

여기서 보면 파이썬 3의 라이브러리 설치 시 명령어를 바꿔서 입력하라고 나와있었습니다. 이게 문제의 원인이지는 모르겠지만, 일단 따르도록 했습니다.

처음부터 다시 설치하도록 하겠습니다.


설치가 되는 것도 있고, 이미 설치해서 안 되는 것도 있습니다. 그래도 여기까지는 문제가 없는 것 같습니다. 이제 예제 소스를 돌려보도록 하겠습니다.

다운로드 폴더에 luma.led_matrix 폴더에 들어가면 예제 파일들이 있습니다. 그중 하나를 실행했습니다. matrix_demo 입니다. 코드는 아래 링크에 들어가면 확인할 수 있습니다.

https://github.com/rm-hull/luma.led_matrix/blob/master/examples/matrix_demo.py

자 이제 실행해봅시다.

icon-alert

ic_multitracktest

네이버 동영상 플레이어

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

화질 선택 옵션

화질 선택 옵션

매트릭스 데모

됩니다!!! 성공했습니다. 제가 한건 그다지 없지만, 그래도 성공했습니다. 자 이제 문구를 조금 바꿔 보려고 합니다. 코드 안에 msg(메시지)라고 되어 있는 부분이 있는데, 여기에 “테크플러스는 당신과 함께 있습니다”라는 문구를 넣고 싶습니다. 하지만 한글은 안되는군요. 바로 오류가 났습니다. 대신 “Techplus is with you”라는 문구를 넣었습니다.

icon-alert

ic_multitracktest

네이버 동영상 플레이어

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

화질 선택 옵션

화질 선택 옵션

매트릭스 수정

역시 됩니다. 그런데 매트릭스 LED가 하나라서 글자를 식별하기가 쉽지 않네요. 다른 블로그를 보니 매트릭스 LED를 4개 붙여서 길게 활용하기도 했습니다. 저는 매트릭스 LED가 한 개밖에 없어서 그건 좀 힘들겠네요 (ㅜㅜ)

매트릭스 LED에 글자를 출력하는 건 여기까지 하도록 하겠습니다. 어느덧 [권문송의 라즈베리 파이 먹기]가 10회 차가 됐습니다. 처음에 구매했던 라즈베리 파이 베이직 키트 안의 부품도 거의 다 활용해봤습니다. 센서가 몇 가지 더 있긴 합니다. 하지만 뭔가 완제품을 만들어 보고 싶다는 욕심이 생겼습니다. 그래서 팀장님에게 앙탈을 부렸습니다. 이거 사달라고.

라즈베리 파이 RC카입니다. 카메라와 센서를 이용해 장애물을 피해 간다고 하더군요. 굉장히 어려울 건 같지만 한번 도전해보고 싶었습니다. 팀장님은 마치 “이번에 1등 하면 사줄게”라는 부모님처럼 “시리즈로 여러 편 나가면 사줄게”‘라고 하셨습니다. 그래서 3~4회 동안 이걸 만들어볼 생각입니다. 완성될 때까지는 조금 걸리겠지만, 여러분은 기다려 주시리라 믿습니다. 테크플러스는 당신과 함께 있으니까요. 그럼 다음 시간에 돌아오겠습니다.

ps. 파이썬 공부를 위해 책을 한 권 샀습니다. 그냥 열심히 공부하겠다는 의지 표현입니다. 칭찬받고 싶어서요… 칭찬이 고픈 나이입니다…

※도움받은 글

https://bigcode.tistory.com/32

https://codefooo.gitbooks.io/raspberry-experiments/%EC%8B%A4%ED%97%983-8×8-%EB%8F%84%ED%8A%B8%EB%A7%A4%ED%8A%B8%EB%A6%AD%EC%8A%A4dot-matrix.html

https://www.youtube.com/watch?v=HDGutvP0OjI

https://m.blog.naver.com/PostView.nhn?blogId=darknisia&logNo=220667411137&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://luma-led-matrix.readthedocs.io/en/latest/install.html

♥지난 화 보기

테크플러스 에디터 권동준

tech-plus@naver.com

*네이버 테크 구독하기*

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

- Advertisement -

Related Stories

Enable Notifications    OK No thanks