개발자/라즈베리파이4

라즈베리파이4 스마트홈 RGB LED 실습 12

지구빵집 2023. 5. 25. 09:16
반응형

 

 

스마트 홈에서 사용하는 RGB led 모듈은 IWS-506-RGB-K3 led 3개를 연결하여 제작되었다. 전원은 DC 12V를 공급하고, GPIO 3라인을 연결하여 다양한 색을 출력하도록 한다. RGB Led 가 내는 색상은 Red, Green, Blue 각각 256가지 색을 내므로 조합하면 1,670만 가지 색을 낼 수 있다. 여기서는 RGB 색을 시험하기로 한다. 아래는 RGB Led의 이미지와 회로도를 나타낸다. 

 

 

라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트 

 

라즈베리파이4 스마트홈 제품 특징 1

라즈베리파이4 스마트홈 불꽃 센서 코드 2

라즈베리파이4 스마트홈 가스센서 코드 3

라즈베리파이4 스마트홈 소리센서 코드 4

라즈베리파이4 스마트홈 조도센서 코드 5

라즈베리파이4 스마트홈 온도 습도센서 코드 6

라즈베리파이4 스마트홈 인체감지 모션센서 코드 7

라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8

라즈베리파이4 스마트홈 가스타이머 실습 9

라즈베리파이4 스마트홈 전동볼밸브 실습 10

라즈베리파이4 스마트홈 RFID 실습 11

라즈베리파이4 스마트홈 RGB LED 실습 12

라즈베리파이4 스마트홈 카메라 실습 13

라즈베리파이4 스마트홈 조명 LED bar 실습 14

라즈베리파이4 스마트홈 서버 프로그램 실습 15

라즈베리파이4 스마트홈 안드로이드 앱 설명 16

 

 

 

RGB Led 모듈 이미지

 

아래는 GRB Led Moule 회로도를 나타낸다. RGB 모듈은 RGB 컬러를 내는 반도체 칩 3개를 병렬로 연결한 모듈이다. 

 

 

RGB Led 모듈 회로도

 

아래는 Module에 들어가는 전원을 제어하는 회로도이다. 

 

 

RGB Led 모듈 전원 회로

 

아래 소스 코드는 RGB LED를 ON/OFF 제어하는 소스코드이다. #define 구문을 이용해 포트를 정의하고, 핀 모드를 설정한다. 핀에 High와 Low를 인가하면 선택된 Color로 불이 켜지는 소스이다. 처음엔 RGB LED On/Off 기능을 실습하고, 이어서 신호등과 천육백만 가지 색 전체를 표현하는 실습을 진행한다. 아래 소스코드를 입력한다. (home-rgbled.c) 

 

#include <signal.h> //Signal 사용 헤더파일
#include <unistd.h>
#include <stdio.h> 
#include <string.h> 
#include <errno.h>
#include <stdlib.h> //exit() 사용 헤더파일

#include <wiringPi.h>

#define RED		27	// BCM_GPIO 16 - OUT
#define GREEN	28	// BCM_GPIO 20 - OUT
#define BLUE	29 // BCM_GPIO 21 - OUT

void Bpluspinmodeset(void);

// the event counter 
volatile int pulseCounter = 0; //pulse 10msec

void sig_handler(int signo); // SIGINT 사용 마지막 종료 함수

int main (void)
{
	if(wiringPicheck()) printf("Fail");
		
	Bpluspinmodeset();
	signal(SIGINT, (void *)sig_handler);	//시그널 핸들러 함수
	
	
	int i;
	while(1)
	{	
		printf("here \n");
		
		Bpluspinmodeset();
			
		digitalWrite(RED, 1);
		delay(1000);
		digitalWrite(BLUE, 1);
		delay(1000);
		//digitalWrite(GREEN, 1);
		
		digitalWrite(RED, 0);
		digitalWrite(BLUE, 0);
		delay(1000);
		
		
	}	
  
  return 0 ;
}

int wiringPicheck(void)
{
	if (wiringPiSetup () == -1)
	{
		fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));
		return 1 ;
	}
}

void Bpluspinmodeset(void)
{
	pinMode (RED, OUTPUT);
	pinMode (GREEN, OUTPUT);
	pinMode (BLUE, OUTPUT);	
	
}

void sig_handler(int signo)
{
    printf("process stop\n");
	
	digitalWrite(RED, 0);
	digitalWrite(GREEN, 0);
	digitalWrite(BLUE, 0);
	//digitalWrite(RGBLEDPOWER, 0); //Off
	
	exit(0);
}

 

RGB LED로 신호등 만들기 실습 이제부터 RGB LED를 가지고 간단한 신호등을 만들어 볼 것이다. Red, Green, Blue의 신호를 출력하여 색깔을 출력할 수 있으면 쉽게 할 것이다.  

 

RGB 색상

 

위그림에서 Red, Green을 사용하고, 두 색을 합쳐서 노란색을 표현할 것이다. 소스코드를 입력하자. (home-trafficlight.c) 

 

#include <signal.h> //Signal 사용 헤더파일
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h> //exit() 사용 헤더파일

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

#include <wiringPi.h>

#define RED		29	// BCM_GPIO 16 - OUT
#define GREEN	28	// BCM_GPIO 20 - OUT
#define BLUE	27 // BCM_GPIO 21 - OUT

void Bpluspinmodeset(void);


void sig_handler(int signo); // SIGINT 핸들러 함수

int main (void)
{
	if(wiringPicheck()) printf("Fail");
		
	Bpluspinmodeset();
	
	signal(SIGINT, (void *)sig_handler);
	
	int i;
	while(1)
	{	
		printf("Traffic Light \n");
		
		for (i = 0; i < 3; i++)
		{
			switch(i) {
				case 0:
					digitalWrite(RED, 1);
					digitalWrite(GREEN, 0);								
					delay(3000);
					break;
				case 1:
					digitalWrite(RED, 1);
					digitalWrite(GREEN, 1);
					delay(1000);
					break;
				case 2:					
					digitalWrite(RED, 0);
					digitalWrite(GREEN, 1);
					delay(3000);
				break;
			}
		}				
	}	
  
  return 0 ;
}

int wiringPicheck(void)
{
	if (wiringPiSetup () == -1)
	{
		fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));
		return 1 ;
	}
}

void Bpluspinmodeset(void)
{
	pinMode (RED, OUTPUT);
	pinMode (GREEN, OUTPUT);
	pinMode (BLUE, OUTPUT);	
	
}

void sig_handler(int signo) // ctrl-c 로 종료시 실행되는 함수
{
    printf("process stop\n");
	digitalWrite(RED, 0);
	digitalWrite(GREEN, 0);
	digitalWrite(BLUE, 0);
	exit(0);
}

 

RGB 컬러 전체 표시하기 실습

 

다음은 소프트웨어 PWM 방식 이용하여 RGB 전체 색을 표시하는 실습을 할 것이다. 실제로 1,600만 가지 이상의 색을 표현하지만 육안으로 구별하지 못할 뿐이다. LED로 여러 가지 색을 나타내려면 기본적으로 LED의 밝기를 조절해야 하는데 LED 밝기 조절은 전압을 변경하여 할 수 있다. 하지만 GPIO핀은 디지털인데, 즉, 끄고 켜는 두 가지 외에는 방법이 없는데 어떻게 LED의 밝기를 조절할 수 있을까?

 

이를 위해서는 PWM을 이해해야 한다. PWM은 Pulse Width Modulation의 약자로 펄스폭 변조라고 한다. PWM은 디지털 기기에서 아날로그 결과를 얻기 위한 테크닉으로, 전원인 on 되는 시간을 펄스폭이라고 하고, 펄스폭을 조정함으로 on과 off사이의 전압을 흉내 낼 수 있다.  

 

PWM 신호 원리

 

이러한 on-off 패턴을 빠르게 반복하여 LED에 출력하면 LED의 밝기를 변경할 수 있게 되는 것이다. 예를 들어 위의 그림과 같이 on이 지속되는 시간, 즉, 펄스폭을 조정하면, 위에서 아래로 갈수록 밝은 LED 빛을 얻을 수 있다. wiringPi 라이브러리에서 PWM을 지원한다. 다음은 WiringPi 라이브러리의 PWM 함수를 이용해서 LED의 색깔을 바꿔서 다양한 색을 표현하는 프로그램 코드이다. (allrgbcolor.c)  

 

#include <signal.h> //Signal 사용 헤더파일
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h> //exit() 사용 헤더파일

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

#include <wiringPi.h>

#define RED		29	// BCM_GPIO 16 - OUT
#define GREEN	28	// BCM_GPIO 20 - OUT
#define BLUE	27 // BCM_GPIO 21 - OUT

void Bpluspinmodeset(void);

void setRGB(int r, int g, int b);
void sig_handler(int signo); // SIGINT 핸들러 함수

int main (void)
{
	if(wiringPicheck()) printf("Fail");
		
	Bpluspinmodeset();
	
	signal(SIGINT, (void *)sig_handler);
	
	int i;
	while(1)
	{	
		
		int i = 0, j = 0, k=0;
		printf("RGB LED Various Color");
 
		softPwmCreate(RED, 0, 255);
		softPwmCreate(GREEN, 0, 255);
		softPwmCreate(BLUE, 0, 255);
 
		for (i = 0; i <= 250; i=i+10){
			for (j = 0; j <= 250; j=j+10){
				for (k = 0; k <= 250; k=k+10){
					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 ;
}

int wiringPicheck(void)
{
	if (wiringPiSetup () == -1)
	{
		fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));
		return 1 ;
	}
}

void Bpluspinmodeset(void)
{
	pinMode (RED, OUTPUT);
	pinMode (GREEN, OUTPUT);
	pinMode (BLUE, OUTPUT);	
	
}

void sig_handler(int signo) // ctrl-c 로 종료시 실행되는 함수
{
    printf("process stop\n");
	digitalWrite(RED, 0);
	digitalWrite(GREEN, 0);
	digitalWrite(BLUE, 0);
	exit(0);
}

void setRGB(int r, int g, int b){
  softPwmWrite(RED, 255-r);
  softPwmWrite(GREEN, 255-g);
  softPwmWrite(BLUE, 255-b);
}

 

위 코드를 조금 살펴보자. 우선 8번째 줄을 보면 'softPwm.h' 헤더파일을 포함시키는데, 이는 WiringPi에서 지원하는 헤더파일로 PWM을 사용하기 위해서는 이 헤더파일이 필요하기 때문이다. 두 번째로 36-38번째 줄을 보면, softPwmCreate 함수를 사용하는데 이 함수는 소프트웨어로 제어되는 PWM 핀을 만든다.

 

이 함수는 핀번호, 기본값, PWM 값의 범위 이렇게 세 가지를 파라미터로 갖는다. 따라서 36번째 줄의 softPwmCreate(RED, 0, 255)는 RED핀을 0과 255 사이의 범위를 갖고 기본값을 0으로 하는 PWM 핀을 만든다. 마지막으로 void setRGB(int r, int g, int b) 함수는 LED에 불을 켜는 함수로 softPwmWrite를 이용해서 빨간색, 초록색, 파란색 불빛의 밝기를 조절하여 원하는 색깔의 빛을 만든다. 

 

 

 

반응형