달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

부품:

charlieplexing 모듈(330옴 저항 4개, LED 12개)

 

부품설명:

앞서 했던 8*8 도트 매트릭스는 이미 만들어진 회로를 산 것이였습니다.

이번 charlieplexing 모듈은 만들어 보겠습니다. 

이 방법으로 핀4개로 LED 12를 제어할 수 있습니다.  

330옴 저항과 4개와 LED 12개를 위와 같이 연결합니다.

charlieplexing 회로의 원리는

LED는 오직 애노드가 캐소드보다 양극일 때만 켜진다는 사실입니다. 

즉, LED3은 오직!! 핀0이 HIGH이고 핀2가 LOW일만 켜지잖아요? 

이 방법을 사용하면  

5개의 핀으로 5*4=20개의 LED 

6개의 핀으로 6*5=30개의 LED 

7개의 핀으로 7*6=42개의 LED를 제어할 수 있습니다. 

 

회로: 

아두이노 디지털 핀 2,3,4,5에 연결합니다.

우리는 여기서 0~5의 LED를 켜보겠습니다.

 

코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const int pins[] = {2, 3, 4,5};
const int pairs[][2]={{1,0},{2,0},{2,1},{3,0},{3,1},{3,2}};
int numberOfPins = sizeof(pins)/sizeof(pins[0]);
int sizeOfLeds= numberOfPins * (numberOfPins-1);
 
void setup()
{
}
 
void loop()
{
  //light LED useing multipexing one by one in sequence
  multiplexing(6);   
}
 
//repeat on instant
void multiplexing(byte Level)
{
  for(int i=0 ; i<sizeOfLeds ; i++)
   {
    if(i<Level)
    setLed(i, HIGH);
    else
    setLed(i, LOW);
    
    delayMicroseconds(300);
    //delay(300);
  
    setLed(i, LOW);  
   }
}
  
void setLed(int led, boolean state)
{
 //check the OUTPUT pins
  int indexA = pairs[led/2][0];
  int indexB = pairs[led/2][1];
  int pinA = pins[indexA];
  int pinB = pins[indexB];
 
  for(int i=0; i < numberOfPins ; i++) 
  {
    //make rest of pins INPUT mode
   if(state == 1)
   if(pins[i] != pinA && pins[i] != pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);}
    //make the pins INPUT mode 
   if(state == 0)
   if(pins[i] == pinA || pins[i] == pinB)
    {pinMode(pins[i], INPUT);
     digitalWrite(pins[i], LOW);
     return;}
  }
 
 //if even, right way. if odd, changed.    
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  if(led % 2 == 0)
  {digitalWrite(pinA, HIGH);
   digitalWrite(pinB, LOW);}
   else
  {digitalWrite(pinA, LOW);
   digitalWrite(pinB, HIGH);}
}

 

 

코드설명:

우선, charliepexing 회로를 제어하는 것을 이해하기 위해서

가장 아래에 있는 setLed() 함수부터 설명하겠습니다. 

setLed(LED번호, HIGH)는 LED를 켜고, setLed(LED번호, LOW)는 LED를 끕니다. 

setLed(LED번호, HIGH)부터 설명할게요~ 

각 LED를 켜기위해서는 핀의 상태는 다음과 같아야 합니다. 

 LED

 핀

 0

10 

11 

 1

 L

 H

0

0

L

I

H

H

I

I

L

I

H

0

0

0

0

0

0

0

0

0

1

0

0

I

H

I

L

0

0

0

0

0

0

0

0

0

0

1

0

L

I

I

H

0

0

0

0

0

0

0

0

0

0

0

1

H

I

I

L

그래서 맨먼저 LED 번호를 입력받으면,

OUTPUT핀을 체크합니다. 여기서 OUTPUT은 HIGH와 LOW를 설정하는 것이죠~

그리고 변수 pinA와 pinB에 아두이노 핀 번호를 저장합니다.

예를 들어, LED0을 켜려면,

OUTPUT핀은 1과 0이고,

pinA와 pinB에 아두이노 핀 번호 2와 3을 저장합니다.

다음으로, HIGH이니까 (state==1)인 경우,

OUTPUT핀이 아닌 핀들은 INPUT모드로 설정합니다.

그래서 다른 핀들이 켜지지 않도록 합니다.

예를 들어, LED0인 경우 2,3번 핀은 I모드가 되는 거죠.

다음으로, LED번호가 짝수일 경우에는 pinA를 H로 pinB를 L로 설정하고,

LED번호가 홀수일 경우에는 pinA를 L로 pinB를 H로 설정합니다.

예를 들어, LED0인 경우 1번 핀이 H, 2번 핀이 L로 설정됩니다.

이렇게 해서 LED번호를 입력하면 분홍색 표와 같이 핀이 설정 되는 것입니다.

setLed(LED번호, LOW)는 중간에 if(state == 0)을 보세요. 

이 경우에는, 위에서 체크하여 pinA,B에 저장된 핀들이  

INPUT모드로 설정되어 입력된 LED가 꺼지게 되죠. 

그리고 return; 때문에 함수가 종료되죠. 

이제 charlieplexing 제어를 이해하셨나요?  

결국 켜고자 하는 LED를 입력받아서 분홍색 표와 같이 핀들을 설정하는 것이죠^^! 

 

 

그럼, 코드의 처음부터 설명하겠습니다. 

loop()함수를 보세요.  

multiplexing()함수에 6이 입력되에 있는 데, 이것은 6개의 LED를 켠다는 것입니다. 

그럼,  multiplexing()함수를 이해해 보겠습니다. 

백문이 분허일견이죠?  

delayMicroseconds(300);  //delayMicroseconds(300); 

 //delay(300);을                delay(300);                   으로 바꾸어 업로드 해봅시다 

그럼 앞서와 같이 LED가하나하나 씩 순서대로 켜집니다. 

이것을 setLed()함수로 구현한 것이죠! 

이렇게 하여 우리가 보기에는 동시에 켜진것으로 인식되는 것이죠!     


:
Posted by youjin.A