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
- 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
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 time
# Abrimos la conexión por el puerto serial
arduino = serial.Serial('/dev/tty.wchusbserial58741248741', 9600)
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
Publicar un comentario