martes, 3 de enero de 2017

Controlar múltiples LEDs con Python (Parte 5)

En este post os voy a mostrar como usar los puertos GPIO y un pequeño programa en Python para controlar varios led a la vez, este ejercicio se basa en un sistema de control que llama multiiplex o charlieplexing, y se usa de forma común en circuitos de electrónica. El ejercicio lo vi en el libro: Raspberry Pi 200 ejercicios prácticos de Simon Monk, muy recomendable para introducirse en el mundo de la Raspberry Pi y empezar a trastear con nuestro dispositivo.

Para ello voy a usar una placa protoboard, cables de conexión, 6 leds , 3 resistencias y mi RaspberryPi. Si sois nuevos en esto os aconsejo leer los anteriores posts (del uso de los GPIO en el apartado Programación/GPIO).


1. Organización del circuito

En primer lugar vamos a ver como nos debe quedar nuestro circuito para poder controlar varios leds a la vez. Aquí os dejo una imagen para que veáis la distribución que he usado, tened cuidado y respetad la posición de los polos positivo y negativo de los leds



si no habéis leído los anteriores post sobre leds os recomiendo hacerlo (sobretodo el primero y el anterior), en el primero detallo el uso de las conexiones y hay un apartado al final sobre el uso de las resistencias, aquí está el link. En el anterior post el código que usé es una introducción al código de este ejemplo.


2. Código Python

Hoy vamos a crear un pequeño programa en python que al ejecutarlo podemos introducir diferentes valores (del 0 al 6), y con ello conseguimos encender los diferentes leds. Si no sabéis como crear un archivo con un programa en python os recomiendo leer los post sobre programación python del apartado Programación/GPIO del blog.

En primer lugar abrimos el IDLE de Python en nuestra RaspberryPi (yo uso Python3), una vez abierto creamos un nuevo fichero (en el menú File-New File) y introducimos el siguiente código

# importamos la libreria GPIO
import RPi.GPIO as GPIO
# creamos una lista con los pines GPIO
pins=[18,23,24]
# creamos una lista con los estados que 
# pueden tener los 3 pines (18,23 i 24)
pin_led_states=[[1,0,-1], # A
                [0,1,-1], # B
                [-1,1,0], # C
                [-1,0,1], # D
                [1,-1,0], # E
                [0,-1,1], # F
                [0,0,0]   # apagar
                ]
# definimos el tipo de identificacion de los puertos GPIO
GPIO.setmode(GPIO.BCM)
# definimos una funcion para cambiar el estado del GPIO
# recibe dos parametros, el pin y el estado
def set_pin(pin_index,pin_state):
    # si el estado es -1, el puerto es de Entrada
    if pin_state==-1:
        GPIO.setup(pins[pin_index],GPIO.IN)
    # si el estado es 0 o 1 el puerto es de salida
    else:
        GPIO.setup(pins[pin_index],GPIO.OUT)
        GPIO.output(pins[pin_index],pin_state)
# definimos una funcion que recibe un parametro 1,2,3,4,5 o 6
def light_led(led_number):
    # bucle que recupera los valores de la lista de pin_led_states
    for pin_index, pin_state in enumerate(pin_led_states[led_number]):
        # llamamos ala funcion que cambia el estado de los pines
        # actvando o desactivando los leds
        set_pin(pin_index,pin_state)
# por defecto ponemos los tres pines a -1
set_pin(0,-1)
set_pin(1,-1)
set_pin(2,-1)
# bucle que se repite indefinidamente
while True:
    # pedimos al usuario que introduzca un valor
    x=int(input("Pin (0 to 6):"))
    # llamamos a la funcion

    light_led(x)

guardamos el archivo en una ubicación conocida (en el menú File-Save As), si es necesario apuntad la ruta por si la necesitáis usar más tarde. 

Podemos ejecutar directamente este pequeño programa presionando la tecla F5 (también se puede ejecutar des de el menú Run-Run Module)

Si todo es correcto se abre una nueva ventana de IDLE de python y empieza la ejecución, Aparecerá un texto que nos pide introducir un valor de 0 a 6. Si introducimos el valor 0 se enciende el led superior izquierdo, con el valor 1 se enciende el led superior derecho, con el 2 el led inferior izquierdo, con el 3 el led inferior derecho, con el 4 el led central izquierdo, con el 5 el led central derecho, con el valor 6 se apagan todos los led. Y todo ello con solo tres pines GPIO (18, 23 y 24). El funcionamiento es simple como en el ejercicio anterior he usado dos listas, la diferencia es que he añadido el estado -1, esto hace que la función set_pin ponga el puerto como Entrada (GPIO.IN), mientras que los estados 0 o 1 ponen el correspondiente puerto como Salida (GPIO.OUT) con valor positivo o negativo, de esta forma alternando los estados de Entrada-Salida de los GPIO y jugando con la salida positiva-negativa controlamos los diferentes leds.

Si estáis usando Python2 cambiad la línea x=int(input("Pin (0 to 6):")) por esta otra

x=int(raw_input("Pin (0 to 6):"))

Hasta pronto!