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

이전글 도트매트릭스(dot matrix) 제어 1: http://eskelt.tistory.com/30

도트매트릭스의 제어를 통해

센서의 입력을 받아 도트매트릭스에 표현해보자

도트매트릭스에 얼굴을 표현하고 마치 말하는 것같은 모습을...

즉 sound센서의 입력을 받아

센서값에 따른 얼굴모양이 바뀌도록하여

입을 움직이는 것 처럼 표현해보자.

기본적인 작동은 이전글을 참고하자.

일단 여러가지 얼굴모양을 만들어 배열하고

간단한 수식으로 센서값에 따라 얼굴모양을 선택할 수 있도록 한다.

스케치 소스

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

/* 말하는 매트릭스*/

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

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

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

int a;

int dataval[6][8]={

  {0x66,0x99,0x00,0x00,0x00,0x00,0x00,0x00},

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

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

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

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

  {0x66,0x99,0x00,0x00,0x7e,0x42,0x42,0x3c}};    //6개의 입모양이 다른 얼굴 

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

void setup(){

  pinMode(clock, OUTPUT);

  pinMode(latch, OUTPUT);

  pinMode(data, OUTPUT);

  Serial.begin(9600);

}

void loop(){

  a = analogRead(A0)/150;   // 사운드 센서의 입력을 받아 값을 6단계로 표현하도록 계산

  if(a>5){a=5;}                    // 총 6개의 모습이므로 5를 넘지 않도록 함.

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

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

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

    shiftOut(data,clock,LSBFIRST, dataval[a][i]);         // 센서에서 계산된 a값을 통해 입모양 선택

    digitalWrite(latch, HIGH);   //래치를 올린다. 74HC595에서 데이터를  출력함

    delay(2);

    }

digitalWrite(latch, LOW);  

shiftOut(data,clock,MSBFIRST, 0x00); // 매트릭스를 끄는 시간을 줌

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

digitalWrite(latch, HIGH);

delay(3);

}

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

작동영상

 

 

참조 : http://cafe.naver.com/arduinostory/6869  (카페 : 아두이노 스토리)

'아두이노_프로세싱 > 아두이노' 카테고리의 다른 글

xbee 통신 + 기울기센서로 모터제어  (3) 2012.08.29
아두이노 포토인터럽터  (0) 2012.08.24
도트매트릭스(dot matrix) 제어 1  (3) 2012.06.27
아두이노간 xbee통신  (4) 2012.06.27
xbee 통신  (0) 2012.06.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);

  }

}

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

작동 영상



+ Recent posts