아두이노 강좌 #25 8x8 LED Dot Matrix Scroll 문자 스크롤 하기
Lucy Archive
Lucy 2023
2020. 8. 21. 01:48

Arduino Uno LED Matrix ScrollArduino Uno LED Matrix Scroll

Arduino Uno 8x8 LED Dot Matrix Scroll Basic

이번 포스트에서는

8x8 LED 매트릭스를 사용하여 한 문자 스크롤 하는 예제

를 소개합니다. 지난 포스트에서 8x8 LED 매트릭스 동작 방법에 대한 기초를 설명하였으니, 해당 내용을 참고하시면 이번 포스트의 예제를 이해하시는데 도움이 될 것 같습니다. 관련포스트는 하단을 참고해주세요.

Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • 8x8 LED Matrix x 1EA
  • DIP Type Resistor x 8EA
  • Bread Board x 1EA
  • Jumperwires

회로도 및 연결

Arduino Uno 8x8 LED Matirx 연결Arduino Uno 8x8 LED Matirx 연결

✔ 위와 같은 8x8 LED Matrix 는 모두 디지털 핀을 사용합니다. 아두이노 초기화시 모두 출력 핀으로 설정되어야 합니다.

✔ 아두이노 우노와 핀 매핑은 위와 같은 방법대로 하지 않으셔도 무방합니다. 편하신 대로 연결하셔도 무방하여 프로그램에서 수정이 가능합니다. 하지만 권장 드리는 것은 추후 기능 확장을 위해 시리얼 포트로 사용되는 0pin, 1pin 과 인터럽트 핀으로 사용 가능한 2pin, 3pin 을 비워 놓으시길 추천 드립니다. 

✔ 저항이 Column Pin  에 연결 되어야 하는지 또는 Row Pin 에 연결되어야 하는지 기준은 표시용 8 Bit 데이터가 기록되는 곳이 Column 인지 Row 인지에 따라 결정되어야 합니다. 아래 그림과 같이 LDM 데이터 처리를 하는 경우 Column 핀에 저항을 연결 하셔야 합니다.

8x8 LED 매트릭스 표시 방법8x8 LED 매트릭스 표시 방법

하트모양 스크롤 코드 작성

코드

구성하신 회로 또는 핀맵 또는 핀 매핑이 다른 경우 1 ~ 18줄에서 해당 핀을 입력하시면 쉽게 실행 하실 수 있습니다.

한 문자를 스크롤 하는 경우 더 간단하게 구현이 가능하지만, 추후 속도 조정 및 여러 문자 스크롤 사용을 고려하여 코드를 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Coloumn Pin 할당
#define C1 9
#define C2 12
#define C3 7
#define C4 13
#define C5 A2
#define C6 6
#define C7 3
#define C8 A5
// Row Pin 할당
#define R1 2
#define R2 11
#define R3 10
#define R4 A4
#define R5 8
#define R6 A3
#define R7 4
#define R8 5
 
// Bit 추출 메크로 : data 에서 loc 번째 비트 부터 area 영역 만큼 추출
// ex) extract_bits( 0b00000010, 1, 2) 결과 1 -> 0b00000010 데이터의 2번째 비트 1크기 만큼 추출  
#define extract_bits(data, area, loc)   (((data) >> (loc)) & (area))
 
int colPin[8= {C1, C2, C3, C4, C5, C6, C7, C8};
int rowPin[8= {R1, R2, R3, R4, R5, R6, R7, R8};
 
const byte heart8x8[8= {
    0b00000000,
    0b01100110,
    0b11111111,
    0b11111111,
    0b11111111,
    0b01111110,
    0b00111100,
    0b00011000
};
 
const byte blank[8= {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
};
 
byte displayData[8]; // 최종 8x8 출력 할 데이터
byte stringBuffer[60][8]; // 스크롤 할 데이터를 저장할 버퍼
int iTextLenth = 1// 출력할 문자의 갯수
int scrollTime = 50// scrollTime 만큼 한 글자씩 시프트
 
void setup() {
    for(int i = 0 ; i < 8 ; i++)
    {
        pinMode(colPin[i], OUTPUT);
        digitalWrite(colPin[i], LOW); // Column 핀은 LOW 로 초기화
        pinMode(rowPin[i], OUTPUT);
        digitalWrite(rowPin[i], HIGH); // Row 핀은 HIGH 로 초기화
        displayData[i] = heart8x8[i];
    }
    
    for(int i = 1 ; i < iTextLenth+1 ; i++){
        for(int j = 0 ; j < 8 ; j++){
            stringBuffer[i][j] = heart8x8[j];
        }
    }
}
 
void loop() {
    unsigned long now = millis();
    static unsigned long pastTime;
 
    /*
        scrollTime 시간 마다 실행되는 if문
        scrollTime 마다 최종 출력 데이터 displayData 를 한칸씩 시프트합니다.
    */
    if(now - pastTime >= scrollTime){
        pastTime = now;
        static int count;
        static int index;
        for(int i = 0 ; i < 8 ; i++){
            displayData[i] = (stringBuffer[index][i] >> count) | (stringBuffer[index+1][i] << 8 - count);
        }
        count++;
        if(count == 8) {
            count = 0;
            index++;
            if(index == iTextLenth + 1) index = 0;
        }
    }
 
    for(int i = 0 ; i < 8 ; i++)
    {
        for(int j = 0 ; j < 8 ; j++)
        {
            digitalWrite(colPin[j], extract_bits(displayData[i],0x01,j)); // Coloumn 핀에 데이터 쓰기
        }
        digitalWrite(rowPin[i], LOW); // i 행 활성화
        delayMicroseconds(100);
        digitalWrite(rowPin[i], HIGH); // i 행 비활성화
    }
}
cs

코드 설명

주요 포인트로 생각되는 코드 설명은 아래와 같습니다. 코드 관련하여 추가 궁금하신 점이 있거나 조언을 해주실 내용이 있으면 댓글로 부탁드립니다.^^

  • 64번 for()문 : 출력할 데이터를 stringBuffer[] 에 저장합니다. 기본적으로 한 칸은 아무것도 입력하지 않고, 두번째 인덱스부터 문자를 입력하기 위해 for문 i의 초기값이 1입니다.
  • 79번 if()문 : 정의된 scrollTime 시간마다 실행되는 if()문입니다. scrollTime 은 선언문에 정의되어 있습니다. 외부 입력에 따라 변경하고 싶은 경우 스위치나, 시리얼 통신을 사용 할 수 있습니다.
  • 84번 : 최종 출력에 사용되는 데이터 버퍼인 displayData[] 배열에 현재 글자, 다음 글자를 한 칸씩 시프트하며 저장합니다.
  • 94번 : 기본적으로 계속 실행되는 for()문으로 displayData[] 배열의 데이터를 출력합니다.

결론적으로, 아래 그림과 같이 stringBuffer 에는 스크롤 할 모든 데이터가 저장되어 있고, scrollTime 시간 간격에 따라 8x8 LED 매트릭스로 출력할 데이터를 저장하는 displayData 배열에 저장되는 값이 한 칸씩 이동하는 방식입니다.

실행 결과

위의 프로그램을 실행하면 아래와 같이 실행됩니다. 


마무리

이번 포스트에서는

Arduino Uno 로 8x8 LED 매트릭스 스크롤 하는 방법에 대해 소개

하였습니다. LED 매트릭스에 스크롤 하는 방법은 아주 다양합니다. 이 코드는 제가 해보고 싶어서 직접 작성한 코드입니다. 저는 SW 전문가가 아니라 코드에 수정 될 부분이 있을 수 있으니 참고해주세요. 

다음 포스트에서는 여러 문자를 스크롤 하는 방법에 대해 소개하고, 이후에는 쉬프트레지스터를 이용해서 3개의 와이어만 사용하여 LED Matrix 를 동작하는 방법을 소개 할 예정입니다.

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

관련포스트

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

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

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