Introducción GPIO raspberry pi: led RGB

Hoy enseñaré una introducción al manejo de los pines de una raspberry pi usando el comando gpio o usando la misma librería de ese comando en c.

La librería en cuestión es wiringPI, y con ella podemos usar nuestra raspberry para leer o escribir en cada pin como un arduino.

¿Ventajas sobre arduino?

  • Posibilidad de hacer programas más complejos , grandes y paralelos.
  • Velocidad mucho mayor
  • Muchos puertos para conectar sensores/leds/motores
  • Todos los pines son de entrada y salida
  • PWM por software en todos los pines con la librería wiringPI

Usaremos 2 leds SMD 5050 conectados en paralelo.

Estos leds vienen en tiras de decenas de ellos y su consumo viene descrito en la pegatina (o en el datasheet) 

Requiere 2.2v (máximo) para el led rojo y 3.2v para el verde y azul.

Para ello en el esquema de arriba he usado una resistencia de 2Ω en los leds de color verde y azul, y una de 30Ω (dos de 18 en serie, que es lo que tenía por casa) para el led rojo.

Es básicamente ley de ohm:

  • LED verde y azul: 3.3v(entrada) – 3.2v(led) / 2(leds)*20mA(cada led) = 2.5Ω aunque nos jugamos la vida poniendo 2 en vez de 2.5… nah es broma, en el mundo real las piezas tienen tolerancia y además el circuito suele añadir más impedancia (cables…).
  • LED rojo: 3.3-2.2 / 2*20 = 27.5Ω

Esto va a ser un preparativo para probar la librería wiringPI para el robot araña que voy a hacer, y los leds serán los ojos de la araña.

Al ser de color variante, tenemos la posibilidad de alertar si la batería está baja cambiando de color los ojos, variar el color si los motores se mueven como test de funcionamiento …

 

SOLDAMOS

 

La parte más tediosa: soldar.

Soldamos en paralelo los cables de la entrada al led azul, al rojo, al verde, y a su otro extremo sus correspondientes resistencias.

Los leds smd5050 son tan pequeños que tampoco había opción a soldarlos a una tarjeta de circuito.

Como veis al final quedan solo 4 cables: los 3 pines de los colores que vamos a ordenar encenderse a nuestro gusto, y el cable de salida a tierra.

 

PROBAMOS CON ARDUINO

La primera prueba ha sido con arduino.

He reutilizado el código de la lámpara led que restauré para testearlo.

El código inicialmente enciende cada led por separado como método de testeo, luego todos juntos, y después se queda en un bucle de cambio de colores de manera progresiva.

Aunque arduino suelta 5v de salida por cada pin, nos la hemos jugado (de todas formas la salida está limitada a 20mA y es una prueba corta)

 

RASPBERRY PI ZERO

 

¡Ahora si! ya estamos preparados para darle vida a la pi.

Tenemos varias alternativas, una es usando el comando gpio para leer/escribir los pines y otra es con un pequeño programa (c o python).

La desventaja de usar gpio con comandos es que no tiene una función prediseñada de pwm, así que solo podremos poner el led en su estado máximo y no podremos conseguir colores intermedios entre el rojo, verde y azul.

Esto lo solventaremos compilando un programita en c muy sencillito.

 

PWM POR SOFTWARE CON LA LIBRERÍA WIRINGPI

Aquí podemos ver el resultado usando el código del programita en c que usé con arduino para cambiar los colores de manera progresiva.

Lo único que cambia es:

  • añadir las liberías wiringPi.h y softPwm.h
  • arrancar la librería con wiringPiSetup()
  • Iniciar el pin como pwm por software con softPwmCreate(pin,valor_min,valor_max)
  • Mandar la salida con softPwmWrite(pin,valor)

Debajo añado el código.

 

Para compilarlo basta con:
gcc -o colores colores.c -lwiringPi -lpthread

#include <wiringPi.h>
#include <softPwm.h>
#define PIN_R 27
#define PIN_G 28
#define PIN_B 29
#define SPEED 15
int main ()
{
	int r=255;int g=0;int b=0;
	if (wiringPiSetup () < 0)
	{
		return 1 ;
	}
	softPwmCreate (PIN_R, 0, 255) ;
	softPwmCreate (PIN_G, 0, 255) ;
	softPwmCreate (PIN_B, 0, 255) ;

	softPwmWrite(PIN_R, r);     softPwmWrite(PIN_G, g);    softPwmWrite(PIN_B, b);
	
	for (;;)
	{		
		  r=255;  g=0;  b=0;//ROJO A AMARILLO
		  for(g=0;g<255;g++)
		  {
			softPwmWrite(PIN_G, g);
			delay(SPEED);
		  }
		  r=255;  g=255;  b=0;//AMARILLO A VERDE 
		  for(r=255;r>0;r--)
		  {
			softPwmWrite(PIN_R, r);
			delay(SPEED);
		  }
		  r=0;  g=255;  b=0;//VERDE A CYAN
		  for(b=0;b<255;b++)
		  {
			softPwmWrite(PIN_B, b);
			delay(SPEED);
		  }
		  r=0;  g=255;  b=255;//CYAN A AZUL
		  for(g=255;g>0;g--)
		  {
			softPwmWrite(PIN_G, g);
			delay(SPEED);
		  }
		  r=0;  g=0;  b=255;//AZUL A MAGENTA
		  for(r=0;r<255;r++)
		  {
			softPwmWrite(PIN_R, r);
			delay(SPEED);
		  }
		  r=255;  g=0;  b=255;//MAGENTA A ROJO
		  for(b=255;b>0;b--)
		  {
			softPwmWrite(PIN_B, b);
			delay(SPEED);
		  }  
	}
}

GPIO CON COMANDOS

El manejo de los pines con el comando gpio es sencillo.

Para ponerlo en modo de salida usamos:

gpio mode <PIN> out

Y para que se encienda:

gpio write <PIN> 1

gpioled_pinout

Deja un comentario

Tu dirección de correo electrónico no será publicada.

*

code

nasa pic of the day
laresistenciadelbit/wp_githubin

wordpress plugin for embedding github content

laresistenciadelbit/narpa

(N)o (A)(R)(P) (A)ttacks

laresistenciadelbit/bats

some of my scripts for dayly use

laresistenciadelbit/beacon

android beacon position triangulation app

laresistenciadelbit/androidTabs

example of dynamic scrolling tabs and dynamic sliding tabs for android studio

laresistenciadelbit/login_space

script for changing your login screen to last nasa uploaded picture

laresistenciadelbit/d2gls

(D)iablo (2) (g)ame (l)ist (s)niffer

laresistenciadelbit/wp_nasapic

wordpress plugin for a widget with the last nasa uploaded picture.

laresistenciadelbit/starfield

draw a star field in js moving in the desired direction

laresistenciadelbit/drone

quadcopter made with arduino (arduino pro micro + modules)