lunes, 19 de diciembre de 2016

Controlar dos LEDs con Python (Parte 4)

En este post os voy a mostrar como usar los puertos GPIO y un pequeño programa en Python para controlar dos leds a la vez.

Para ello voy a usar una placa protoboard, cables de conexión, 2 leds , 2 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 2 leds a la vez. Aquí os dejo una imagen para que veáis la distribución que he usado



si no habéis leído los anteriores post sobre leds os recomiendo hacerlo (sobretodo el primero), ya que en él detallo el uso de las conexiones y hay un apartado al final sobre el uso de las resistencias, aquí está el link.


2. Código Python

Hoy vamos a crear un pequeño programa en python que al ejecutarlo encienda un led o el otro. 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.

El circuito anterior nos sirve para que modificando el uso de los puertos GPIO (transformándolos en puerto de positivo a negativo), se encienda el primer o el segundo led. El siguiente código es un poco más complejo que los anteriores ya que incluyen el uso de listas, pero creo que es lo suficientemente claro.

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]
# creamos una lista con tres registros 0,1,2
# cada uno tiene dos valores el primero es el
# estado del pin1 (18) y el segundo, del pin2 (23)
pin_led_states=[[0,1], # A
                [1,0], # B
                [0,0], # apagado
                ]
# definimos el tipo de identificacion de los puertos GPIO
GPIO.setmode(GPIO.BCM)
# definimos una funcion para camnbiar el estado del GPIO
# recibe 2 parametros, el pin y el estado
def set_pin(pin_index,pin_state):
    # definimos el estado del pin como de salida
    GPIO.setup(pins[pin_index],GPIO.OUT)
    # cambiamos el estado del pin a 0 o 1
    GPIO.output(pins[pin_index],pin_state)
# definimos una funcion que recibe un parametro 0,1 o 2
def light_led(led_number):
    # bucle que recupera valores de la lista de pin_led_states
    for pin_index, pin_state in enumerate(pin_led_states[led_number]):
        # llamamos a la funcion que cambia el estado de los pines
        # activando o desactivando los leds
        set_pin(pin_index,pin_state)
# por defecto ponemos el pin 0 a estado 0
set_pin(0,0)
# por defecto ponemos el pin 1 a estado 0
set_pin(1,0)
# bucle que se repite indefinidamente
while True:
    # pedimos al usuario que introduzca un valor
    x=int(input("Pin (0 to 2):"))
    # 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 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, en la pantalla aparecerá un texto que nos pide introducir un valor de 0 a 2.
Si introducimos el valor 0 el led rojo se enciende, si luego ponéis el valor 1 se encenderá el led amarillo, si ponéis el valor 2 se apagan ambos.
Lo que hacemos es jugar con los puertos 18 y 23, intercambiando el estado de los mismos de positivo a negativo, de esta forma con solo dos puertos podemos controlar dos leds.
Al introducir el valor 0 se llama a la función ligth_led que selecciona los valores [1,0] de la lista pin_led_states con un bucle los recorre y llama a la función set_pin que indica al pin correspondiente (18 o 23), el estado que debe tener (1 o 0).
Evidentemente os podéis ahorrar las listas y los bucles y crear otro código más sencillo, pero es una forma fácil de empezar a usar funciones.

Si estáis usando Python2 en lugar de la línea de código x=int(input("Pin (0 to 2):")), tendréis que usar

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

Espero que os sea útil, el próximo día aprenderemos a controlar 6 leds con 3 puertos GPIO.