Interface serie ESP32 con Phyton

Me han planteado como comunicar un programa Arduino con un programa de ordenador que procese los datos obtenidos por la placa de desarrollo, en este caso una LiLygo ESP 32

Teóricamente veo dos soluciones dependiendo del acoplamiento que queramos tener o que podamos tener entre ambos dispositivos:

  • Muy acoplados: conexión serie  como por ejemplo el interface Arduino-Phyton
  • Poco acoplados: conexión mediante mensajes como por ejemplo MQTT que es la solución que han tomado en TinyGS

Comunicaciones serie Python - Arduino

Requerimientos:
  • Instalar Python en el ordenador
  • Conectar mediante un cable de datos USB la placa arduino (ESP32) con el al ordenador (OJO no todos los cables USB soportan datos, muchos de ellos, especialmente los baratos unicamente soportan la alimentación)
  • Descargar e instalar PYSERIEL  
    • Comprobar que está instalado Python con
      • python3 --version
    • Comprobar que está instalado el gestor de paquetes PIP con:
      • python3 -m pip --version
    • Instalar PySerial
      • python3 -m pip install PySerial
    • Si ya está instalado y hay que actualizarlo
      • python3 -m pip install --upgrade pip
    • Puede comprobar que está instalado desde el IDLE de Python ejecutando:
      • import serial

Programa emisor en Arduino

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

Se puede comprobar su funcionamiento abriendo la consola serie de Arduino IDE

Programa receptor en ordenador personal

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

Este programa funciona correctamente en windows, si es en apple dará el error 

serial.serialutil.SerialException: [Errno 2] could not open port COM4: [Errno 2] No such file or directory: 'COM4'

que se corrige poniendo el puerto en formato macOS

arduino = serial.Serial('/dev/tty.wchusbserial58741248741', 9600)

Si no hemos cerrado la consola de ArduinoIDe nos dará el error

Errno 16] could not open port /dev/tty.wchusbserial58741248741: [Errno 16] Resource busy

Una versión del programa mas completa es esta

import serial
import time
# Abrimos la conexión por el puerto serial
arduino = serial.Serial('/dev/tty.wchusbserial58741248741', 9600)
# Esperamos a que se estabilice la conexión
time.sleep(2)  
print("Conexión establecida. Esperando datos...\n")
try:
    while True:
        if arduino.in_waiting > 0:
            linea = arduino.readline().decode('utf-8').strip()
            print(f"Recibido: {linea}")
except KeyboardInterrupt:
    print("\nFinalizando programa...")
finally:
    arduino.close()
    print("Puerto cerrado.")

Referencias

Comentarios

Entradas populares de este blog

ESP32 LoRa for dummys - Inicio

SDR - Software Defined Radio - IIIb: Receptores RSP o MSI (MSI3001: MSI2500 + MSI001)

Antena exterior logarítmica UHF/VHF : Metronic 425010 - Ia Características