domingo, 27 de enero de 2013

Controlar 4 LEDs con los GPIOs de la Raspberry Pi

Controlar 4 LEDs con los GPIOs de la Raspberry Pi


Ahora que ya supimos como Controlar un LED con los GPIOs de la Raspberry Pi en este proyecto aumentaremos un poco la complejidad al controlar 4 LEDs en una secuencia que nos permitira contar en binario del cero al nueve y ademas rutear esa salida hacia un circuito integrado 7447 para poder desplegar los dígitos en un display de 7 segmentos.


Material necesario


- 4 LEDs
- 1 IC 7447
- Protoboard
- Display de 7 segmentos con cátodo común

En este proyecto manipularemos 4 GPIOs, uno para cada uno de los LEDs, ademas de ahi conectaremos tambien las entradas de IC 7447 tal como se muestra en el diagrama a continuación:

Lo que haremos basicamente en el código sera inicializar los GPIOs como salidas, después crearemos  una lista de 10 elementos, cada elemento será a su vez una lista que contendrá los valores binarios ordenados para generar la secuencia que necesitamos.

Recorreremos cada uno de los elementos de la lista de listas para identificar que LEDs deberemos de encender, haremos una pausa de un segundo y después continuaremos.
El código en Python se muestra a continuación:



#!/usr/bin/env python

# Import required libraries
import time
import math
import RPi.GPIO as GPIO

# Set up the GPIO mode
GPIO.setmode(GPIO.BCM)

#Initialize a list with the GPIO pin numbers we are going to use
gpiopins = [14,15,18,23]

# Set up pins listed as outputs
for p in gpiopins :
 print "Setup GPIO" + str(p) + " for OUTPUT"
 GPIO.setup(p, GPIO.OUT)
 GPIO.setup(p, GPIO.LOW)
print "Setup completed."


#Initialize a list with the binary values for the first 10 deciimal values
binary = [ [0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],[1,0,0,0],[1,0,0,1] ]

print "Start loop"
while True :
 digit = 0
 while digit < 10 :
  print "Decimal: " + str(digit) + " Binary: " + str(binary[digit])
  for x in range(0,4) :
   GPIO.output(gpiopins[x], binary[digit][x])
   print "pin = " + str(gpiopins[x]) + " valor = " + str(binary[digit][x])
  time.sleep(1)
  digit = digit + 1

El resultado es mostrado en el siguiente video:



Si tienes cual duda comentario, corrección o sugerencia, por favor házmelo saber en los comentarios de este blog.

domingo, 6 de enero de 2013

Controlar un LED con los GPIOs de la Raspberry Pi

Hello World


El probable equivalente del "Hello World" de la programación común cuando trabajas con interfaces de hardware es el "LED blink", y es esto precisamente lo que tendremos listo al terminar estos pasos.

¿GPIOs? ¿cuales son? ¿como funcionan?


¡Advertencia!
Lo primero que debemos de entender es que son los GPIOs, cuales son y como funcionan antes de comenzar a usarlos, pues muchos de estos pines exponen directamente conexiones al SoC, por lo que un corto o un voltaje inducido de manera incorrecta puede causar un daño permanente a tu Raspberry Pi y de ninguna manera tomare responsabilidad por cualquier daño que sea causado inmediatamente o en el largo plazo por cualquier información publicada en este sitio.

Ahora si, GPIO son las siglas en ingles de General Purpose Inputs and Ouputs que significa Entradas y Salidas de Propósito General. Si tomamos la Raspberry Pi con los conectores USB del lado derecho y el lector de SD del lado izquierdo, encontraremos dos filas de 13 pines en la esquina superior izquierda, con el pin mas cercano al borde de la tarjeta en la fila de abajo marcado como P1. Esos 26 pines tienen funciones definidas para SPI o I2C, sin embargo, nosotros los podemos reconfigurar para que todos sean puertos digitales de entrada/salida. Nosotros podremos utilizar 17 de estos pines y configurar cada uno de ellos ya sea como puerto de entrada o de salida.

¿Que sucede con los 9 pines restantes? pues bien, son pines que entregan voltaje ya sea a 3.3V (2 pines), 5V (2 pines) o conexión a tierra (5 pines).

Para identificar los pines cuando programamos con la libreria RPi.GPIO necesitamos identificar su índice, y para esto hay dos maneras, una identificada como BCM y la otra llamada BOARD. El número que identifica al pin en el modo BCM es el que esta después de la palabra GPIO en los siguientes diagramas, el índice para identificar los pines en modo BOARD son los que están dentro del circulo. Es importante mencionar que la identificación de los pines en modo BCM cambio entre la revisión 1 y la revisión 2 del hardware.

Cabe destacar que los pines en blanco, originalmente fueron identificados como DNC (Do Not Connect) o No Conectar, pues se reservaban el derecho de cambiarlos de uso, sin embargo, cuando la revisión 2 del Modelo B de la Raspberry Pi fue distribuida al público, se confirmo y documento oficialmente la función de estos pines. Mas información al respecto en http://elinux.org/RPi_BCM2835_GPIOs en inglés.

Identificación de los GPIOs en modo BCM y BOARD en la revisión 1 del hardware


Identificación de los GPIOs en modo BCM y BOARD en la revisión 2 del hardware

Proto Board

Mi sugerencia aqui es preparar un cable plano de 26 vias de una longitud adecuada a tus necesidades, poner un conector IDC-26 hembra en uno de los extremos y en el otro separa cada uno de los hilos y soldar cuidadosamente un pin para despues recubrirlo con thermo-fit, de tal manera que se puedan conectar individualmente en el protoboard.


El Código


#!/usr/bin/env python

# Import required libraries
import time
import RPi.GPIO as GPIO

# Set up the GPIO mode
GPIO.setmode(GPIO.BCM)

# Set up header pin 6 as an input
print "Setup Pin 0"
GPIO.setup(0, GPIO.OUT)

var=1
print "Start loop"
while var==1 :
 print "Set Output False"
 GPIO.output(0, False)
 time.sleep(1)
 print "Set Output True"
 GPIO.output(0, True)
 time.sleep(1)


¿Como conectar el LED?

Como se puede ver en el código, estamos utilizando el modo BCM para la identificación de los pines individuales, por lo que el pin 0 que estamos configurando como salida es el pin que se encuentra inmediatamente a la derecha del marcado como P1 en la Raspberry Pi.

El Resultado


Creditos

Los gráficos de los GPIOs fueron tomadas de http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/