2장. LED 켜기 응용(여러개 LED 켜기)

来自Microduino Wikipedia
跳转至: 导航搜索
Language English

목적

여러 개의 LED 제어하는 방법을 알아본다.

부품

Lesson2All.jpg

회로도

  • LED의 캐소드(-)측은 마이크로두이노의 GND에 연결하고, 애노드는 마이크로두이노의 D3 ~ D10 I/O 핀에 연결하는 방법과
  • LED의 캐소드(-)측은 마이크로두이노의 D3 ~ D10의 디지털 I/O 핀에 연결하고, 애노드는 마이크로두이노의 VCC에 연결하는 두가지 방법이 있다.

이것은 공통 캐소드와 공통 애노드의 개념으로 닉시관이나 7 Segment에 적용된다.

Schematic2.jpg

소스

  • I/O 출력에 직접 연결하기
void setup() {                
  for(int i=3;i<11;i++)           // D3 ~ D10 I/O 출력을 디지털 I/O 포트로 설정하기 위한 반복문   
  pinMode(i, OUTPUT);             // I/O 포트를 출력으로 설정하는 함수
}

void loop() {
  for(int i=3;i<11;i++)
  {
    digitalWrite(i, HIGH);        // D3 ~ D10 디지털 I/O 출력을 HIGH로 설정
    delay(50);                    // 시간지연 50ms  
    digitalWrite(i, LOW);         // D3 ~ D10 디지털 I/O 출력을 LOW로 설정
    delay(50);                    // 시간지연 50ms    
  }
}
  • 16비트 배열를 이용하여, 출력데이터를 각 I/O 포트를 쉬프트 시킴으로 여러가지 멋있는 모양을 만들수 있다.
/*===============================================
0x(High-low:10,9,8,7)(High-low:6,5,4,3)
Example
0x81:10000001
10번핀,9번핀,8번핀,7번핀,6번핀,5번핀,4번핀,3번핀
   ↓    ↓    ↓    ↓    ↓    ↓    ↓    ↓
   1     0     0     0     0     0     0     1
공통 캐소드 방식으로 연결한 형태이므로 LED의 모든 캐소드는 같이 연결한다. 출력이 1일때 ON, 0일때 OFF가 된다. 
=================================================*/
long  data[]=
{
  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,          //왼쪽에서 오른쪽으로 하나씩 켜진후 꺼진다.
  0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,          //오른쪽에서 왼쪽으로 하나씩 켜진후 꺼진다.
  0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,          //양쪽에서 중간으로 중간에서 양쪽으로 켜진후 꺼진다.
  0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,          //왼쪽에서 오른쪽으로 하나씩 켜진다.
  0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,          //오른쪽에서 왼쪽으로 꺼진다.
};

void setup() 
{                
  for(int x=3;x<11;x++) 
  {
    pinMode(x,OUTPUT);                              // I/O핀을 출력으로 설정
  }  
}


void loop() 
{
  for(int x=0;x<40;x++)                            // 다른 LED 패턴을 읽는다.
  {
    leddisplay(data[x]);                           // leddisplay() 함수를 호출한다.  
    delay(200);                                    // 각 상태마다 200ms 시간지연
  }
  leddisplay(0x00);                                // 한 싸이클이 완료되면 모든 LED를 끈다.
  delay(200);
}

void leddisplay(int num)                           // 포트와 LED를 맵핑하는 함수
{
/*====================================================================
(num >> x)에서 x는 16진수 num을 x 비트만큼 오른쪽 쉬프트하라는 표현이다. 0 is the lowest bit, bit 7 is the highest bit. 
0은 최하위비트이고 7은 최상위비트이다. 쉬프트된 데이터와 0x01과 AND 연산하여 0 또는 1의 임의의 값을 얻을 수 있다. 얻어진 값을
마이크로두이노의 I/O 포트에 출력한다.
 ====================================================================*/
  digitalWrite(3, ((num>>0)&0x01));                // num값을 0 만큼 오른쪽 쉬프트하고 0x01과 AND 연산해서 얻어진 값을 I/O 포트 D3의 값으로 출력 
  digitalWrite(4, ((num>>1)&0x01));                // num값을 1 만큼 오른쪽 쉬프트하고 0x01과 AND 연산해서 얻어진 값을 I/O 포트 D4의 값으로 출력
  digitalWrite(5, ((num>>2)&0x01));
  digitalWrite(6, ((num>>3)&0x01));
  digitalWrite(7, ((num>>4)&0x01));
  digitalWrite(8, ((num>>5)&0x01));
  digitalWrite(9, ((num>>6)&0x01));
  digitalWrite(10,((num>>7)&0x01));
}

이 예제는 LED를 켜기위해 할당된 I/O 포트와 16진수 값을 맵핑하여 다양한 효과를 낼 수 있음을 보여준다. 0x18은 바이너리값으로 00011000으로 변환되며 여기서 '0'은 LED가 OFF되고, '1'은 LED가 ON 된다. 이것을 이용하면 많은 재미있는 효과를 만들어 낼수 있다.


결론

  • 프로그램 1

왼쪽에서 오른쪽으로 각각의 LED가 켜지고 꺼진다.

  • 프로그램 2

5가지의 패턴 효과를 구현할 수 있다. 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로, 가장자리에서 중앙으로 중앙에서 가장자리고, 왼쪽에서 오른쪽으로 켜지고 꺼지는 효과를 나타낼 수 있다.


비디오