도트매트릭스(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);

  }

}

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

작동 영상



아두이노간 xbee통신

프로그램 버전 : Arduino - 1.0

아두이노끼리 유선은 물론

xbee를 통해 무선통신이 가능하다.

한쪽 아두이노에서 센서 또는 스위치 등으로 신호를 받고

그신호를 다른 아두이노에서 받아 처리하여 출력하는 형식이다.

간단하게

우노에서 스위치를 누르면 숫자 5를 xbee를 통해 날리고

메가에서 숫자5를 받아 출력하는 식으로 구성해보면

우노의 배선

스위치 입력은 11번에 연결하고

xbee 쉴드 장착



우노의 스케치 소스

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

#include <SoftwareSerial.h>
SoftwareSerial xbeeS(2,3);   //xbee 통신을 위해 구성
void setup(){
  xbeeS.begin(9600);     //xbee 통신 시작
  pinMode(11,INPUT);    //11번을 스위치 입력
  pinMode(13,OUTPUT);
}
void loop(){
  if(digitalRead(11)==LOW){
    digitalWrite(13,HIGH);
    xbeeS.write(5);      //스위치 입력이 있으면 xbee에 5를 보냄
  }
  digitalWrite(13,LOW);
}

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

신호를 받을 메가의 배선



메가에서의 스케치 소스

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

int a;
void setup(){
  Serial.begin(9600);     //시리얼 통신 0번 pc와 통신
  Serial3.begin(9600);   //메가는 하드웨어적으로 시리얼 통신을 0~3번까지 제공하므로

//소프트웨어적으로 시리얼 통신을 구성할 필요 없다.

                                  // 통신할 통신장치를 1~3번에 연결하고 사용하면 된다.

                                  // SoftwareSerial을 구성하면 통신이 잘 안됨???
  pinMode(13,OUTPUT);
}
void loop(){
  if(Serial3.available()>0){
    a = Serial3.read();          //xbee의 값을 저장
    if(a==5){
       digitalWrite(13,HIGH);
       Serial.println(a);          // 값을 시리얼 모니터에 출력
       }
  }
  digitalWrite(13,LOW);
}

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

+ Recent posts