.. note::
¡Hola! Bienvenido a la Comunidad de Entusiastas de Raspberry Pi, Arduino y ESP32 de SunFounder en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
**¿Por qué unirse?**
- **Soporte Experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
- **Aprender y Compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Vistas Exclusivas**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones Festivas y Sorteos**: Participa en sorteos y promociones navideñas.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.
.. _1.1.2_rgb_c_pi5:
1.1.2 LED RGB
====================
Introducción
--------------
En esta lección, aprenderemos a controlar un LED RGB para que parpadee en varios colores.
Componentes
--------------
.. image:: img/list_rgb_led.png
:align: center
Principio
--------------
**PWM**
La Modulación por Ancho de Pulso, o PWM, es una técnica para obtener
resultados analógicos mediante medios digitales. El control digital se
utiliza para crear una onda cuadrada, una señal que alterna entre encendido
y apagado. Este patrón de encendido y apagado puede simular voltajes intermedios
entre encendido total (5 Voltios) y apagado (0 Voltios) al variar el tiempo que
la señal permanece encendida frente al tiempo que permanece apagada. La duración
del "tiempo de encendido" se denomina ancho de pulso. Para obtener valores
analógicos variables, se cambia o modula dicho ancho. Si se repite este patrón
de encendido y apagado lo suficientemente rápido con algún dispositivo, como un
LED, el resultado sería una señal de voltaje constante entre 0 y 5v que controla
el brillo del LED.
**Ciclo de Trabajo**
Un ciclo de trabajo es el porcentaje de un período en el que una señal está activa.
Un período es el tiempo que tarda una señal en completar un ciclo de encendido y apagado.
Como fórmula, un ciclo de trabajo se puede expresar así:
.. image:: img/image56.png
:width: 1.16667in
:height: 0.36458in
:align: center
Donde **D** es el ciclo de trabajo, **T** es el tiempo que la señal está
activa, y **P** es el período total de la señal. Por lo tanto, un ciclo
de trabajo del 60% significa que la señal está encendida el 60% del tiempo
y apagada el 40% del tiempo. El "tiempo de encendido" para un ciclo de trabajo
del 60% podría ser una fracción de segundo, un día o incluso una semana,
dependiendo de la duración del período.
.. image:: img/image57.jpeg
:width: 4.325in
:height: 5.49167in
:align: center
**LED RGB**
.. image:: img/rgb_led_sch.png
:width: 500
:align: center
Los tres colores primarios del LED RGB se pueden mezclar para crear varios
colores a través de su brillo. El brillo del LED se puede ajustar con PWM.
La Raspberry Pi solo tiene un canal para la salida PWM de hardware, pero
necesita tres canales para controlar el LED RGB, lo que significa que es
difícil controlar el LED RGB con el PWM de hardware de la Raspberry Pi.
Afortunadamente, la biblioteca softPwm simula PWM (softPwm) mediante programación. Solo necesitas incluir el archivo de encabezado softPwm.h (para los usuarios de C), y luego llamar a la API que proporciona para controlar fácilmente el LED RGB mediante salida PWM multicanal, de modo que se puedan mostrar todo tipo de colores.
Diagrama Esquemático
-----------------------
Después de conectar los pines R, G y B a una resistencia limitadora de corriente,
conéctalos a GPIO17, GPIO18 y GPIO27 respectivamente. El pin más largo (GND) del
LED se conecta al GND de la Raspberry Pi. Cuando se le dan diferentes valores de
PWM a los tres pines, el LED RGB mostrará diferentes colores.
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
============ ======== ======== ===
.. image:: img/rgb_led_schematic.png
Procedimientos Experimentales
-------------------------------------
**Paso 1:** Construir el circuito.
.. image:: img/image61.png
:width: 6.59097in
:height: 4.29722in
**Paso 2:** Ir a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.1.2/
**Paso 3:** Compilar el código.
.. raw:: html
.. code-block::
gcc 1.1.2_rgbLed.c -lwiringPi
.. note::
Cuando se ejecute la instrucción "gcc", si no se llama a "-o", el archivo ejecutable se nombrará "a.out".
**Paso 4:** Ejecutar el archivo ejecutable.
.. raw:: html
.. code-block::
sudo ./a.out
Después de que se ejecute el código, verás que el RGB muestra rojo, verde,
azul, amarillo, púrpura y cian.
.. note::
Si no funciona después de ejecutarlo, o si aparece un mensaje de error: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`.
**Código**
.. code-block:: c
#include
#include
#include
#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){ //si la inicialización de wiring falla, printf mensaje en pantalla
printf("setup wiringPi failed !");
return 1;
}
ledInit();
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;
}
**Explicación del Código**
.. code-block:: c
#include
La biblioteca utilizada para realizar la función pwm del software.
.. code-block:: c
void ledInit(void){
softPwmCreate(LedPinRed, 0, 100);
softPwmCreate(LedPinGreen,0, 100);
softPwmCreate(LedPinBlue, 0, 100);
}
La función utiliza software para crear un pin PWM, estableciendo su período
entre 0x100us-100x100us.
El prototipo de la función softPwmCreate(LedPinRed, 0, 100) es el siguiente:
.. code-block:: c
int softPwmCreate(int pin,int initialValue,int pwmRange);
* **Parámetro pin:** Cualquier pin GPIO de Raspberry Pi puede configurarse como un pin PWM.
* **Parámetro initialValue:** El ancho del pulso inicial es ese valor inicial multiplicado por 100us.
* **Parámetro pwmRange:** el período de PWM es ese rango pwm multiplicado por 100us.
.. code-block:: c
void ledColorSet(uchar r_val, uchar g_val, uchar b_val){
softPwmWrite(LedPinRed, r_val);
softPwmWrite(LedPinGreen, g_val);
softPwmWrite(LedPinBlue, b_val);
}
Esta función establece los colores del LED. Usando RGB, el parámetro formal **r_val**
representa la luminiscencia del rojo, **g_val** del verde, **b_val** del azul.
El prototipo de la función softPwmWrite(LedPinBlue, b_val) es el siguiente:
.. code-block:: c
void softPwmWrite (int pin, int value) ;
* **Parámetro pin:** Cualquier pin GPIO de Raspberry Pi puede configurarse como un pin PWM.
* **Parámetro Value:** El ancho del pulso de PWM es el valor multiplicado por 100us. Ten en cuenta que el valor solo puede ser menor que el rango pwm definido anteriormente; si es mayor que el rango pwm, se le asignará un valor fijo, el rango pwm.
.. code-block:: c
ledColorSet(0xff,0x00,0x00);
Llama a la función definida anteriormente. Escribe 0xff en LedPinRed y 0x00
en LedPinGreen y LedPinBlue. Solo el LED rojo se encenderá después de ejecutar
este código. Si deseas encender LEDs en otros colores, simplemente modifica
los parámetros.