도트매트릭스(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);
}
}
-------------------------------------------------------------------------
작동 영상
'아두이노_프로세싱 > 아두이노' 카테고리의 다른 글
아두이노 포토인터럽터 (0) | 2012.08.24 |
---|---|
도트매트릭스(dot matrix) 제어 2 (0) | 2012.06.27 |
아두이노간 xbee통신 (4) | 2012.06.27 |
xbee 통신 (0) | 2012.06.27 |
스마트폰 + 블루투스 + 아두이노자동차 배선 (4) | 2012.06.27 |