Shift register를 이해하고, 8x8 LED를 제어하여 다양한 모양을 표기할 수 있다.
▶ 이 가이드를 따라하면,
- 8x8 LED및 이를 여러 개 붙여서 제어하는 방법을 배운다.
- Shift register의 역할을 이해한다.
▶ 먼저 읽으면 좋은 글
- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1
- OLED 128x64 사용법 : http://bbangpan.tistory.com/4
▶ 부품 설명 및 회로 구성
MAX7219 칩 기반의 LED 8x8 장치는 다음과 같이 생겼다. 어떤 패키지는 납땜을 하지 않고 판매되는데 납땜이 자신이 없거나 번거롭다면, 납땜이 완료된 버전으로 구매하기를 추천한다. 상단 LED 자체와 MAX7219기판은 분리가 가능하도록 구성되어 있다. 대략 $3 정도에 구매할 수 있다.
<MAX7219, MAX72?? 시리즈의 8x8 LED>
LED는 단순히 적절한 전류를 +,-로 각각 흘려주면 불이 들어오는데, 문제는 저렇게 제어해야할 LED가 많은 경우(8x8만 해도 무려 64개)에는 엄청나게 많은 pin을 연결하여 하나씩 하나씩 +,- 를 제어해 주어야 한다는 점이다. Arduino UNO에 벅차도록 핀이 너무 많이 필요하다. 여간 불편한 일이 아닐 수가 없다. 기존에 소개했던 OLED 128x64 모듈처럼 아예 I2C와 같은 통신을 지원해주는, 독립 처리를 하여 알아서 제어해주는 방법도 있지만 대개 별도 프로세서를 같이 내장해야하기 때문에 사실 비싸다(대량 생산하면 사실 그렇게 비싸진 않지만, 여하튼 몇 천원 더 비싸다.).
Shift register는 이런 상황에서, 간단하게 하나의 핀으로 n개의 핀에 on/off를 제어할 수 있는 오래된 방법이다. 결국 제어 핀을 줄일 수 있는 방법 중 하나다. 어떻게 가능할까? 클럭의 주파수 변화에 따라 n개 핀의 on/off여부를 하나의 핀에 넣어주고, 발사! 하면 한번에 그것들이 출력된다. 간단한 개념도가 아래와 같다.
<2개의 Data/CLK로 8개의 아웃풋 핀을 제어할 수 있는 개념도/그림1>
이것들을 조합하면 결국 최소 16개의 출력이 필요한 8x8 LED제어를 2~3개의 핀만으로 제어할 수 있는 환경을 제공한다. 그리고 이러한 Shift register의 재미있는 점은 이것을 단순히 이어 붙이는 것 만으로도, 더 많은 수를 제어할 수 있다는 점이다. 상기 그림1의 각각 출력을 또 다른 쉬프트 레지스터의 입력으로 하나씩 넣으면, 몇 번의 연결을 통해 더 많은 수의 핀을 제어할 수 있고, 같은 방식으로 확장해나갈 수 있다. 이 MAX7219시리즈의 8x8 LED도 따라서 옆에 단순히 이 보드를 연결하는 것 만으로도 길게 LED를 구성해 제어할 수 있다. 많은 LED 제어를 위해 추가로 제어할 핀이 필요하지 않은 요긴한 방법이다. 아래가 그 예시다.
<5개의 MAX7219 시리즈 LED 8x8 을 이어붙인 모습/ http://www.instructables.com/id/Arduino-LED-Matrix-Clock/ 발췌>
일단 먼저 아래와 같이 연결한 후 가이드를 따라서, 한 개의 8x8 LED를 제어하는 경우를 알아보자.
<MAX7219와 UNO 연결. DIN/CLK/CS를 D12/D11/D10에 연결하자. VCC/GND는 5V/GND에 연결한다>
개념도에서는 CS(Control Signal의 약자일 것)를 설명하지 않았는데, 입력을 할 테니 준비하라고 알려주는 등의 제어 신호를 보내는데 사용된다.
CLK는 클락을 DIN은 실제 셋팅할 값을 보낸다.
▶ 소스 코드 입력 및 구동
별도의 소스를 작성하지 않고 라이브러리의 예제를 사용해보자. LedControlMS라는 라이브러리를 받아서 설치한다.
http://www.instructables.com/id/LED-Matrix-with-Arduino/step2/Arduino-Library/ 에서 화면 중간의 LedControlMS.zip을 받아 아두이노 라이브러리 폴더에 압축을 푼다. Arduino Sketch를 재 시작한 후 메인메뉴 파일의 예제->LedControlMS->MakeSpace_LEDMatrix를 선택해 컴파일 및 업로드를 해보자.
<LedControlMS의 MakeSpace_LEDMatrix를 불러서 실행>
구동하면, 몇 가지 애니메이션 표시 후 숫자가 출력되는 것을 알 수 있다.
참조로 해당 소스는 LED의 8x8영역을 x,y : (7,7 / 맨왼쪽 상단) -> (0,0 / 맨오른쪽 하단) 까지의 좌표로 환산하고, 아래 명령으로 제어한다.
lc.setLed(0,x,y,true); //x,y좌표의 LED를 켠다)
lc.setLed(0,x,y,false); //x,y좌표의 LED를 끈다)
lc.setRow(0,x,0x0C); //x줄 전체를 0x0C(bit로 환산하면 00001010 값이 나온다)로 한꺼번에 셋팅
lc.setColumn(0,y,0x0C); // y줄 전체를 0x0C(bit로 환산하면 00001010 값이 나온다)로 한꺼번에 셋팅
lc.clearDisplay(); // 모두 off한다.
기타 API는 실제로 실험하면서 효과를 확인하고 응용하도록 한다
▶ 구매 가이드
MAX7219 dot LED 8x8 : http://www.aliexpress.com/premium/MAX7219-dot-led.html?ltype=wholesale&SearchText=MAX7219+dot+led
▶ 강의 키워드
MAX7219, Shift register, 쉬프트 레지스터, 8x8 LED, 아두이노, arduino
'아두이노 디스플레이' 카테고리의 다른 글
[디스플레이/E-ink] 전자잉크 Heltec 2.13 inch E-ink display V2 (Waveshare 2.13 inch e-paper) (0) | 2020.07.09 |
---|---|
[디스플레이/OLED] SSD1306 driver 기반의 얇고 긴 OLED, 0.91 inch 128x32 (0) | 2017.06.08 |
[디스플레이/컬러OLED] SSD1331 driver를 갖춘 color OLED 96x64 0.95 inch (0) | 2017.06.08 |
[디스플레이/WS2812] 8x8 WS2812 LED 디스플레이 사용법 (0) | 2016.12.12 |
[디스플레이/MAX7219] 8 digits LED(7 segments), MAX7219 (0) | 2015.12.19 |
[디스플레이/원형칼라LED] 링형 RGB LED WS2812 Ring x24를 사용해 심플한 조명을 구현해보자 (0) | 2015.10.16 |
[디스플레이/터치스크린] 2.4인치TFT Touchscreen LCD 쉴드(ST7781 or ILI9325) (4) | 2015.04.19 |
[디스플레이/문자LED] 4자리(digits) 영숫자 출력 가능한 LED : TM1637 모듈 (0) | 2015.04.18 |
[디스플레이/LED] 끈형태의 LED줄을 통해 조명제어를 해보자 : WS2812 LED (0) | 2015.03.29 |
[디스플레이/OLED] 저전력의 최소 핀으로 구현가능한 고해상도 소형 OLED (128x64) 모듈 (0) | 2015.01.26 |