1. 程式人生 > >用樹莓派實現RGB LED的顏色控制——C語言版本號

用樹莓派實現RGB LED的顏色控制——C語言版本號

個數 hang clu 代碼 stdio.h 標準 tro color sage

用樹莓派實現RGB LED的顏色控制

RGB色彩模式是工業界的一種顏色標準。是通過對紅(R)綠(G)藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代 表三個通道的顏色。這個標準差點兒包含了人類視力所能感知的全部顏色,是眼下運用最廣的顏色系統之中的一個。RGB色彩模式使用RGB模型為圖像中每個像素的RGB分量分配一個0~255範圍內的強度值。

RGB圖像僅僅使用三種顏色。就能夠使它們依照不同的比例混合,從而得到各種各樣的顏色。

在實際的控制中。往往通過PWM來實現LED亮度(顏色深度)的控制。

樹莓派僅僅有一路硬件PWM輸出(GPIO1),但是要實現RGB LED的控制。須要3路PWM。事實上。wiringPi庫為我們提供了用軟件多線程實現的PWM輸出,我們能夠利用這個庫提供的函數非常方便的將隨意GPIO配置為PWM輸出。在本例中。我將GPIO0,GPIO1。GPIO2配置成了soft PWM輸出。樹莓派的引腳分配表例如以下圖所看到的:

技術分享

我用的RGB LED是共陰極的,與樹莓派的連接方式例如以下:

Raspberry Pi RGB LED module

GPIO0 -------------------------------------- R

GPIO1 ------------------------------------- G

GPIO2 -------------------------------------- B

GND ----------------------------------------

‘-’

實物圖例如以下:

技術分享

源碼:

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

#define uchar unsigned char

#define LedPinRed    0
#define LedPinGreen  1
#define LedPinBlue   2

void ledInit(void)
{
	softPwmCreate(LedPinRed,  0, 100);
	softPwmCreate(LedPinGreen,0, 100);
	softPwmCreate(LedPinBlue, 0, 100);
}

void ledColorSet(uchar r_val, uchar g_val, uchar b_val)
{
	softPwmWrite(LedPinRed,   r_val);
	softPwmWrite(LedPinGreen, g_val);
	softPwmWrite(LedPinBlue,  b_val);
}

int main(void)
{
	int i;

	if(wiringPiSetup() == -1){      //when initialize wiring failed,print message to screen
		printf("setup wiringPi failed !");
		return 1; 
	}

	ledInit();

	while(1){
		ledColorSet(0xff,0x00,0x00);   //red	
		delay(500);
		ledColorSet(0x00,0xff,0x00);   //green
		delay(500);
		ledColorSet(0x00,0x00,0xff);   //blue
		delay(500);

		ledColorSet(0xff,0xff,0x00);   //yellow
		delay(500);
		ledColorSet(0xff,0x00,0xff);   //pick
		delay(500);
		ledColorSet(0xc0,0xff,0x3e);
		delay(500);

		ledColorSet(0x94,0x00,0xd3);
		delay(500);
		ledColorSet(0x76,0xee,0x00);
		delay(500);
		ledColorSet(0x00,0xc5,0xcd);	
		delay(500);

	}

	return 0;
}

將此代碼保存為rgb.c。

編譯代碼:

gcc rgb.c -o rgb -lwiringPi -lpthread

執行代碼:

./rgb

註意:

1,-lwiringPi選項:指明了要鏈接到wiringpi庫,由於softPwm的實現就在此庫;

2。-lpthread選項:由於softPwm的實現用了Linux的多線程機制。所以加這個編譯選項。


代碼和演示視頻已分享到360雲盤:

點我下載代碼 訪問passworde0da

點我下載視頻 訪問passwordd6b1


下面是改進後的代碼。編譯方式同上。

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

#define LedPinRed    0
#define LedPinGreen  1
#define LedPinBlue   2

int colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF, 0xFFFFFF, 0x9400D3};

/******************************************************************************************
* 將一個數從一個區間線性映射到還有一個區間。比方將0~100之間的一個數映射到0~255之間
******************************************************************************************/
int map(int x, int in_min, int in_max, int out_min, int out_max)   
{
	return (x -in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

void ledInit(void)
{
	softPwmCreate(LedPinRed,  0, 100);  //create a soft pwm, original duty cycle is 0Hz, range is 0~100 
	softPwmCreate(LedPinGreen,0, 100);
	softPwmCreate(LedPinBlue, 0, 100);
}

void ledColorSet(int color)        //set color, for example: 0xde3f47
{
	int r_val, g_val, b_val;

	r_val = (color & 0xFF0000) >> 16;  //get red value
	g_val = (color & 0x00FF00) >> 8;   //get green value
	b_val = (color & 0x0000FF) >> 0;   //get blue value

	r_val = map(r_val, 0, 255, 0, 100);    //change a num(0~255) to 0~100
	g_val = map(g_val, 0, 255, 0, 100);
	b_val = map(b_val, 0, 255, 0, 100);
	
	softPwmWrite(LedPinRed,   100 - r_val);  //change duty cycle
	softPwmWrite(LedPinGreen, 100 - g_val);
	softPwmWrite(LedPinBlue,  100 - b_val);
}

int main(void)
{
	int i;

	if(wiringPiSetup() == -1){      //when initialize wiringPi failed, print message to screen
		printf("setup wiringPi failed !\n");
		return 1; 
	}

	ledInit();

	while(1){
		for(i = 0; i < sizeof(colors)/sizeof(int); i++){
			ledColorSet(colors[i]);
			delay(500);
		}
	}

	return 0;
}

假設你想用Python語言實現RGB的控制,請看還有一篇博文【用樹莓派實現RGB LED的顏色控制——Python版本號


用樹莓派實現RGB LED的顏色控制——C語言版本號