지난 포스트 RGB LED로 신호등 만들기에서 RGB LED를 사용해서 빨간색, 노란색, 초록색 불을 켜는 방법을 알아봤다. 그 중 특히 노란색 불은 빨간색과 초록색 불을 섞어서 만들었다. 이런 식으로 하면 빨간색, 노란색, 초록색 불을 각각 켜고 끄는 것으로 불끄는것 포함 총 8개의 색을 나타낼 수 있다. 하지만 이렇게 해서는 표현 할 수 있는 색이 너무 적다. 이번 포스트에서는 PWM을 이용해서 RGB LED로 여러가지 색깔을 표현하는 방법을 알아보자.
우선 아래 사진처럼 지난 포스트에서 RGB LED를 연결하는거와 같이 저항과 LED와 GPIO핀을 연결한다. 지난 포스트에서는 파란색 불을 사용할 일이 없어서 연결하지 않아도 됐지만 이번에는 세개 모두 연결 한다.
LED로 여러가지 색을 나타내려면 기본적으로 LED의 밝기를 조절해야하는데 LED 밝기 조절은 전압을 변경하여 할 수 있다. 하지만 GPIO핀은 디지털인데, 즉, 끄고 켜는 두가지 외에는 방법이 없는데 어떻게 LED의 밝기를 조절 할 수 있을까? 이를 위해서는 PWM을 이해해야한다. PWM은 Pulse Width Modulation의 약자로 펄스 폭 변조라고 한다. PWM은 디지털 기기에서 아날로그 결과를 얻기 위한 테크닉으로, 전원인 on되는 시간을 펄스 폭이라고 하고, 펄스 폭을 조정함으로 on과 off사이의 전압을 흉내낼 수 있다. 이러한 on-off 패턴을 빠르게 반복하여 LED에 출력하면 LED의 밝기를 변경 할 수 있게 되는 것이다. 예를 들어 아래 그림과 같이 on이 지속 되는 시간, 즉, 펄스 폭을 조정하면, 위에서 아래로 갈 수록 밝은 LED 빛을 얻을 수 있다.
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 ; }
'Raspberry Pi > 라즈베리파이 중급' 카테고리의 다른 글
[라즈베리파이 중급] (11) CCTV 만들기-1 (10) | 2014.11.16 |
---|---|
[라즈베리파이 중급] (10) 가변저항으로 RGB LED 색깔 표현 (0) | 2014.08.25 |
[라즈베리파이 중급] (8) RGB LED로 신호등 만들기 (0) | 2014.08.20 |
[라즈베리파이 중급] (7) LED로 간단한 신호등 만들기 (0) | 2014.08.18 |
[라즈베리파이 중급] (6) WiringPi 설치 & 깜빡이는 LED (0) | 2014.08.17 |