Youtube주석마루 - [아두이노 프로젝트] 4장 - 도트 매트릭스로 글자 표현하기
도트 매트릭스란
8X8 배치로 된 LED를 이용해 문자나 숫자, 그림과 같은 형상을 만들 수 있는 장치를 말한다.
또한 도트 매트릭스는 위에서 아래 방향으로 한 줄씩 LED가 빠르게 켜지고 꺼지는데
그 속도를 육안으로 인식하기 어렵기 때문에 생기는 잔상효과를 이용하여 형상을 출력한다.
도트 매트릭스는 총 16개의 핀으로 입력핀이 구성되어 있으며
볼록하게 튀어나온 부분을 아래로 두고 순차적으로 번호를 매긴다.
화살표 순서대로 1번부터 16번 핀이다.
구성품은
아두이노 우노, 브렛보드, 연결선, 저항, 버튼(스위치), 도트 매트릭스 이다.
코드는
#include<FrequencyTimer2.h> //FrequencyTimer2 라이브러리를 불러옴
#define K { \ // 나타낼 글자를 정의하는 공간으로 '1'을 켜짐 '0'을 꺼짐으로 둔다.
{ 0, 0, 0, 1, 0, 0, 0, 1}, \
{ 0, 0, 0, 1, 0, 0, 1, 0} ,\
{ 0, 0, 0, 1, 0, 1, 0, 0},\
{ 0, 0, 0, 1, 1, 0, 0, 0}, \
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
{ 0, 0, 0, 1, 0, 1, 0, 0},\
{ 0, 0, 0, 1, 0, 0, 1, 0},\
{ 0, 0, 0, 1, 0, 0, 0, 1}, \
}
#define e { \
{ 0, 0, 0, 0, 0, 0, 0, 0}, \
{ 0, 0, 0, 0, 0, 0, 0, 0} ,\
{ 0, 0, 0, 0, 0, 0, 0, 0},\
{ 0, 0, 0, 1, 1, 1, 1, 1}, \
{ 0, 0, 0, 1, 0, 0, 0, 0}, \
{ 0, 0, 0, 1, 1, 1, 1, 1},\
{ 0, 0, 0, 1, 0, 0, 0, 0},\
{ 0, 0, 0, 1, 1, 1, 1, 1}, \
}
#define v { \
{ 0, 0, 0, 0, 0, 0, 0, 0} ,\
{ 0, 0, 0, 0, 0, 0, 0, 0} ,\
{ 0, 0, 0, 0, 0, 0, 0, 0},\
{ 1, 0, 0, 0, 1, 0, 0, 0}, \
{ 1, 0, 0, 1, 0, 0, 0, 0} ,\
{ 1, 0, 1, 0, 0, 0, 0, 0},\
{ 1, 1, 0, 0, 0, 0, 0, 0},\
{ 1, 0, 0, 0, 0, 0, 0, 0} ,\
}
#define I { \
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
{ 0, 0, 0, 0, 0, 0, 0, 0},\
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
{ 0, 0, 0, 1, 1, 0, 0, 0},\
{ 0, 0, 0, 1, 1, 0, 0, 0},\
{ 0, 0, 0, 1, 1, 0, 0, 0} ,\
}
#define nplus { \
{ 0, 0, 0, 0, 0, 1, 1, 0} ,\
{ 0, 0, 0, 0, 1, 1, 1, 1} ,\
{ 0, 0, 0, 0, 1, 1, 1, 1},\
{ 0, 0, 0, 0, 0, 1, 1, 0} ,\
{ 1, 0, 0, 1, 0, 0, 0, 0} ,\
{ 1, 1, 0, 1, 0, 0, 0, 0},\
{ 1, 0, 1, 1, 0, 0, 0, 0},\
{ 1, 0, 0, 1, 0, 0, 0, 0} ,\
}
int button = A5; // 버튼입력핀
byte col = 0; // 도트매트릭스의 열번호
byte leds[8][8]; //도트매트릭스의 matrix 형태를 정의
int pins[17] = { -1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6}; //핀은 총 17개로 설정, pins[0]은 쓰지않으므로 -1로 둔다
int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[6], pins[11], pins[15], pins[16]}; //행 번호 핀 정의, 총 0~7행이다.
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]}; //열 번호 핀 정의, 총 0~7열이다.
const int numpattern = 5; // 총 5개의 문자를 나타냈기 때문에 5으로 설정
byte patterns[numpattern][8][8] = { K, e, v, I, nplus }; //패턴 번호와 패턴의 입출력 형상으로 매치
int pattern = 0; //변수 초기화
void setup() {
// put your setup code here, to run once: //핀의 입출력을 설정, 또한 열과 행의 출력 상태를 설정
for(int i=1; i <=16 ; i++)
{
pinMode(pins[i],OUTPUT);
}
for(int j=0;j < 8; j++)
{
digitalWrite(cols[j],HIGH); //출력상태 ON
}
for(int k=0;k <8; k++)
{
digitalWrite(rows[k],LOW); //출력상태 OFF
}
clearLeds(); //이후 정의될 함수
FrequencyTimer2::setOnOverflow(display); //기존 FrequencyTimer2의 라이브러리를 사용, display는 이후 정의될 함수
pinMode(button,INPUT); //버튼핀을 입력핀으로 설정
}
void loop() {
//put your main code here, to run repeatedly:
int readbutton = digitalRead(button); //버튼핀의 입력값을 읽어옴
if(readbutton == HIGH) //패턴이 모두 지나면 다시 처음 패턴으로 돌아옴
{
if(pattern == 4)
{
pattern = 0;
}
else //버튼을 누를 때마다 하나씩 증가
pattern++;
delay(500);
}
setPattern(pattern); //이후 정의될 함수
}
void clearLeds() //LED에 출력을 한 이후 잠시동안 모든 LED off
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
leds[i][j] = 0;
}
void setPattern(int pattern) //입력된 변수에 맞는 순서의 미리 정의한 패턴을 불러온다
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
leds[i][j] = patterns[pattern][i][j];
}
void display()
{
digitalWrite(cols[col],HIGH); //해당 열의 핀을 ON
col++;
if(col == 8) //모든 열이 출력을 마치면 초기화
{
col = 0;
}
for(int row = 0; row <8; row++)
{
if(leds[col][7 - row] == 1) //해당 열과 행의 LED가 켜져 있으면 해당 행의 핀 ON
{
digitalWrite(rows[row],HIGH);
}
else //해당 열과 행의 LED가 꺼져 있으면 해당 행의 핀 OFF
{
digitalWrite(rows[row],LOW);
}
}
digitalWrite(cols[col],LOW); //해당 열의 핀을 OFF
}
※ 위 코드 상으로는 도트 매트릭스의 입력핀 번호와 보드의 입/출력 핀의 연결 핀 번호가 정해져 있는 듯 하다.
도트 매트릭스 입력핀 번호 |
보드 입/출력 핀 번호 |
1 |
D5 |
2 |
D4 |
3 |
D3 |
4 |
D2 |
5 |
A0 |
6 |
A1 |
7 |
A2 |
8 |
A3 |
9 |
D13 |
10 |
D12 |
11 |
D11 |
12 |
D10 |
13 |
D9 |
14 |
D8 |
15 |
D7 |
16 |
D6 |
회로도
스위치(버튼)부의 회로도이다.
'공대생 주석마루 > 아두이노 UNO' 카테고리의 다른 글
(17) 수위(빗물) 조절 센서(Water sensor) (0) | 2018.04.07 |
---|---|
(3-1) LED 신호등 (2) | 2018.04.02 |
(15) LED RGB (2) | 2018.03.18 |
(14) Seven Segment 7세그먼트 (0) | 2018.03.15 |
(13) 시리얼(Serial) 통신 (0) | 2018.03.12 |