지난 포스트 RGB LED로 신호등 만들기에서 RGB LED를 사용해서 빨간색, 노란색, 초록색 불을 켜는 방법을 알아봤다. 그 중 특히 노란색 불은 빨간색과 초록색 불을 섞어서 만들었다. 이런 식으로 하면 빨간색, 노란색, 초록색 불을 각각 켜고 끄는 것으로 불끄는것 포함 총 8개의 색을 나타낼 수 있다. 하지만 이렇게 해서는 표현 할 수 있는 색이 너무 적다. 이번 포스트에서는 PWM을 이용해서 RGB LED로 여러가지 색깔을 표현하는 방법을 알아보자.


  우선 아래 사진처럼 지난 포스트에서 RGB LED를 연결하는거와 같이 저항과 LED와 GPIO핀을 연결한다. 지난 포스트에서는 파란색 불을 사용할 일이 없어서 연결하지 않아도 됐지만 이번에는 세개 모두 연결 한다.

PWM RGB LED


  LED로 여러가지 색을 나타내려면 기본적으로 LED의 밝기를 조절해야하는데 LED 밝기 조절은 전압을 변경하여 할 수 있다. 하지만 GPIO핀은 디지털인데, 즉, 끄고 켜는 두가지 외에는 방법이 없는데 어떻게 LED의 밝기를 조절 할 수 있을까? 이를 위해서는 PWM을 이해해야한다. PWM은 Pulse Width Modulation의 약자로 펄스 폭 변조라고 한다. PWM은 디지털 기기에서 아날로그 결과를 얻기 위한 테크닉으로, 전원인 on되는 시간을 펄스 폭이라고 하고, 펄스 폭을 조정함으로 on과 off사이의 전압을 흉내낼 수 있다. 이러한 on-off 패턴을 빠르게 반복하여 LED에 출력하면 LED의 밝기를 변경 할 수 있게 되는 것이다. 예를 들어 아래 그림과 같이 on이 지속 되는 시간, 즉, 펄스 폭을 조정하면, 위에서 아래로 갈 수록 밝은 LED 빛을 얻을 수 있다.

PWM


  WiringPi 라이브러리에서 PWM을 지원 한다. 다음은 WiringPi 라이브러리의 PWM 함수를 이용해서 LED의 색깔을 바꿔서 다양한 색을 표현하는 프로그램 코드이다. 

#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>

#define PIN_R 7
#define PIN_G 0
#define PIN_B 1

void setRGB(int r, int g, int b){
  softPwmWrite(PIN_R, 255-r);
  softPwmWrite(PIN_G, 255-g);
  softPwmWrite(PIN_B, 255-b);
}

int main (void)
{
  int i = 0, j = 0, k=0;
  printf("RGB LED Various Color");

  if (wiringPiSetup () == -1)
    return 1 ;

  pinMode (PIN_R, OUTPUT) ; //R
  pinMode (PIN_G, OUTPUT) ; //G
  pinMode (PIN_B, OUTPUT) ; //B

  softPwmCreate(PIN_R,0,255);
  softPwmCreate(PIN_G,0,255);
  softPwmCreate(PIN_B,0,255);

  for (i = 0; i <= 250; i=i+50){
    for (j = 0; j <= 250; j=j+50){
      for (k = 0; k <= 250; k=k+50){
        setRGB(i,j,k);
        delay(50);
        printf("R:%d G:%d B:%d\n", i, j, k);
      }
    }
  }

  setRGB(0,0,0);//clear LED
  delay(50);

  return 0 ;
}
  위 코드를 조금 살펴보자. 우선 3번째 줄을 보면 'softPwm.h' 헤더파일을 포함시키는데, 이는 WiringPi에서 지원하는 헤더파일로 PWM을 사용하기 위해서는 이 헤더파일이 필요하기 때문이다. 두번째로 27-29번째 줄을 보면, softPwmCreate 함수를 사용하는데 이 함수는 소프트웨어로 제어되는 PWM 핀을 만든다. 이 함수는 핀번호, 기본값, PWM 값의 범위 이렇게 세가지를 파라미터로 갖는다. 따라서 27번째 줄의 softPwmCreate(PIN_R,0,255) 는 7번 핀을 0과 255사이의 범위를 갖고 기본값을 0으로 하는 PWM 핀을 만든다. 마지막으로 9-13번째 줄은 LED에 불을 켜는 함수로 softPwmWrite를 이용해서 빨간색, 초록색, 파란색 불빛의 밝기를 조절하여 원하는 색깔의 빛을 만든다.

  프로그램을 컴파일하고 실행하면 아래 동영상과 같은 결과를 얻을 수 있는데, 컴파일 할 때 pthread 라이브러리도 포함시켜야 한다. 예를 들면 'gcc -o 3led_light 3led_light.c -lwiringPi -lpthread' 명령을 사용해서 컴파일 해야한다.


참조

WiringPi.com


블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,