본문 바로가기

AVR(ATmega128)로 장난하기

AVR(ATmaga128)로 LED 매트릭스 장난하기



안녕하세요 고군입니다.

이번시간에는 디스플레이 장치 중 문자 또는 그림까지도 디스플레이 할 수 있는 장치인 LDM(LED Dot Matrix)에 대해 알아보고 프로그램을 통해 표시해 보겠습니다.


1. LED 매트릭스 특성 및 전자 회로


LED 매트릭스는 LED를 매트릭스 형태로 배열하여 다양한 문자나 패턴을 표현 할 수 있도록 해주는 표시 장치의 일종으로 광고를 비롯한 다양한 분야에서 활용되고 있습니다. 8X8 크기의 매트릭스의 경우 알파벳 한 글자 숫자 등을 표현할 수 있어 정보 표시를 위해 많이 사용되고 있습니다.  8X8 크기의 LED 매트릭스는 LED만 포함한 제품에서 부터 제어를 위한 칩을 포함한 보드 형태로 제작된 제품 등 종류가 다양합니다. 매트릭스의 도트를 구성하는 LED도 단색, 이색, 등 다양한 종류가 있습니다.



그림1. LED 매트릭스 형태 및 핀 배치



위 사진의 LED 매트릭스 모듈은 16개의 핀을 가지는 모듈로 각 핀은 8개 행(Row)과 8개 열(Column)을 나타낸다. LED 매트릭스 모듈의 뒷면을 살펴보면 1 번 핀에 해당하는  위치에 숫자 1이 표시되어 있습니다. 일반적으로 모듈의 제품명이 기록된 면의 가장 왼쪽 핀이 1번으로 반 시계방향으로 번호가 증가합니다.


테스트에 사용한 모듈의 내부는 행이 LED의 (+)에, 열은 LED의 (-)에 공통으로 연결되도록 구성되어있으며(그림2 참조), 이를 공통 행 양극(common-row anode) 타입 또는 양극(anode)타입이라고 합니다. 이와 반대로 되어 있는 모듈도 있으니 테스트하기전에 데이터 시트를 확인해야 합니다.


그림2. 매트릭스 모듈 내부 회로


양극 타입과 음극 타입 모듈의 차이는 특정 위치의 LED를 켜는 방법에 있습니다. 아래 그림은 4 X 4 크기의 양극 타입과 음극 타입의 매트릭스를 비교한 것입니다.양극 타입에서 (A, 2) 위치의 LED를 ON하려면 a에 H, 2에 L를 인가해 주어야 하며, 음극 타입에서는 반대로 a에 L, 2에 H를 가해 주어야 합니다.


그림3. 양극 타입과 음극 타입의 LED매트릭스


LED 매트릭스는 행과 열이 공통으로 제어되므로 모든 LED를 개별적으로 제어하는 것은 불가능하고 한 번에 하나의 행이나 열만 제어할 수 있습니다. 

그림 4는 행 단위 스캔(Row scan)을 나타낸 그림으로 행의 경우 위에서 3번째 LED만 H로 두고 나머지는 L로 설정해야 하며, 열의 경우는 왼쪽에서 첫번째 와 다섯번째 LED만 L로 두고 나머지는 H로 두어야 합니다.


그림 5의 열 단위 스캔(Column scan) 제어도 행단위와 비슷합니다. 여섯번째 열에서 첫 번째와 일곱번 째 LED만 켜고 나머지는 끄도록 하려면 여섯번째 열만 L로 두고 나머지는 H로 설정해야 하며, 행위 경우는 첫번째와 일곱번 째 행에만 H로 설해 주면 됩니다.


행 단위 스캔에서는 행에 인가하는 신호 중에 하나만 H를 가지며, 나머지는 L를 가집니다. 열 단위 스캔에서는 열에 인가하는 신호 중에 하나만 L를 가지며, 나머지는 H를 가지는 차이점이 있습니다.


    그림4 행 단위 스캔                                   그림5 열 단위 스캔


2. LED매트릭스 제어에 사용되는 디지털 출력 레지스터



3. AVR 연습용 키트를 사용한 실제 LED 매트릭스 전자회로




LED 매트릭스 연결 회로도


LED 매트릭스 제어 실험을 위한 회로 연결


>>> (예제 1.) LED 매트릭스에 삼각형 모양이 되도록 표시하기.



[단계 1] AVR Studio4로 Project를 생성하고, C언어 소스 작성하기 링크


AVR Studio4 편집 화면에 아래 C언어 소스 프로그램을 작성하여 화일명.c로 저장합니다.


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
// ATmega128의 레지스터 등이 정의되어 있음
#include<avr/io.h>
 
// _delay_ms() 함수 등이 정의되어 있음
#include<util/delay.h>
 
// C 언어의 주 실행 함수
int main(void){
    unsigned char i;        // 8비트의 변수 선언
 
    // LDM(8*8)에 표시할 모양 비트들을 저장(삼각형 모양)
    char COLS[] = {
        0B10000000,
        0B11000000,
        0B11100000,
        0B11110000,
        0B11111000,
        0B11111100,
        0B11111110,
        0B11111111
    };
 
    DDRA = 0B11111111;
    DDRC = 0B11111111;
 
    // while 블록 안의 문장을 무한 반복
    while(1){
        // 8줄의 LED 매트릭스가 켜지도록 동작을 반복함
        for(i = 0; i < 8; i++){
            // 8비트의 ROWS 신호 중 1비트만 논리 1로 출력
            PORTC = (1<<(i));
            
            // COLS 신호에 데이터 출력
            PORTA = COLS[i]; 
            
            _delay_ms(2);    // 2ms 동안 대기
        }
    }
 
    // 함수의 형태와 같이 정수형(int)의 값을 반환함
    return 1;
}
cs


[단계 2]AVR Studio 4로 C언어 소스프로그램을 빌드한다링크
[단계 3]AVR Studio 4로 타겟보드에 라이팅을 한다. 링크