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.
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á.
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.
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.
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.
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.
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.
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.
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!!!
La capacidad de la resistencia depende del componente que le conectes al GPIO y los voltajes a los que funcione ese componente.
Disculpa pero estos días he tenido mucho trabajo, que es exactamente lo que quieres conectar? 🙂
Hola no me funciona, y pues segui los pasos al pie de la letra con python, hay que darle permiso de ejecucion al archivo de python?
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.
Buenas, cuando introduzco el script en python, me indica que el arroba es un SyntaxError ¿Qué puede ser? Gracias y saludos.
Me resulta muy extraño, ya que en el script no hay ninguna @, podrías dar mas detalles del error?
Hasta pronto, y gracias por comentar.
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?
Hmm lo estaba ejecutando desde el terminal…error gordo jeje (soy nuevo con la raspberry me lo puedo permitir todavía =P )
Me alegro de que se haya solucionado!!!
Gracias por comentar, no dudes en hacerlo si tienes cualquier duda; entre los lectores y yo te echaremos una mano.
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 🙂
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.
hola, yo también soy nuevo, y me sale error en lo siguiente
GPIO.setup(17, GPIO.OUT)