본문 바로가기

개발자/라즈베리파이4

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

반응형

 

 

왜 마지막까지 몰아붙이지 못하는 거지? 왜 포기란 절대 없다고 생각하지 않는 거지? 컴포트 존에 파묻혀 있으면 마냥 좋은가? 그런 정신으로는 무얼 해도 안된다. 아무것도 가질 수 없어. 소원도 이루지 못해. 알겠어? 거지근성을 버리고 인내하고 또 인내하고 반복하고 또 반복한다. 갖고 싶은 것을 가지라고 이 머저리야!

 

 

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

 

라즈베리파이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

 

 

LED Bar는 단순히 화이트 LED를 연달아 붙여 놓은 것을 말한다. 흔히 조명으로 사용되는 LED들이 대부분 LED의 배열이나 배치를 복수 개로 하여 구성된 것이다. 실습에 사용되는 LED 소자의 상세한 사양은 데이터북을 참고하기로 하고, 여기에 사용되는 LED Bar는 3개를 병렬로 연결하여 제체 제작한 LED Bar를 사용한다. LED 데이터 시트를 올려둔다.

 

[SEN0262](V1.0) Schematic.pdf
0.04MB

 

 

LED Bar의 사양을 아래 데이블에 실었다. 

 

MODEL N.O SDS5050WTU-S-AP-A
ENG. N.O 120203002
Shape 8MM Round 5.0*5.4*1.6mm Surface Mount LEDs
Emitting Color White
Lens Color Yellow
Viewing Angle 117°
Chip Material InGaN

 

 

LED bar는 실내조명, 실외조명, 특수조명 등과 같은 많은 응용분야가 있다. 여기서는 실내조명을 ON/OFF 하는 기능을 한다. 아래 그림에 LED bar 외관을 나타내었다. 

 

 

LED bar 외관

 

LED 3개를 연결한 간단한 회로지만 전등으로 사용하기에 적당하고, 개수를 늘린다면 스탠드나 실내의 조명으로 사용할 수 있다. 아래 그림에는 사용하는 LED bar의 연결 회로도를 나타내었다. 조명 실습에도 이전에 설명한 ctrl-c를 누르고 빠져나올 때 SIGINT 신호를 사용하여 전등이 On 된 채 빠져나오는 일이 없도록 하기 위해 코드를 추가하였다. 

 

아래에 LED bar 회로도와 전원공급 커넥터를 표시한다. 

 

LED bar 회로도와 전원공급 커넥터

 

조명 LED를 시험 하기 위해 소스 코드를 입력한다. (home-lightcontrol.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 LIGHTCONTROL  7	//GPIO 4

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

void Bpluspinmodeset(void);


int main (void)
{
	if(wiringPicheck()) printf("Fail\n");
		
	signal(SIGINT, (void *)sig_handler);	//시그널 핸들러 함수	
	
	int i;
	while(1)
	{	
		printf("here \n");
		
		pinMode (LIGHTCONTROL, OUTPUT);
		
		//delay(1000);
			
		digitalWrite(LIGHTCONTROL, 1);
		delay(1000);
		digitalWrite(LIGHTCONTROL, 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 (LIGHTCONTROL, OUTPUT);	
}

void sig_handler(int signo)
{
    printf("process stop\n");	
	digitalWrite(LIGHTCONTROL, 0);	
	exit(0);
}

 

컴파일은 $gcc -o home-lightcontrol home-lightcontrol.c -l wiringPi

 

실행은 $./home-lightcontrol

 

컴파일하고 실행하면 조명이 온 오프 되는 것을 확인할 수 있다. 위 소스코드의 문제점은 액츄에이터 시작 전에 언급했듯이 전등 전원이 ON 상태에서 ctrl-c로 종료하면 전등의 불이 계속 켜져 있다는 것이다. 이것을 방지하기 위해 SIGNAL을 이용하여 소스코드를 작성하면 프로그램 종료 후에도 전등이 계속 켜져 있는 일은 없을 것이다. 코드는 동일하고 Signal이 발생할 경우 처리하는 코드를 추가하였다.

 

PWM으로 LED bar 제어하기 

 

간단한 LED 제어실습으로 softPwm 라이브러리를 사용하여 LED bar를 제어하는 방법을 알아보자. PWM은 디지털 기기에서 아날로그 결과를 얻기 위한 테크닉으로, 전원인 on 되는 시간을 펄스폭이라고 하고, 펄스폭을 조정함으로 on과 off사이의 전압을 흉내 낼 수 있다. 이러한 on-off 패턴을 빠르게 반복하여 LED에 출력하면 LED의 밝기를 변경할 수 있게 되는 것이다. softPwm 라이브러리나 헤더파일은 라즈베리 파이 실습 시에 설치한 wiringPi 라이브러리가 설치되었다면 pi\wiringPi\wiringPi 아래에 있을 것이다. 우선 소스코드를 살펴보면 아래와 같다. (ledbarsoftpwm.c)  

 

 

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

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

#define LEDCONTROL  7// LED Bar

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

int main (void)
{
	if(wiringPicheck()) printf("Fail\n");
		
	signal(SIGINT, (void *)sig_handler);	
	
	pinMode (LEDCONTROL, OUTPUT);
	
	softPwmCreate(LEDCONTROL, 0, 100);
	
	int i;
	int delaytime = 500;
	while(1)
	{	
		printf("here \n");	
		
		softPwmWrite(LEDCONTROL, 10);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 20);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 30);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 40);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 50);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 60);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 70);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 80);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 90);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 100);
		delay(delaytime);
		softPwmWrite(LEDCONTROL, 0);
		delay(delaytime);		
	}	
  
  return 0 ;
}

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

void Bpluspinmodeset(void)
{
	pinMode (LEDCONTROL, OUTPUT);
	
}

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

 

 

wiringPi의 소프트웨어 pwm으로 사용하기 위해 아래의 두 파일을 include 한다.

 

#include

#include

 

softPwm은 최소 10usec 의 펄스 길이와 100hz의 PWM frequency를 제공하므로 모터와 LED 제어를 이해 사용하는데 적당하다. softPwmCreate 함수를 사용하는데 이 함수는 소프트웨어로 제어되는 PWM 핀을 만든다. 이 함수는 핀번호, 기본값, PWM 값의 범위 이렇게 세 가지를 파라미터로 갖는다.

 

softPwm(use pin, init value, range pwm);

 

실제로 정의된 핀에 PWM 신호를 출력하기 위해 핀 번호와 값을 인자로 갖는 아래 함수를 사용한다.

 

softPwmWrite(use pin, pwm value);

 

현재 pwm 출력값의 변화로 LED Bar는 밝기가 밝아지고 꺼지고 하는 동작을 반복할 것이다. 소스코드를 이해하고 입력을 하였다면 컴파일을 수행한다.

 

$ gcc -o ledbarsoftpwm ledbarsoftpwm.c -lwiringPi –lpthread

 

실행을 하면 LED조명의 밝기가 변화하는 것을 볼 수 있다.

 

$ sudo ./ledbarsoftpwm

 

이러한 PWM 제어는 모터, LED 조명의 밝기제어, RGB Color LED의 색 제어 등에 많이 사용되므로 잘 알아두면 매우 유용할 것이다  

 

여기까지 정말 고생하셨습니다. 계속 체육관에 가세요. 계속 푸시업 하세요. 

 

 

반짝이는 손과 은빛 시계, 하얀 셔츠, 너무 아름다워 숨이 막힐 지경이다.

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^