controlar-arduino-con-python-y-la-libreria-pyserial

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

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.

python -m pip install PySerial

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”.

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println("Hola mundo");
delay(1000);
}

Dejamos el sketch funcionando en Arduino, y vamos a realizar el script en Python. Creamos un nuevo archivo de texto vacío, que guardamos con el nombre “read.py”. En su interior copiamos el siguiente código.

import serial, time
arduino = serial.Serial('COM4', 9600)
time.sleep(2)
rawString = arduino.readline()
print(rawString)
arduino.close()

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.

const int pinLED = 13;

void setup() 
{
  Serial.begin(9600);
  pinMode(pinLED, OUTPUT);
}

void loop()
{
  if (Serial.available()>0) 
  {
    char option = Serial.read();
    if (option >= '1' && option <= '9')
    {
      option -= '0';
      for (int i = 0;i<option;i++) 
      {
        digitalWrite(pinLED, HIGH);
        delay(100);
        digitalWrite(pinLED, LOW);
        delay(200);
      }
    }
  }
}

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

import serial, time
arduino = serial.Serial("COM4", 9600)
time.sleep(2)
arduino.write(b'9')
arduino.close()

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.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full