본문 바로가기
아두이노_프로세싱/아두이노

도트매트릭스(dot matrix) 제어 1

by 돌돌쌤 2012. 6. 27.

 

도트매트릭스(dot matrix) 제어 1

LED를 여러개를 묶어 글씨나 간단한 도형을 출력할수 있는 장치다

LED의 수 또 같은 갯수라도 크기에 따라 종류가 다양하다.

여기에서 사용한 것은

8x8 소형 도트매트릭스 SZ420788K-16P로

총 64개의 LED를 묶어 놓은 것 중 소형매트릭스를 이용하였다.

자세한 사양은

http://www.eleparts.co.kr/front/productdetail.php?productcode=003009003000000007을 참고


핀은 품명이 마킹되어 있는 곳의 맨 왼쪽 핀부터 1번으로

반시계방향으로 총 16번까지 넘버링된다.

불을 켜는 방법은

13번핀에 +, 9번핀에 -를 연결하면 맨위 왼쪽 led가 불이 들어온다

또 9번핀은 13,3,4,10,6,11,15,16에 연결된 LED의 애노드를 공통으로 묶고 있어

9번핀에 -를 연결한체 13,3,4,10,6,11,15,16에 +를 연결하면 맨 윗줄에 불이 들어온다.

결국 총 16개의 선에 신호를 주면 64개의 LED의 제어가 가능하다.

그러나 아두이노만으로 제어하기에는 16개의 핀이 필요하고

64개의 LED를 켜기위해서는 많은 전류가 소모되므로

아두이노에 무리가 올 수 있으므로

74hc595 shift register 2개(1개에 8개의 데이터 전송)와

(74hc595의 사용은 http://eskelt.tistory.com/9 참고)

ULN2603을 사용하면 아두이노에서 전원을 제외하고

3개의 핀으로 매트릭스 제어가 가능하다.

그림처럼 웃는 모양의 그림을 표시하려면

첫번째 줄

9번핀에 신호를 주고(첫번째 줄 1,0,0,0,0,0,0,0 즉 0x80)

(uln2603을 통해 9번핀에 신호를 주면 9번핀은 GND 처리된다.)

13,3,4,10,6,11,15,16핀에 0,1,1,0,0,1,1,0(즉 0x66)의 신호를 보내면

첫 줄 그림처럼 불이 들어온다.

두번째 줄

14번핀에 신호를 주고(두번째 줄 0,1,0,0,0,0,0,0 즉 0x40)

13,3,4,10,6,11,15,16핀에 1,0,0,1,1,0,0,1(즉 0x99)의 신호를 보내면

두번째 줄 그림처럼 불이 들어온다.

.

.

.

.

.

이런식으로 총 8줄을 짧은 시간간격으로 한줄씩 표현하면

눈으로는 하나의 웃는 모습으로 인식된다.

소스 스케치

-----------------------------------------------------------------------

/* 도트 매트릭스 웃는 얼굴 표현*/

int clock = 2;  //74HC595의 클럭핀과 연결

int latch = 3;  //74HC595의 래치핀과 연결

int data = 4;  //74HC595의 데이터핀과 연결

void setup(){

  pinMode(clock, OUTPUT);

  pinMode(latch, OUTPUT);

  pinMode(data, OUTPUT);

}

void loop(){

  int dataval[8]={0x66,0x99,0x00,0x00,0x7e,0x42,0x3c,0x00};

  int scanval[8] ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //줄

  for(int i = 0; i<8; i++){

     digitalWrite(latch, LOW);   //래치를 내리고

     shiftOut(data,clock,LSBFIRST, scanval[i]); //줄 선택

     shiftOut(data,clock,LSBFIRST, dataval[i]); // 선택된 줄에 LED신호

                                                                 // 74hc595에 총scanval과 dataval 16bit를 보내면

                                                          //8bit는 Q7'핀을 통해 다음 74hc595 data핀으로 밀어낸다.

     digitalWrite(latch, HIGH);   //래치를 올린다.

     delay(1);

    }

    digitalWrite(latch, LOW);   //래치를 내리고

    shiftOut(data,clock,MSBFIRST, 0x00);

    shiftOut(data,clock,MSBFIRST, 0x00); //LED를 끄는 시간 필요

    digitalWrite(latch, HIGH);

    delay(1);

}

-------------------------------------------------------------------------------------------

작동 사진



움직이는 입모양을 표현하려면

미리 입모양 표정을 만들어 이차원 배열로 입력하여 출력한다.

스케치 소스

----------------------------------------------------------------

/* 도트매트릭스 움직이는 입모양*/

int clock = 2;  //74HC595의 클럭핀과 연결

int latch = 3;  //74HC595의 래치핀과 연결

int data = 4;  //74HC595의 데이터핀과 연결

void setup(){

  pinMode(clock, OUTPUT);

  pinMode(latch, OUTPUT);

  pinMode(data, OUTPUT);

}

void loop(){

  int dataval[7][8]={

    {0x66,0x99,0x00,0x00,0x3c,0x00,0x00,0x00},  //다문입

    {0x66,0x99,0x00,0x00,0x18,0x18,0x00,0x00},  //조금 벌린입

    {0x66,0x99,0x00,0x00,0x3c,0x18,0x00,0x00},

    {0x66,0x99,0x00,0x00,0x3c,0x24,0x18,0x00}, 

    {0x66,0x99,0x00,0x00,0x7e,0x24,0x18,0x00},

    {0x66,0x99,0x00,0x00,0x7e,0x42,0x3c,0x00},

    {0x66,0x99,0x00,0x00,0x7e,0x42,0x66,0x3c}};  //크게 벌린입

  int scanval[8] ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

  for(int j=0; j<7;j++){

    for(int i = 0; i<8; i++){

      digitalWrite(latch, LOW);  

      shiftOut(data,clock,LSBFIRST, scanval[i]);

      shiftOut(data,clock,LSBFIRST, dataval[j][i]);

      digitalWrite(latch, HIGH);  

      delay(1);

     }

     digitalWrite(latch, LOW);  

     shiftOut(data,clock,MSBFIRST, 0x00);

     shiftOut(data,clock,MSBFIRST, 0x00);

     digitalWrite(latch, HIGH);

     delay(30);

  }

}

-------------------------------------------------------------------------

작동 영상