본문 바로가기

공대생 주석마루/아두이노 UNO

(16) 도트 매트릭스 (Dot Matrix)

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