7. 아두이노 RGB LED (PWM)

 

1. PWM 

아두이노에는 주변 장치와 디지털 및 아날로그 신호를 통해서 정보를 주고 받습니다.

디지털 입출력을 위해서는 DIGITAL 0~13번 핀을 사용하고 ( ~ ) 표시가 있는 핀들은 PWM신호를 출력 합니다. 아날로그 입력을 위해서는 ANALOG A0 ~ A5까지 6개의 아날로그 핀을 사용하며 아날로그 입력은 ADC(Analog Digital Converter)를 거쳐서 디지털로 변환되고 그 정보가 마이크로 컨트롤러로 전달됩니다. 아날로그핀의 출력은 지원하지 않고 있습니다.

 

 

 

아두이노에서 디지털 핀은 0V(LOW) 또는 5V(HIGH)를 내보내는 기능을 가진 핀과 전압을 0V ~ 5V사이의 값을 주기적으로 변화시켜 펄스를 만들어 내보내는 PWM(Puls Width Modulation)핀으로 이루어져 있습니다.

 

아두이노 우노는 PWM신호를 내보내기 위한 펄스의 주기가 대략 0.002초(500Hz) 입니다. 다시말해서 0.002초 주기로 1초에 500번 전기를 연결했다 끊었다를 반복한다는 것인데요, 이러한 펄스 변환을 이용하면 평균 전압이 낮아지는 효과가 있어서 아날로그 방식처럼 0V ~ 5V 사이의 원하는 값을 내보낼 수 있습니다.

 

정리하자면 아날로그 값을 읽을 때는 ANALOG IN(A0 ~ A5)핀을 이용하면 되나 출력을 할 때는 아날로그 핀으로는 불가능 하고 디지털 PWM핀에서 펄스 변조를 통해서 아날로그 값을 만들 출력할 수 있습니다.

PWM핀을 통한 아날로그 출력은 0~255까지 2의 8승만큼 256단계가 가능하며 아날로그 입력은 0~1023까지 2의 10승만큼 1024단계의 아날로그 입력을 받을 수 있습니다.

 


 

 

예제1

간단하게 3색 LED의 RGB값을 0 ~ 255까지의 랜덤값을 적용해서 1초에 한번씩 보여질 수 있도록 해 보았습니다.

업로드 후 실행결과가 같다 하더라도 스케치가 다르게 짜여질 수 있습니다. 비록 지금은 매우 단순한 코드 진행이지만, 다양한 유형의 코드 작성을 조금씩 눈에 익히다 보면 나중에 좀더 복잡한 프로젝트를 할 때 도움이 될 수 있을듯 합니다.

 

void setup(){

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

}


void loop(){

 analogWrite(11, random(0,255));

analogWrite(10, random(0,255));

analogWrite(9, random(0,255));

 delay(1000);


 

예제 1과 같은 동작을 하지만 핀 번호를 변수에 넣어서 적용한 코드입니다.

 

int redPin = 11;

int greenPin = 10;

int bluePin = 9;

 

void setup(){

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

}

 

void loop(){

 analogWrite(redPin, random(0,255));

analogWrite(greenPin, random(0,255));

analogWrite(bluePin, random(0,255));

 delay(1000);

 

예제 1과 같은 동작을 하지만 핀 번호를 배열에 넣어서 적용한 코드 입니다.


int ledPin [] = {9, 10, 11};


void setup(){

for (int i=0; i

pinMode(ledPin[i], OUTPUT);

    }

}

 

void loop(){

 analogWrite(ledPin[0], random(0,255));

analogWrite(ledPin[1], random(0,255));

analogWrite(ledPin[2], random(0,255));

 delay(1000);

}

 

예제2 

빨강, 파랑, 녹색이 각각 천천히 온, 오프 되도록 해 보았습니다.

 

int ledPin[] = {9, 10, 11};

int currentNum = 0;


void setup() {

  for (int i = 0; i < sizeof(ledPin); i++) {

    pinMode(ledPin[i], OUTPUT);

   }

}


void loop() {

  for (int i = 0; i < 256; i++) {

    analogWrite(ledPin[currentNum], i);

    delay (5);

  }


  for (int i = 255; i >= 0; i--) {

    analogWrite(ledPin[currentNum], i);

    delay (5);

  }


  if (currentNum == 2) {

    currentNum = 0;

  } else {

    currentNum++;

  }

}


예제3 

빨강, 파랑, 녹색이 섞인 임의의 색이 천천히 온/ 오프 될 수 있도록 스케치해 보았습니다.

 

int ledPin[] = {9, 10, 11};


void setup() {

for (int i=0;i

    pinMode(ledPin[i], OUTPUT);

  }

}


void loop() {

  int rand[] = { random(0, 255), random(0,255), random(0,255) };

  

  for (int i=0; i<=255; i++) {

    for (int j=0; j<3; j++) {

      if (i <= rand[j]) {

         analogWrite(ledPin[j], i);

      }

      delay (5);

    }

  }

  

for (int i=255; i>=0; i--) {

    for (int j=0; j<3; j++) {

      if (i <= rand[j]) {

         analogWrite(ledPin[j], i);

      }

      delay (5);

    }

  }

 }

조금만 보완하면 오늘 공부한 내용으로 이런거 만들어 볼 수 있지 않을까요? ^^

 

 

수정해야 할 부분이나 더 좋은 아이디어, 또는 질문이 있다면 언제든 댓글 달아주시기 바랍니다.

감사합니다. ^^

 

  •  2,794
  •  0
  •  0

[ 다음글 ] 8. 그밖의 LED

[ 이전글 ] 6. 아두이노 with LED


댓글을 남겨 주세요.