Controlar Arduino con Python y la librería PySerial


python

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.

Con cualquiera de los dos métodos, al final tendremos la librería PySerial instalada y lista para ser utilizada en nuestros proyectos.

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.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino
Previous Medir la humedad del suelo con Arduino e higrómetro FC-28
Next Recuperar el estilo visual clásico en AutoCAD 2016

¡Deja un comentario!...

avatar
1000
Sort by:   newest | oldest | most voted
Rufián en la Red
Guest

Muy bueno Luis! Me queda una duda, ¿Para qué es necesario cerrar el puerto Serial al terminar? ¿Para dar por zanjada la comunicación o solo es un por si acaso? xD

luisllamas
Guest

Siempre hay que cerrar una conexión cuando terminas de usarlo, y así liberar el puerto.

Rufián en la Red
Guest

Ah! Nada, que no tengo yo costumbre de hacerlo pero porque suelo hacer pruebas de continuo con el puerto. Pero bueno saberlo 😉

Luis
Guest

Hola,
Una pregunta, yo intento hacer lo opuesto, manipular python por medio de arduino, quisiera abrir un .exe por medio de python cuando mi arduino reciba una señal digital, se puede hacer esto?
Gracias

Juan Alberto Sanchez Yelamo
Guest
Juan Alberto Sanchez Yelamo

se me ocurre que uses el comando Serial.println(” “) para mandar algo por el puerto serial cuando recibas la señal por el puerto digital y luego recibas eso en python con serial.readline() y cuando ese algo sea leido se ejecute la tarea que tu quieres, una idea.

luisllamas
Guest
Hola tocayo, Pues sin saber más sobre los detalles (¿qué tipo de ordenador usas, PC normal con Windows? ¿qué tipo de señal espera Arduino? ¿puede haber más de un mensaje? ¿quieres una espera bloqueante o no, etc, etc) en principio parece que quieres que Arduino tenga una interrupción, y que mande un char de control (un ‘1’ por ejemplo) al ordenador Aqui tienes la entrada sobre interrupciones https://www.luisllamas.es/que-son-y-como-usar-interrupciones-en-arduino/ Y aquí la de puerto de serie https://www.luisllamas.es/arduino-puerto-serie/ Y si en Python quieres una espera bloqueante que admita un char cualquiera, algo así puede servirte While True: bytesToRead = ser.inWaiting() ser.read(bytesToRead) 123… Read more »