You are on page 1of 10

INTRODUCCIÓN

En este artículo vamos a ver cómo leer datos procedentes de una plataforma Arduino con Python. Para
quienes no lo conozcáis, Arduino es una plataforma de hardware libreconcebida para crear prototipos de
manera rápida y fácil usando componentes electrónicos. Gracias a Arduino vamos a alejarnos un poco de lo
que solemos ver en este blog, que es solo software, y vamos a poder interactuar con el mundo real de una
manera más directa.

Este artículo nace gracias a mi reciente incorporación a Aerobot, el club de robótica de mi escuela, donde iré

explorando las posibilidades de Arduino y Python


En esta entrada se han usado python 3.3.3, numpy 1.8.0, pyserial 2.7 y matplotlib 1.3.1.

Prefacio: ¿cómo funciona?

En este artículo no vamos a ver en detalle qué es Arduino o el lenguaje con el que se programa. Para ello os
remito a gente que sabe mucho más que nosotros: al final del artículo incluyo unos enlaces que os pueden
interesar si queréis profundizar en este tema. Sin embargo, sí que vamos a explicar brevemente cómo es el
proceso de escribir un programa para Arduino, por razones que en seguida veremos.

Tal y como se detalla en la documentación, el proceso de compilación en Arduino funciona a grandes rasgos
de la siguiente manera:

1. Se escribe un programa (sketch) en el IDE de Arduino en C o C++.


2. El IDE comprueba que la sintaxis es correcta y añade #include "Arduino.h" y una función main() propia
de la placa.
3. El programa se compila con avr-gcc y se manda el binario a la placa.
4. Una vez Arduino tiene el programa y mientras esté alimentado, el programa se ejecutará, normalmente
de manera indefinida.
Esta explicación viene para aclarar que, al menos en este artículo, no vamos a programar nuestra placa en
Python. Por el proceso que hemos visto, las únicas maneras de hacer esto serían:
 Traducir un subconjunto de Python a C/C++, compilarlo y subirlo a la placa. Después de una búsqueda
rápida en Google no tengo noticias de que nadie haya intentado esto.
 Escribir un sketch que defina un protocolo de comunicación entre Arduino y Python. Este es el enfoque
tomado por estos proyectos:
 https://github.com/vascop/Python-Arduino-Proto-API-v2
 https://github.com/thearn/Python-Arduino-Command-API
 https://github.com/lekum/pyduino
Con el segundo método no tenemos disponibles todas las funciones de Arduino, de modo que solo sirve
para prototipar programas. Hoy me voy a olvidar de esto y voy a usar Arduino para programar la placa y
Python para obtener los datos.

En esta entrada se han usado python 3.3.3, pyserial 2.7.

El concepto
Conceptualmente, el tutorial de hoy es muy sencillo. Tenemos un código en python ejecutándose dentro de
nuestro ordenador que envía mensajes (carácteres) a la placa Arduino. Ésta estará previamente cargada con
un código para recibir mensajes por serial y activar un actuador (un LED).

Material

 Un ordenador con python, pySerial y Arduino IDE


 Cable USB
 Placa Arduino
 LED y Servo

Controlar un LED con Python


Primero escribiremos el código en python que deberemos ejecutar en nuestro ordenador. Éste código lee un
carácter introducido por el usuario y lo envía por Serial a Arduino. Si se escribe una ‘s’, salimos del
programa. Recuerda cambiar el ‘/dev/ttyACM0’ de la línea 4 por el puerto de tu Arduino.
1 import serial #cargamos la libreria serial
2
3 ser = serial.Serial('/dev/ttyACM0', 9600) #inicializamos el puerto de serie a 9600 baud
4
5 #variable para almacenar el mensaje
6 #le asignamos un valor introducido por el usuario
7 print "Introduce un caracter ('s' para salir): "
8 entrada = raw_input()
9
10 while entrada != 's': #introduciendo 's' salimos del bucle
11
12 ser.write(entrada) #envia la entrada por serial
13 print "He enviado: ", entrada
14 print "Introduce un caracter ('s' para salir): "
15
16 entrada = raw_input() #introduce otro caracter por teclado
Guardamos este código en un fichero con extensión ‘.py’ . Ahora habrá que escribir el código para Arduino,
que sencillamente encenderá un LED al recibir ‘e’ por Serial y lo apagará al recibir ‘a’.
#define LED 13
1
int mssg = 0; //variable para guardar el mensaje
2
3
void setup()
4
{
5
pinMode(LED, OUTPUT); //establecemos 13 como salida
6
Serial.begin(9600); //iniciando Serial
7
}
8
9
void loop()
10
{
11
if (Serial.available() > 0)
12
{
13
mssg = Serial.read(); //leemos el serial
14
15
if(mssg == 'e')
16
{
17
digitalWrite(13, HIGH); //si entra una 'e' encendemos
18
}
19
else if(mssg == 'a')
20
{
21
digitalWrite(13, LOW); //si entra una 'a' apagamos
22
}
23
}
24
}
25

Y si habéis seguido todos los pasos debería funcionar correctamente. Ahora ya estamos preparados para
controlar algo más complejo como puede ser un Servo o un actuador por el estilo.

CONTROLAR ARDUINO CON PYTHON Y LA LIBRERÍA PYSERIAL


Python es uno de los lenguajes de programación que mayor auge han experimentado en los últimos
tiempos. Su sencillez de uso permite hacer rápidamente pequeños programas y scripts, con tiempos de
desarrollo muy cortos.
Esta sencillez ha hecho que Python se gane un hueco en el Internet de las cosas (IoT), donde destaca
por la facilidad para comunicar con diferentes dispositivos (ordenadores, tablet, smarthones), tanto por
cable, bluetooth, o Internet.

Por supuesto, el mundo de Arduino no resulta una excepción y resulta muy sencillo conectar Arduino
con Python, empleando el puerto serie y la librería PySerial.

En esta entrada veremos cómo conectar Arduino con Python y la librería PySerial, para emplearlo en
nuestros proyectos de electrónica, robótica e IoT.

La comunicación por puerto serie puede realizarse tanto por cable, como de forma inalámbrica por
bluetooth, como vimos en la entrada Conectar Arduino por Bluetooth con los módulos HC-05 ó HC-06

Para esta entrada emplearemos el puerto de Arduino. Si aún no estás familiarizado con el puerto serie,
puedes leer la entrada Comunicación de Arduino con puerto serie.

INSTALAR PYTHON Y PYSERIAL

Lo primero que necesitamos es tener instalado Python en nuestro dispositivo. Si aún no te has iniciado
con Python puedes consultar la entrada Nuestro primer programa en Python donde vimos cómo instalar
Python en Windows y Linux, y unos ejemplos básicos para introducir su uso.

Una vez que tengamos Python instalado para poder comunicarnos con Arduino necesitamos la
librería PySerial, que nos permite emplear de forma sencilla el puerto serie. La librería PySerial está
disponible en este enlace https://github.com/pyserial/pyserial

Descargamos y ejecutamos el instalador, para añadir la librería PySerial a nuestra instalación de


Python.

También podemos instalar la librería PySerial directamente desde Python, escribiendo el siguiente
comando desde una consola.

EJEMPLOS DE CÓDIGO

A continuación vamos a ver un par de ejemplos sencillos para empezar a probar y usar la librería
PySerial junto con Arduino.

RECIBIR INFORMACIÓN DESDE ARDUINO

En este primer ejemplo vamos a leer información enviada por Arduino, y capturada y mostrada en
pantalla por Python.
Para ello empezamos cargamos en Arduino el siguiente sketch, que simplemente envía
continuamente una vez por segundo el texto “Hola Mundo”.

Dejamos el sketch funcionando en Arduino, y vamos a realizar el script en Python. Creamos un


nuevo archivo de texto vacio, que guardamos con el nombre “read.py”. En su interior copiamos el
siguiente código.

Lo que hacemos es importar la librería Serial (PySerial) e instanciar un objeto PySerial, que hemos llamado
“arduino”. En el constructor del objeto Serial pasamos los parámetros del puerto serie que estemos
empleado.

Recuerda sustituir el puerto serie del código, en el ejemplo “COM4”, por el puerto serie
en el que tengas conectado Arduino.

A continuación, empleamos la orden “readline()” del objeto Serial para leer una línea enviada por
Arduino. Mostramos la línea en pantalla mediante la orden “Print()”
Finalmente mediante la orden “close()” cerramos el puerto serie.

Como vemos, emplear el puerto serie con PySerial es realmente sencillo. Lo único que puede parecer
extraño es por qué hemos tenido que importar la librería “time”.

El motivo es que desde que creamos el objeto Serial hasta realmente está disponible para ser usado,
se necesita un cierto tiempo para abrir el puerto serie. Por tanto, tenemos que introducir una espera
mediante la función “Sleep”, que pertenece a la librería “time”.

ENVIAR INFORMACIÓN A ARDUINO

En este segundo ejemplo vamos a enviar datos a Arduino desde Python. Para ello vamos a usar el
siguiente sketch que vimos en la entrada Comunicación de Arduino con puerto serie.

Este sketch recibe un número desde 1 a 9 y hace parpadear el LED integrado, conectado al PIN13, el
número de veces recibido. Cargamos el sketch en Arduino, e igual que antes lo dejamos funcionado.

En la parte de Python necesitaremos un nuevo script que llamaremos, por ejemplo “write.py”. En su interior
pegamos el siguiente código.

Como vemos la escritura es muy similar a la lectura. En primer lugar importamos la librería PySerial y
creamos un nuevo objeto de tipo Serial, indicando los valores del puerto serie que estemos empleando.
En esta ocasión, escribimos el valor mediante la función “write” (en el ejemplo, 9). La función “Write”
envía bytes, por lo que es necesario convertir el valor a bytes antecediendo una b al valor enviado (en el
ejemplo b’9’).

Por último, cerramos el puerto serie con la función “close()”.

Nuevamente hemos tenido que importar la librería time, para poder usar la función Sleep, y dar un
tiempo entre el inicio de la conexión del puerto serie y el envío de datos.

Con esto ya tenemos las funciones básicas para enviar y recibir información a Arduino desde Python,
empleando la librería PySerial para controlar el puerto serie. Resulta sencillo integrar estas funciones en
nuestros programas.

UN EJEMPLO COMPLETO

Realicemos ahora un pequeño proyecto que nos permita integrar todo lo que describimos en la
sección anterior. Vamos a usar un botón para controlar el prendido y apagado de un LED.

Además del Arduino Uno conectado vía USB a la computadora anfitriona, vamos a requerir el
siguiente hardware:

 Un protoboard.
 Un botón o pulsador (push button).
 Un LED (diodo emisor de luz).
 Una resistencia de 330Ω (bandas naranja, naranja, café).
 Una resistencia de 10KΩ (bandas café, negro, naranja).
 Cinco cables conectores.
La siguiente figura, elaborada con Fritzing, muestra la manera de conectar todos los
componentes:

Vista de protoboard Fritzing para


el LED controlado por un botón.
Usando un par de cables, conectamos un pin de tierra (GND) y un de pin de 5V del Arduino a los
buses respectivos de alimentación negativa (línea azul) y positiva (línea roja) del protoboard.

El ánodo del LED (la patita larga) se conecta al pin 12 del Arduino, mientras que el cátodo (la patita
corta) se conecta a la resistencia de 330Ω. El otro extremo de esta resistencia se conecta a tierra
(bus negativo).

El push button se coloca de tal forma que un par de patitas quede a la izquierda y el otro par a la
derecha del canal central del protoboard. Conectamos una de las patitas inferiores del botón al
bus positivo. Una de las patitas superiores del botón se conecta a una resistencia de 10KΩ,
mientras el otro extremo de la resistencia se conecta a tierra (bus negativo). La patita superior que
queda del botón se conecta al pin 8 del Arduino. Dada esta disposición, se dice que la resistencia
es de tipo pull-down. En términos prácticos esto significa que el valor que va leer el pin 8 por
omisión (cuando el botón no está presionado) es 0V, y 5V cuando el botón está presionado.

Físicamente las conexiones de nuestros componentes electrónicos se ven como se muestra en la


siguiente foto:

Vista física del LED controlado


por un botón.

El programa completo en Python 3.4 se muestra a continuación:

# Archivo: led_boton.py

import pyfirmata
placa = pyfirmata.Arduino('/dev/ttyACM0')

print('Firmata version: %d.%d' % placa.get_firmata_version())


print('pyFirmata version:', pyfirmata.__version__)

pyfirmata.util.Iterator(placa).start()

entrada = placa.get_pin('d:8:i')
entrada.enable_reporting()
salida = placa.get_pin('d:12:o')

try:
encendido = False
while True:
if entrada.read():
encendido = not encendido
salida.write(encendido)
placa.pass_time(0.2)

finally:
salida.write(False)
placa.exit()

Para correr el programa, requerimos ejecutar el siguiente comando desde una terminal en el
mismo directorio donde radica el archivo led_boton.py:

python3 led_boton.py

Cuando corremos el programa, el LED se prende cuando presionamos el botón y se apaga cuando
lo volvemos a presionar, y así indefinidamente hasta que presionemos Ctrl-C para terminar el
programa.
UNIVERSIDAD MAYOR DE SAN ANDRES
FACULTAD DE TECNOLOGIA
CARRERA DE ELECTRONICA Y TELECOMUNICACIONES

TRABAJO

TEMA: PYTHON PARA ARDUINO

MICROPROCESADORES II

DOCENTE ING. Arturo Marin T.

INTEGRANTE UNIV. FREDY MOLINA CALLE C.I : 6145621 LP

FECHA 2 de Febrero de 2018

You might also like