[아두이노/Arduino] PWM 도트 매트릭스 제어하여 전광판 만들기

2019. 5. 6. 22:09학교 수업 정리/Micom

반응형

RTOS 시간에 리모콘 - LCD - key_matrix에 이어 dot_matrix를 제어해보았다.

 

 

 

키 매트릭스와 유사한 형태로 구성되어있으며,

 

도트 매트릭스 회로

 

col값과 row값을 조정하여 총 8x8 64개의 led를 제어할 수 있다.

 

핀은 총 16개가 필요하며 아두이노 핀을 거의 다 쓰면 제어할 수 있다.

 

핀 순서는 위 그림대로 뒤죽박죽이여서 잘 보고 꼽아야 하고, col값에 저항을 연결한 후 전류를 넣어야 한다.

 

 

 

 

 

 

 

일단, 

흔한 셋업

 기본적으로 핀모드를 설정해준다.

 

 

그리고 나서 

 

 

 

흔한 PWM (per변수는 unsigned long 전역 변수이다.)

 

 

위의 2차원 배열인 b에다가 16진 코드로 각각 도트 매트릭스에 1~9의 모양을 띄게 하는 led를 켜놓도록 구성되어 있다.

 

16진 코드를 해석하는 for문과 총 16진코드 8개로 구성되어 있으니 그 for문을 8번 반복하는 for문으로 이루어 진다.

 

밑의 for문은 초기화 하는 코드이다.

 

맨 밑 z변수는 나중그림에서 유용하게 쓰인다

 

 

 

pwm안의 타이머 역할

 

 

z는 방금 pwm에서 1밀리세크 마다 올라가고, 이 if문은 z가 100의 배수 마다 움직이니 0.1초마다 움직이는 셈이다.

 

이렇게 활용하면 굳이 두개의 pwm을 만들지 않아도 된다.

 

분명 더 좋은 방법이 있을 것 같지만 아직 학생인 내 머리로는 이정도 해답이 최선이였다...

 

맨위의 for는 배열을 쉬프트하여 led의 배열을 한칸 미루어 마치 전광판이 옆으로 움직이는 듯한 표현을 해준다.

 

k가 다 움직이면 숫자를 바꾸고 배열을 초기값으로 바꿔준다. 그이유는 한번하고 다 초기화 되기 때문이다.

 

숫자가 모두 완료되면 다시 0으로 바꾸고 초기값으로 바꾸어주어 다시 작동하게 초기화시킨다.

 

// COL 10~17
// ROW 2~9
char a = 0x0F;
int k,z,m,s;
char b[10][8] = {
              {0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38},
              {0x00,0x10,0x30,0x50,0x10,0x10,0x10,0x7c},
              {0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7c},
              {0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38},
              {0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08},
              {0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38},
              {0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38},
              {0x00,0x7c,0x04,0x08,0x10,0x20,0x20,0x20},
              {0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},
              {0x00,0x38,0x44,0x44,0x3c,0x04,0x44,0x38}
              };
char b2[10][8] = {
              {0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38},
              {0x00,0x10,0x30,0x50,0x10,0x10,0x10,0x7c},
              {0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7c},
              {0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38},
              {0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08},
              {0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38},
              {0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38},
              {0x00,0x7c,0x04,0x08,0x10,0x20,0x20,0x20},
              {0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},
              {0x00,0x38,0x44,0x44,0x3c,0x04,0x44,0x38}
              };

unsigned long per;

void setup() {
  for(int i=2;i<18;i++)
  {
    pinMode(i,OUTPUT);
  }
}

void loop() {
  unsigned long cur = micros();
  if(cur-per > 1000){
    per=cur;
    for(int j=0;j<8;j++){
        digitalWrite(j+2,1);
        for(int i=0;i<8;i++)
        { 
          if(b[m][j]&(0x80 >> i)) digitalWrite(i+10,0);
          else digitalWrite(i+10,1);
        }
        for(int i=0;i<8;i++)
        {
          digitalWrite(i+10,1);
        }
        digitalWrite(j+2,0);
      }
    z++;
    if(z%100==0)
    {
      for(int i=0;i<8;i++){
        b[m][i] >>=1;
      }
      k++;
      if(k==8)
      {
        m++;
        if(m==10) {
          m=0;
          for(int i=0;i<10;i++)
            for(int j=0;j<8;j++)
              b[i][j]=b2[i][j];
        }
        k=0;
      }
    }
  }
}

백업용 코드

 

 

작동 영상

 중형 브레드보드에서는 핀 꼽을 자리가 없어 저렇게 이중연결을 해야 자리가 생긴다.

반응형