Arduino : MAX7219 32x8 LED Dot Matrix Text Display
MAX7219의 Cascading 방식을 간단히 설명하고, 이 방식을 이용하여 32x8 LED Matrix를 동작시키는 방법
에 대해 소개합니다.MAX7219 Cascading
MAX7219와 같은 LED Drive IC 제품은 아래와 같은 Cascading 방식을 지원합니다. 하나의 IC는 8개의 Didit(DIG0~8)을 지원하지만, 더 많은 FND 또는 LED를 사용하는 경우 데이터라인 DIN, DOUT을 연결하여 사용이 가능합니다. 이와 같으 방법을 사용하면 MCU에서 SCK, DATA, LOAD(CS) 3개의 핀만 사용하여 8개 이상 많~~은 개수의 FND 또는 LED를 제어할 수 있습니다.
32x8 LED Matrix 구동 원리
아래 그림은 MAX7219를 사용한 32x8 LED Matrix입니다. 내부 회로는 그 아래 그림처럼 추정됩니다. MAX7219는 총 4개가 있으며, 각각 8x8 LED Matrix 하나씩 제어합니다.
MCU에서 이 모듈을 제어하는 3핀 중에 CLK, LATCH는 MAX7219에 공통으로 사용하고, DIN 데이터 입력 핀은 첫 번째 MAX7219로 들어가고, 이후의 데이터 라인은 DIN -> DOUT -> DIN -> ... 과 같이 연결됩니다.
지난 포스트에서 MAX7219를 제어하기 위해 16bit 데이터 프레임이 사용된다고 하였습니다. MCU에서 16bit 데이터를 전송 후에 추가 데이터를 CLK, DIN 을 통해 보내게 되면, MAX7219의 이전에 받았던 데이터는 Dout 포트를 통해 전송됩니다. 즉, MAX7219 4개가 사용되고 데이터 라인이 Cascading 방식으로 연결된 회로에서 MAX7219에 옵션을 설정하거나 LED 출력할 데이터를 보내기 위해서 16bit x 4 데이터 프레임을 보낸 뒤에 LATCH(CS) 핀을 LOW에서 HIGH로 변경하면 MAX7219 4개를 제어할 수 있습니다.
32x8 LED Matrix 고정된 문자 출력
구성품
본 예제에 사용된 부품은 아래와 같습니다.
- Arduino Uno x 1EA
- MAX7219 32x8 LED Matrix x 1EA
- JumperWires
하드웨어 연결
위의 회로도와 연결 예시는 아래와 같습니다. 아래 회로도에서 Arduino Uno 13, 11, 10번핀을 사용하였지만, 다른 핀을 사용해도 무방합니다.
코드 작성
아래 코드는 32x8 LED Matrix 코드에 abcd[4][8] 2차원 배열에 저장된 데이터를 출력하는 예제입니다. 지난 포스트의 코드에서 약간 수정을 하였습니다.
코드에 사용된 Font 데이터는 아래 링크를 참조하였습니다.
참조링크 : https://github.com/dhepper/font8x8/blob/master/font8x8_basic.h
#define SCK 13
#define DIN 11
#define LATCH 10
uint8_t abcd[4][8] = {
{0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V)
{0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e)
{0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r)
{0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1)
};
void setup(){
pinMode(SCK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(LATCH, OUTPUT);
write_Max7219(0x09, 0x00); // Decode Mode - No decode for digits
write_Max7219(0x0a, 0x01); // Intensity - 1/32
write_Max7219(0x0b, 0x07); // Scan Limit - All Output Port Enable
write_Max7219(0x0c, 0x01); // Shutdown - Normal Operation
write_Max7219(0x0f, 0x00); // Display Test
delay(50);
}
void loop(){
for( int rowNumber = 1 ; rowNumber < 9 ; rowNumber++){
digitalWrite(LATCH,LOW);
for( int columnData = 0 ; columnData < 4 ; columnData++){
shiftOut(DIN, SCK, MSBFIRST, rowNumber);
shiftOut(DIN, SCK, LSBFIRST, abcd[columnData][rowNumber - 1]);
}
digitalWrite(LATCH,HIGH);
}
delay(100);
}
void write_Max7219(uint8_t address, uint8_t data){
digitalWrite(LATCH,LOW);
shiftOut(DIN, SCK, MSBFIRST, address);
shiftOut(DIN, SCK, MSBFIRST, data);
digitalWrite(LATCH,HIGH);
}
코드 설명
위 코드는 대부분 지난 포스트의 코드(8x8 모듈 하나만 출력)와 비슷하지만, 4개 모듈을 출력하기 위해 void loop() 문 내부 for문에서 4개의 MAX7219에 데이터를 쓰기 위해 32bit 데이터를 보낸 후 LATCH핀을 HIGH로 활성화하였습니다.
for( int rowNumber = 1 ; rowNumber < 9 ; rowNumber++){
digitalWrite(LATCH,LOW);
for( int columnData = 0 ; columnData < 4 ; columnData++){
shiftOut(DIN, SCK, MSBFIRST, rowNumber);
shiftOut(DIN, SCK, LSBFIRST, abcd[columnData][rowNumber - 1]);
}
digitalWrite(LATCH,HIGH);
}
실행결과
위의 코드를 실행하면 아래와 같이 "Ver1" 문자가 표시되는 것을 확인할 수 있습니다.
마무리
이번 포스트에서 MAX7219의 Cacading 방식에 대해 설명하고, 이 방식대로 코드를 구현하여 32x8 LED Matrix에 문자를 출력하는 방법을 소개하였습니다. 이 코드가 좋은 코드는 아니고 손볼곳도 많지만, 원리를 이해하는 취지로 작성하였습니다.
위 코드는 고정된 도트 데이터만 출력이 가능합니다. 다음 포스트에서는 ascii 테이블의 도트 데이터를 이용하여 원하는 문자를 출력하는 방법과 LED Matrix 사용시 메모리 사용 팁에 관해 소개할 예정입니다.
끝까지 읽어 주셔서 감사합니다.😄
'Embedded > Arduino' 카테고리의 다른 글
아두이노 #55 MAX7219 32x8 LED 매트릭스 스크롤 원리와 라이브러리 없이 구현 예시 (0) | 2020.12.03 |
---|---|
아두이노 #54 32x8 LED Matrix Font 데이터 참조로 문자 표시 및 메모리 문제 해결 (0) | 2020.12.02 |
아두이노 #52 MAX7219 LED Matrix 모듈 기초 사용법 - 라이브러리 없이 동작 (0) | 2020.12.01 |
아두이노 #51 MAX7219 8x8 LED Matrix - MAX7219 동작 원리 (0) | 2020.11.30 |
아두이노 강좌 #50 SD-Card를 사용한 웹 서버로 LED 제어 (2) | 2020.11.27 |