본문 바로가기

Arduino/[2] Arduino Module

[Arduino Module] #6. 도트 매트릭스

728x90
반응형

LED 도트 매트릭스

LED 도트 매트릭스는 거의 모든 것을 표시하는데 사용한다. 예를 들어 글자나 그림을 표현할 수 있으며 일정한 순서의 그림을 반복하여 애니메이션을 만들 수 있다.

 

8x8 LED 도트 매트릭스는 64개의 도트 또는 픽셀로 구성된다. 각각의 도트마다 하나의 LED가 있으며 이 LED들은 전체 16개의 핀에 연결된다. 다음 그림은 도트 매트릭스의 회로도이다.

도트 매트릭스 회로도

8x8 LED 도트 매트릭스는 8개의 열과 8개의 행으로 구성되며, 열 단위로 제어를 하거나 행 단위로 제어를 해야한다.

 

예를 들어 R1과 C1~C8을 한 단위로 제어를 해야하며, R1을 제어할때 R2~R8에 해당하는 열을 켜지지 않도록 제어해야한다. 그러면서 R1~R8이 동시에 켜지는 것 처럼 보여야하므로 높은 주파수로 각 열과 행을 제어한다.

 

8x8 LED 도트 매트릭스는 7 세그먼트와 마찬가지로 공통 음극과 공통 양극이 존재하지만 일반적으로 공통 음극을 사용한다.

 

공통 8x8 LED 도트 매트릭스

공통 음극 8x8 LED 도트 매트릭스에서 각각의 가로줄은 해당 가로 줄을 GND애 연결한 후 , 각각의 세로 줄을 VCC에 연결하여 키거나 GND에 연결하여 끈다. 또는 각각의 세로줄을 이용해 제어하기도 한다.

 

도트 매트릭스의 도면

위의 사진처럼 해당 핀에 연결한다. 이때 옴 표시가 있는 핀은 저항과 꼭 연결하도록 한다.

 

8x8 LED 도트 매트릭스 예제: 하트 출력

enum{R5=1,R7,C2,C3,R8,C5,R6,R3,R1,C4,C6,R4,C1,R2,C7,C8}; // 각 위치에 할당값 할당
const unsigned int P[17]={
  -1,10,11,12,13,14,15,16,17,2,3,4,5,6,7,8,9}; //순서대로 각 할당값 할당


const unsigned int R[9]={-1,R1,R2,R3,R4,R5,R6,R7,R8}; //열
const unsigned int C[9]={-1,C1,C2,C3,C4,C5,C6,C7,C8}; //행

unsigned int H[9][9]={
  
  {-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,1,0,0,1,0,0},
  {-1,0,1,1,1,1,1,1,0},
  {-1,0,0,1,1,1,1,0,0},
  {-1,0,0,0,1,1,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  
};

void DL(){

  for( int k=1;k<=8;k++){
  digitalWrite(P[R[k]],HIGH);
  digitalWrite(P[C[k]],HIGH);
 }
}//밑에가 8 위에가 1

void setup() {

 for( int n=1;n<=8;n++){
  pinMode(P[R[n]],OUTPUT);
  pinMode(P[C[n]],OUTPUT);
 }

 DL();
}

void loop() {

for(int n=1;n<=8;n++){

  if(n>1) digitalWrite(P[R[n-1]],HIGH);
  if(n==1) digitalWrite(P[R[8]],HIGH);

  for(int m=1;m<=8;m++){

    if(H[n][m]==1)
        digitalWrite(P[C[m]],HIGH);
    else digitalWrite(P[C[m]],LOW);    
  }

 for(int m=1;m<=8;m++){
  if(H[n][m]==1){
  digitalWrite(P[R[n]],LOW);
    
    break;
   
 }
}
  delay(1);
}
}

상수 선언

enum{R5=1,R7,C2,C3,R8,C5,R6,R3,R1,C4,C6,R4,C1,R2,C7,C8}; // 각 위치에 할당값 할당
const unsigned int P[17]={-1,10,11,12,13,14,15,16,17,2,3,4,5,6,7,8,9}; //순서대로 각 할당값 할당


const unsigned int R[9]={-1,R1,R2,R3,R4,R5,R6,R7,R8}; //열
const unsigned int C[9]={-1,C1,C2,C3,C4,C5,C6,C7,C8}; //행

unsigned int H[9][9]={
  
  {-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,1,0,0,1,0,0},
  {-1,0,1,1,1,1,1,1,0},
  {-1,0,0,1,1,1,1,0,0},
  {-1,0,0,0,1,1,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  
};

각 도트매트릭스에 할당값을 enum을 통해 할당한다.

이때 enum이란 R1을 1로 설정하고 뒤의 이름은 하나씩 증가하는 수로 정의한다는 의미이다.

R5=1,R7,C2,C3,R8,C5,R6,R3,R1,C4,C6,R4,C1,R2,C7,C8}; // 각 위치에 할당값 할당

8x8 LED 도트 매트릭스는 좌측하단에서 우측하단까지 1~8, 우측 상단에서 좌측 상단까지 9~16이므로 할당값을 할당할 때 

-1,10,11,12,13,14,15,16,17,2,3,4,5,6,7,8,9

과 같은 순서를 따른다. 이때 -1은 인간이 사용하는 "첫번째 = 1"의 의미를 맞추기 위함이다. (C언어에서 첫번째는 0이다.)

unsigned int H[9][9]={
  
  {-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,1,0,0,1,0,0},
  {-1,0,1,1,1,1,1,1,0},
  {-1,0,0,1,1,1,1,0,0},
  {-1,0,0,0,1,1,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  {-1,0,0,0,0,0,0,0,0},
  
};

위 코드는 하트 모양을 표시한 배열로써, 1부분이 LED가 켜질 행이다. 값이 1인 행을 순식간에 HIGH로 만들면 우리 눈은 하트 모양으로 인식하게된다. 이는 조건연산자를 이용하여 1이면 HIGH, 0이면 LOW값을 할당하는 방식을 사용한다.

void DL(){

  for( int k=1;k<=8;k++){
  digitalWrite(P[R[k]],HIGH);
  digitalWrite(P[C[k]],HIGH);
 }
}//밑에가 8 위에가 1

모든 LED을 끄는 함수이다. 반복문을 이용하여 모든 LED를 끄게된다.

 

setup()

void setup() {

 for( int n=1;n<=8;n++){
  pinMode(P[R[n]],OUTPUT);
  pinMode(P[C[n]],OUTPUT);
 }

 DL();
}
  • 2중 반복문을 이용하여 열과 행의 입출력을 선언한다.

loop()

void loop() {

for(int n=1;n<=8;n++){

  if(n>1) digitalWrite(P[R[n-1]],HIGH);
  if(n==1) digitalWrite(P[R[8]],HIGH);

  for(int m=1;m<=8;m++){

    if(H[n][m]==1)
        digitalWrite(P[C[m]],HIGH);
    else digitalWrite(P[C[m]],LOW);    
  }

 for(int m=1;m<=8;m++){
  if(H[n][m]==1){
  digitalWrite(P[R[n]],LOW);
    
    break;
   
 }
}
  delay(1);
}
}
728x90
반응형
댓글