Raspberry PI y los pines GPIO: Controlando un LED con Bash y con Python

En la anterior entrada vimos que eran los pines GPIO y algunos ejemplos de aplicaciones prácticas, hoy nos vamos a centrar en el funcionamiento de los pines de propósito general, y aprenderemos a controlarlos con el interprete de ordenes Bash y con Python.

proto&led

Para ello utilizaremos un LED, una resistencia de 330 ohmnios, alambre, y una protoboard, o estaño y un soldador.

Además necesitaremos que nuestra Raspberry tenga ya Raspbian preinstalado, si no es vuestro caso, podéis ver como hacerlo en el siguiente enlace del directorio.

Montando el circuito

Podéis soldar directamente el LED al alambre y a la resistencia como veréis en el siguiente diagrama, aunque es mucho mejor utilizar una protoboard; también es muy importante fijarse bien tanto en las patillas, como en la “diagonal” interior del diodo LED donde se unen las dos patillas al montar el circuito, ya que si lo montamos del revés no encenderá.

Circuito necesario para controlar el encendido de un diodo LED.

Circuito necesario para controlar el encendido/apagado de un diodo LED.

Yo voy a utilizar una protoboard, y os recomiendo que utilicéis una, las hay desde aproximadamente 4€ y nos permiten reutilizar los componentes una y otra vez sin necesidad de soldarlos, las conexiones internas de una protoboard suelen ser las siguientes.

protocon

Conexiones de una protoboard.

Las conexiones entre la protoboard y la Raspberry deben ser como en el siguiente diagrama, el GPIO puede llegar a emitir 3,3V al asignarle un valor lógico alto.

Circuito en Protoboard.

Circuito necesario para controlar el encendido/apagado de un diodo LED.

Hello World del GPIO con Bash

Una vez montado el circuito, vamos a hacer lo que yo llamo un “Hello World GPIO” en Bash ejecutando el siguiente script.

#!/bin/bash
#Exportamos el puerto GPIO 17 
echo 17 > /sys/class/gpio/export 
#Lo configuramos como salida 
echo out > /sys/class/gpio/gpio17/direction 
#Encendemos el LED asignandole 1 como valor lógico
echo 1 > /sys/class/gpio/gpio17/value

Para apagar el LED lo podemos hacer con el siguiente script.

#!/bin/bash
#Apagamos el LED asignandole 0 como valor lógico
echo 0 > /sys/class/gpio/gpio17/value  
#Eliminamos la entrada del puerto GPIO 17 
echo 17 > /sys/class/gpio/unexport 

Básicamente lo que estamos haciendo con Bash es crear una jerarquía de directorios en /sys/class/gpio y añadir contenido a cada archivo que será tratado después como una variable.

jerarquia

Jerarquía dentro del directorio /sys/class/gpio.

Introducción a Python

Ya hemos comprobado que nuestro circuito funciona correctamente y el LED se ha encendido al darle un valor lógico alto a la variable, ahora veamos como podemos hacer lo mismo en python, lo que nos va a permitir programar nuestras aplicaciones web para controlar las entradas y salidas del GPIO desde cualquier dispositivo.

funcweb

Funcionamiento mediante aplicación WEB.

Antes de seguir, os recomiendo que veáis los capítulos del 1 al 10 de este videotutorial de Python del canal de Youtube de Código Facilito, si como yo no tenéis mucha idea de programar en Python, os puede venir muy bien para familiarizaros con el código que vamos a ver mas adelante y llegar a entenderlo.

Diferentes Pinouts del GPIO (BCM y Board)

Hay dos tipos de numeración de los pines, la numeración física o modo BOARD, y la numeración del chip SoC Broadcom que los controla, nosotros vamos a utilizar el pinout en modo BCM, pero veamos la diferencia.

BCMvsBOARD

Hello World del GPIO con Python

Después de ver los vídeos, y los diferentes pinouts ya podemos entender el código básico para hacer el “Hello World GPIO” en Python.

Primero vamos a descargar todo lo necesario para controlar el GPIO con Python, en Raspbian ya vienen instalados Python y las librerías GPIO, pero vamos a instalar un paquete adicional y a actualizar el sistema para tener la última versión.

usuario@maquina:~$ sudo apt-get install python-dev
usuario@maquina:~$ sudo apt-get install python-rpi.gpio
usuario@maquina:~$ sudo apt-get update && sudo apt-get upgrade

Una vez actualizado, veamos como encender el LED con el siguiente script, al que podemos llamar por ejemplo enciende.py, y podemos ejecutarlo como root con el comando “sudo python enciende.py”.

#!usr/bin/env/ python
#enciende.py
#importamos la libreria GPIO
import RPi.GPIO as GPIO 
#Definimos el modo BCM 
GPIO.setmode(GPIO.BCM) 
#Ahora definimos el pin GPIO 17 como salida
GPIO.setup(17, GPIO.OUT) 
#Y le damos un valor logico alto para encender el LED
GPIO.output(17, GPIO.HIGH) 

Con este podemos apagarlo, llamémosle por ejemplo apaga.py

#!usr/bin/env/ python
#apaga.py
#importamos la libreria GPIO
import RPi.GPIO as GPIO 
#Definimos el modo BCM
GPIO.setmode(GPIO.BCM)  
#Ahora definimos el pin GPIO 17 como salida
GPIO.setup(17, GPIO.OUT) 
#Y le damos un valor logico bajo para apagar el LED
GPIO.output(17, GPIO.LOW) 
#Finalmente liberamos todos los pines GPIO, es decir, los desconfiguramos)
GPIO.cleanup() 

Y con este al que llamaremos parpadea.py, haremos parpadear el LED.

#!usr/bin/env/ python
#parpadea.py
#importamos la libreria GPIO
import RPi.GPIO as GPIO 
#Importamos la libreria time
import time 
#Definimos el modo BCM 
GPIO.setmode(GPIO.BCM) 
#Ahora definimos el pin GPIO 17 como salida
GPIO.setup(17, GPIO.OUT) 
#Queremos que lo que contenga el for i in range se repita 5 veces
for i in range(0,5): 
        #Asignamos valor logico alto para encenderlo
               GPIO.output(17, GPIO.HIGH) 
        #Esperamos un segundo
               time.sleep(1)
        #Asignamos valor logico bajo para apagarlo
         GPIO.output(17, GPIO.LOW) 
        #Esperamos un segundo
         time.sleep(1) 
#Una vez termina las 5 repeticiones, liberamos el pin GPIO utilizado; en este caso el 17
GPIO.cleanup() 

Si no importamos la librería “time“, no podremos añadir el “sleep“, y si no añadimos el “sleep” de un segundo entre encendido y apagado, es muy posible que nuestro ojo no llegue a percibir el parpadeo.

Es muy importante no añadir caracteres especiales en los scripts en Python, por eso los comentarios no llevan acentos, ya que daba error de carácter invalido.

En la siguiente entrada veremos como hacer una sencilla aplicación Web que nos permita ejecutar estos scripts, para así poder controlarlo desde cualquier dispositivo con navegador web.

Si te ha gustado puedes seguirme en Twitter, Facebook, Google+, Linkedin, o compartirlo con los botones ubicados debajo de esta publicación, si tienes cualquier pregunta o sugerencia no dudes en comentar.

Ayudanos a llegar a más lectores Share on LinkedInShare on FacebookTweet about this on TwitterShare on Google+Email this to someone

16 pensamientos en “Raspberry PI y los pines GPIO: Controlando un LED con Bash y con Python

  1. tengo una duda de novato…
    porque la resistencia de 330 ohmnios y cuando hay que utilizarla?

    Siempre se utilizan de 330 cuando trabajamos con RPI, o puede variar?

    Un saludo y excelente blog!!!

    • Hola Pedro,

      En principio debería funcionar, solo les ha dado error por permisos a algunas personas pero ejecutándose desde la aplicación web, ya que el usuario www-data por defecto no tiene dichos permisos.

      Por si acaso pruebe ejecutando “sudo chmod +x script.py” para volverlo ejecutable, aunque sin serlo debería funcionar igual desde terminal; puede enseñarme si le devuelve algún error en la terminal al ejecutar el script¿?

      Muchas gracias por su comentario.

  2. Hola,
    estoy intentando encender un LED a través de python siguiendo la guía que muestras pero me da el siguiente error cuando ejecuto el código éste:

    import RPi.GPIO as GPIO

    Error:
    -bash: import: no se encontró la orden

    ¿Sabes a qué se debe este error?

    Gracias y enhorabuena por el blog me está sirviendo de mucho!

    • Hola Nano, gracias por comentar.

      Parece que el código está siendo interpretado por Bash y no por Python.

      ¿Estás ejecutando el script, o las líneas de código en la terminal directamente?

  3. Buenas de nuevo,
    algo que no entiendo es la primera línea de código: #!usr/bin/env/ python
    ¿para qué sirve?
    veo que funciona igual con o sin ella

    • Hola Nano, bienvenido otra vez.

      La línea que comentas es la declaración que se suele incluir al inicio de un script para indicarle a la terminal donde se encuentra el intérprete al que debe pasarle las órdenes, en este caso Python; para bash sería la siguiente:

      #!/bin/bash

      En este caso funciona con la declaración y sin ella puesto que el archivo tiene extensión .py, pero es una buena práctica añadirla siempre.

      Espero haber despejado tus dudas, vuelve por aquí cuando quieras y muchas gracias por tu comentario 🙂

  4. Gracias, el tutorial esta excelente, pero tengo una duda:

    me salen los siguientes errores:

    linea 12 import:not found
    linea 14 syntax error: word unexpected (expecting “)”)

    Mi codigo es:

    #gpio-setup.py
    ### BEGIN INIT INFO
    # Provides: gpio-setup.ch
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Setup mode gpio
    # Description: Setup gpio 22/27/17/4 mode out
    ### END INIT INFO

    import RPi.GPIO as GPIO
    #Definimos el modo BCM
    GPIO.setmode(GPIO.BCM)
    #Ahora definimos los pines GPIO como salida
    GPIO.setup(4, GPIO.OUT)
    GPIO.setup(17, GPIO.OUT)
    GPIO.setup(27, GPIO.OUT)
    GPIO.setup(22, GPIO.OUT)

    Alguna idea???

    • Hola Leoctam, gracias por comentar.

      Las primeras líneas dan a entender que estas intentando crear un demonio del sistema, pero están comentadas por lo que no se tendrán en cuenta.

      Por otro lado, el código que estás utilizando para interactuar con los GPIO es Python, por lo que debes alojarlo en un script .py que será invocado desde tu demonio del sistema, o utilizar Bash para ello como en el primer ejemplo de este tutorial.

Deja un comentario