상세 컨텐츠

본문 제목

아두이노 - 찰리플렉싱 (Charlie Plexing)

프로그래밍/Arduino & IoT

by ryujt 2015. 5. 10. 13:00

본문

찰리 플랙싱을 이용하여 만든 LED Show(?) 입니다.  처음에는 한 쪽으로만 흐르게 했다가, 양 방향을 왕복하는 형태로 바꾼 이후 마지막에는 볼이 바닥에 팅기는 모습을 표현했습니다. 





[그림 1] 납땜하여 만든 LED Board



[도표 1] 배선 상태



1년 전 쯤 아이와 함게 각 핀마다 LED를 연결하여 간단한 LED Display를 만든 적이 있었습니다.  그리고, 얼마 전 멀티 플랙싱으로 2개 짜리 주사위를 만든 적이 있습니다.  (4 * 4 멀티 플랙싱)  16개의 LED를 8개의 선으로 제어 할 수 있다는 것에 상당히 흥미를 가지길래, 선 4개로 12개의 LED를 다룰 수 있는 방법이 있다고 알려주고 스스로 방법을 찾아가도록 유도하였습니다.


우선 아래와 같이 선의 개수마다 최대 다룰 수 있는 LED 개수를 힌트로 알려주었습니다.

  • 선 2 개 --> LED 2 개
  • 선 3 개 --> LED 6 개
  • 선 4 개 --> LED 12 개
  • 선 5 개 --> LED 20 개

"선 6개를 이용하면 LED 몇 개를 다룰 수 있을 까?"  오!!  규칙을 찾아냅니다.  "(n-1) * n"  그래서, 혹시나 찰리 플렉싱도 스스로 해결하나 계속 힌트를 주면서 유도해봤지만 무리였습니다. ^^;;


우선 아두이노 코딩을 하기 이전에, 각 핀에 건전지를 연결해서 +와 -를 바꿔가며 [도표 1]을 완성해 나갔습니다.  (LED를 직접 연결하면 타 버릴 수 있다는 것은 아시죠?  330 옴 저항을 각 핀에 연결하여 사용했습니다)


예를 들어 LED 1번의 불을 켜려면 Pin 2번과 3번에 각각 +와 - 전극을 이어주면 됩니다.  LED 2번은 전극을 반대로 연결하여 주면 됩니다.  이때, Pin 1과 4번은 LOW나 HIGH 상태이면 안됩니다.  따라서, 소스를 보시면, 안쓰는 핀은 INPUT으로 지정해주고 있습니다.


소스 코드도 처음부터 모양새를 갖추면 시작한 것은 아니지만, 최종 상태는 [소스 1]과 같습니다.  비트 연산을 응용 할 까 했지만, 아이가 따라오지 못할 것 같아서 단순한 형태를 취했습니다.  모든 LED를 동시에 켠다던가 선별적인 LED들을 동시에 켜는 등의 다양한 시도를 하면서 소스를 조금씩 다듬어 준 결과입니다.



[소스 1]

int pin_1 = 2;
int pin_2 = 3;
int pin_3 = 4;
int pin_4 = 5;

void setup() 
{
}

void loop() 
{
  int v = 0;
  for (int i=1; i < 12; i++) {
    light_up(i); 
    v = v + 15;
    delay(200 - v);
  }

  for (int i=12; i > 1; i--) {
    light_up(i);
    v = v - 15;
    delay(200 - v);
  }
}

void ch_flex(int mode1, int mode2, int mode3, int mode4, int w1, int w2, int w3, int w4)
{
  pinMode(pin_1, mode1);
  pinMode(pin_2, mode2);
  pinMode(pin_3, mode3);
  pinMode(pin_4, mode4);

  digitalWrite(pin_1, w1);
  digitalWrite(pin_2, w2);
  digitalWrite(pin_3, w3);
  digitalWrite(pin_4, w4);
}

void light_up(int no)
{
  switch(no) {
    case 0: ch_flex(INPUT, INPUT, INPUT, INPUT, 0, 0, 0, 0); break;
    case 1: ch_flex(INPUT, OUTPUT, OUTPUT, INPUT, 0, 1, 0, 0); break;
    case 2: ch_flex(INPUT, OUTPUT, OUTPUT, INPUT, 0, 0, 1, 0); break;
    case 3: ch_flex(OUTPUT, INPUT, OUTPUT, INPUT, 1, 0, 0, 0); break;
    case 4: ch_flex(OUTPUT, INPUT, OUTPUT, INPUT, 0, 0, 1, 0); break;
    case 5: ch_flex(INPUT, OUTPUT, INPUT, OUTPUT, 0, 1, 0, 0); break;
    case 6: ch_flex(INPUT, OUTPUT, INPUT, OUTPUT, 0, 0, 0, 1); break;
    case 7: ch_flex(OUTPUT, INPUT, INPUT, OUTPUT, 1, 0, 0, 0); break;
    case 8: ch_flex(OUTPUT, INPUT, INPUT, OUTPUT, 0, 0, 0, 1); break;
    case 9: ch_flex(INPUT, INPUT, OUTPUT, OUTPUT, 0, 0, 0, 1); break;
    case 10: ch_flex(INPUT, INPUT, OUTPUT, OUTPUT, 0, 0, 1, 0); break;
    case 11: ch_flex(OUTPUT, OUTPUT, INPUT, INPUT, 0, 1, 0, 0); break;
    case 12: ch_flex(OUTPUT, OUTPUT, INPUT, INPUT, 1, 0, 0, 0); break;
  }
}


관련글 더보기