Lesson 5 RGB LED

Share for us

Introduction

Previously we’ve used the PWM technology to control an LED brighten and dim. In this lesson, we will use it to control an RGB LED to flash various kinds of colors.

Components

– 1 * Raspberry Pi

– 1 * Breadboard

– 1 * RGB LED

– 3 * Resistor (220Ω)

– Several jumper wires

Principle

In this experiment, we will use a RGB. For details of RGB, please refer to the introduction of RGB LED in Components Introduction

The three primary colors of the RGB LED can be mixed into various colors by brightness. The brightness of LED can be adjusted with PWM. Raspberry Pi has only one channel for hardware PWM output, but it needs three channels to control the RGB LED, which means it is difficult to control the RGB LED with the hardware PWM of Raspberry Pi. Fortunately, the softPwm library simulates PWM (softPwm) by programming. You only need to include the header file softPwm.h (for C language users), and then call the API it provides to easily control the RGB LED by multi-channel PWM output, so as to display all kinds of color.

Experimental Procedures

Step 1: Build the circuit

For C language users:

Step 2: Open the code file

    cd /home/pi/SunFounder_Super_Kit_V3.0_for_Raspberry_Pi/C

Step 3: Compile the Code

    make 05_rgb

Step 4: Run the executable file above

     sudo ./05_rgb

For Python users:

Step 2: Open the code file

    cd /home/pi/SunFounder_Super_Kit_V3.0_for_Raspberry_Pi/Python

Step 3: Run

    sudo python 05_rgb.py

Here you should see the RGB LED flash different colors in turn.

Further Exploration

You can modify the parameters of the function ledColorSet( ) by yourself, and then   and run the code to see the color changes of the RGB LED.

C Code

/**********************************************************************
* Filename    : rgbLed.c
* Description : Make a RGB LED emits various color.
* Author      : Robot
* E-mail      : support@sunfounder.com
* website     : www.sunfounder.com
* Update      : Cavon    2016/07/01
**********************************************************************/
#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){

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

	ledInit();

	printf("\n");
	printf("\n");
	printf("========================================\n");
	printf("|              Breath LED              |\n");
	printf("|    ------------------------------    |\n");
	printf("|       Red Pin connect to GPIO0       |\n");
	printf("|      Green Pin connect to GPIO1      |\n");
	printf("|       Blue Pin connect to GPIO2      |\n");
	printf("|                                      |\n");
	printf("|  Make a RGB LED emits various color  |\n");
	printf("|                                      |\n");
	printf("|                            SunFounder|\n");
	printf("========================================\n");
	printf("\n");
	printf("\n");

	while(1){
		printf("Red\n");
		ledColorSet(0xff,0x00,0x00);   //red	
		delay(500);
		printf("Green\n");
		ledColorSet(0x00,0xff,0x00);   //green
		delay(500);
		printf("Blue\n");
		ledColorSet(0x00,0x00,0xff);   //blue
		delay(500);

		printf("Yellow\n");
		ledColorSet(0xff,0xff,0x00);   //yellow
		delay(500);
		printf("Purple\n");
		ledColorSet(0xff,0x00,0xff);   //purple
		delay(500);
		printf("Cyan\n");
		ledColorSet(0xc0,0xff,0x3e);   //cyan
		delay(500);
	}

	return 0;
}


Python Code

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

# Set up a color table in Hexadecimal
COLOR = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
# Set pins' channels with dictionary
pins = {'Red':17, 'Green':18, 'Blue':27}

def print_message():
	print ("========================================")
	print ("|              Breath LED              |")
	print ("|    ------------------------------    |")
	print ("|       Red Pin connect to GPIO0       |")
	print ("|      Green Pin connect to GPIO1      |")
	print ("|       Blue Pin connect to GPIO2      |")
	print ("|                                      |")
	print ("|  Make a RGB LED emits various color  |")
	print ("|                                      |")
	print ("|                            SunFounder|")
	print ("========================================\n")
	print 'Program is running...'
	print 'Please press Ctrl+C to end the program...'
	raw_input ("Press Enter to begin\n")

def setup():
	global p_R, p_G, p_B
	# Set the GPIO modes to BCM Numbering
	GPIO.setmode(GPIO.BCM)
	# Set all LedPin's mode to output, 
	# and initial level to High(3.3v)
	for i in pins:
		GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH)

	# Set all led as pwm channel,
	#  and frequece to 2KHz
	p_R = GPIO.PWM(pins['Red'], 2000)
	p_G = GPIO.PWM(pins['Green'], 2000)
	p_B = GPIO.PWM(pins['Blue'], 2000)

	# Set all begin with value 0
	p_R.start(0)
	p_G.start(0)
	p_B.start(0)

# Define a MAP function for mapping values.
# Like from 0~255 to 0~100
def MAP(x, in_min, in_max, out_min, out_max):
	return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

# Define a function to set up colors 
# input color should be Hexadecimal with 
# red value, blue value, green value.
def setColor(color):
	# Devide colors from 'color' veriable
	R_val = (color & 0xFF0000) >> 16
	G_val = (color & 0x00FF00) >> 8
	B_val = (color & 0x0000FF) >> 0
	
	# Map color value from 0~255 to 0~100
	R_val = MAP(R_val, 0, 255, 0, 100)
	G_val = MAP(G_val, 0, 255, 0, 100)
	B_val = MAP(B_val, 0, 255, 0, 100)
	
	# Change the colors
	p_R.ChangeDutyCycle(R_val)
	p_G.ChangeDutyCycle(G_val)
	p_B.ChangeDutyCycle(B_val)

	print "color_msg: R_val = %s,	G_val = %s,	B_val = %s"%(R_val, G_val, B_val)	 

def main():
	print_message()
	while True:
		for color in COLOR:
			setColor(color)
			time.sleep(0.5)

def destroy():
	# Stop all pwm channel
	p_R.stop()
	p_G.stop()
	p_B.stop()
	# Turn off all LEDs
	GPIO.output(pins, GPIO.HIGH)
	# Release resource
	GPIO.cleanup()

# If run this script directly, do:
if __name__ == '__main__':
	setup()
	try:
		main()
	# When 'Ctrl+C' is pressed, the child program 
	# destroy() will be  executed.
	except KeyboardInterrupt:
		destroy()