본문 바로가기

소프트박스 라즈파이

라즈베리파이 RGB LED 실습 코드

반응형


소프트박스 라즈베리파이 RGB LED 실습 코드



보드에서 사용된 RGB LED 이미지


라즈베리파이와 연결도를 Fritzing 으로 그린 이미지 



아래는 단순한 RGB Test 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <signal.h> //Signal 사용 헤더파일
#include <unistd.h>
#include <stdio.h> 
#include <string.h> 
#include <errno.h>
#include <stdlib.h> //exit() 사용 헤더파일
 
#include <wiringPi.h>
 
#define RGBLEDPOWER  24 //BCM_GPIO 19
 
#define RED        4 //27
#define GREEN    3 //28
#define BLUE    7 //29
 
void sig_handler(int signo); // SIGINT 사용 마지막 종료 함수
 
int main (void)
{
    signal(SIGINT, (void *)sig_handler);    //시그널 핸들러 함수
    
    if (wiringPiSetup () == -1)
    {
        fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));
        return 1 ;
    }
  
    pinMode(RGBLEDPOWER, OUTPUT);
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);
 
    int i;
 
    for (i =0; i<10 ;i++)
    {
 
        digitalWrite(RGBLEDPOWER, 1);
 
        digitalWrite(RED, 1);
        digitalWrite(BLUE, 0);
        digitalWrite(GREEN, 0);
        
        delay(1000);
        
        digitalWrite(RED, 0);
        digitalWrite(BLUE, 1);
        digitalWrite(GREEN, 0);
        
        delay(1000);
        
        digitalWrite(RED, 0);
        digitalWrite(BLUE, 0);
        digitalWrite(GREEN, 1);
        
        delay(1000);        
    }
    digitalWrite(GREEN, 0);
  return 0 ;
}
 
void sig_handler(int signo)
{
    printf("process stop\n");
    
    digitalWrite(RED, 1);
    digitalWrite(GREEN, 1);
    digitalWrite(BLUE, 1);
    digitalWrite(RGBLEDPOWER, 0); //Off
    
    exit(0);
}
 
 


출력신호를 PWM 방식으로 구현하여 1,650만 가지 색이 나오도록 한 소스 코드 잘 보면 프로그램이 제대로 만든 것 같지 않다. 실행해 보면 LED 가 한쪽 색으로 나온다. 무언가 다른 변화를 주어서 많은 색깔 변화를 즉각적으로 볼 수 있었으면 좋겠다. 약 30~90 단계 정도로.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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 RGBLEDPOWER  24 //BCM_GPIO 19
#define RED    4    // BCM_GPIO 16 - OUT
#define GREEN    3    // BCM_GPIO 20 - OUT
#define BLUE    7 // 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;
    digitalWrite(RGBLEDPOWER, 1);
    
    while(1)
    {    
        
        int i = 0, j = 0, k=0;
        printf("RGB LED Various Color");
 
        softPwmCreate(RED, 0255);
        softPwmCreate(GREEN, 0255);
        softPwmCreate(BLUE, 0255);
 
        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(RGBLEDPOWER, OUTPUT);
    pinMode (RED, OUTPUT);
    pinMode (GREEN, OUTPUT);
    pinMode (BLUE, OUTPUT);    
}
 
void setRGB(int r, int g, int b)
{
    softPwmWrite(RED, 255-r);
    softPwmWrite(GREEN, 255-g);
    softPwmWrite(BLUE, 255-b);
}
 
void sig_handler(int signo) // ctrl-c 로 종료시 실행되는 함수
{
    printf("process stop\n");
    digitalWrite(RED, 0);
    digitalWrite(GREEN, 0);
    digitalWrite(BLUE, 0);
    digitalWrite(RGBLEDPOWER, 0); //Off
    exit(0);
}
 

 



소프트웨어 교육과 메이커 프로젝트에 유용한 자료를 보내드립니다. 주위분들에게도 알려주세요.



반응형