아두이노 #53 MAX7219 32x8 LED Matrix 문자 표시하기 기초 - 라이브러리 없이 코드 작성
Lucy Archive
Lucy / Facilitate4U
2020. 12. 2. 00:04

Arduino : MAX7219 32x8 LED Dot Matrix Text Display

이전 포스트에서 MAX7219를 사용한 8x8 LED Matrix 동작하는 원리와 방법을 소개하였습니다. 이번 포스트에서는

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를 제어할 수 있습니다. 

MAX7219 Cascading

32x8 LED Matrix 구동 원리

아래 그림은 MAX7219를 사용한 32x8 LED Matrix입니다. 내부 회로는 그 아래 그림처럼 추정됩니다. MAX7219는 총 4개가 있으며, 각각 8x8 LED Matrix 하나씩 제어합니다. 

32x8 LED Matrix
32x8 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개를 제어할 수 있습니다. 

MAX7219 Data Cascading

 

32x8 LED Matrix 고정된 문자 출력

구성품

본 예제에 사용된 부품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • MAX7219 32x8 LED Matrix x 1EA
  • JumperWires

하드웨어 연결

위의 회로도와 연결 예시는 아래와 같습니다. 아래 회로도에서 Arduino Uno 13, 11, 10번핀을 사용하였지만, 다른 핀을 사용해도 무방합니다.

32x8 LED Matrix 아두이노 연결 회로도
연결 예시

코드 작성

아래 코드는 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 사용시 메모리 사용 팁에 관해 소개할 예정입니다.

끝까지 읽어 주셔서 감사합니다.😄

관련포스트

👉 아두이노 LED Matrix 관련글 목록 보기

👉 아두이노 디스플레이 장치 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기