43. Ejemplo 1: Envió de datos de Arduino (Hola Mundo) hacia Python - Teoría
📡 Captura de Datos desde Arduino a Python vía Puerto Serial
¡Hola comunidad! 👋 Hoy vamos a ver nuestro primer ejemplo de captura de datos a través del puerto serial. Voy a mostrarles cómo capturar datos enviados desde Arduino y recibirlos en Python. ¡Empecemos! 🚀
🔄 El Flujo de Comunicación
La idea es simple pero poderosa:
Arduino envía datos hacia Python
Python recibe y muestra esos datos
¡Comunicación en tiempo real! ⚡
🐍 Código en Python (El Receptor)
import serial # Librería para comunicación serial
import time # Para manejar tiempos y delays
# Configuración del puerto COM
puerto = 'COM3' # ¡Cambia esto según tu sistema!
velocidad = 9600 # DEBE coincidir con Arduino
# Crear conexión serial
arduino = serial.Serial(puerto, velocidad)
time.sleep(2) # ⚠️ TIEMPO CRÍTICO - ¡No lo ignores!
print("Conectado a Arduino. Recibiendo datos...")
try:
while True:
# Leer datos del puerto serial
datos = arduino.readline().decode('utf-8').rstrip()
print(f"Dato recibido: {datos}")
except KeyboardInterrupt:
print("\nCaptura detenida por el usuario")
finally:
# ⚠️ CERRAR EL PUERTO - ¡Obligatorio!
arduino.close()
print("Puerto serial cerrado correctamente")🔧 Explicación Paso a Paso del Código Python
1. Importar Librerías
import serial
import timeserial: Para comunicación con puertos serialestime: Para manejar tiempos (como undelayen Arduino)
2. Configurar Puerto COM
puerto = 'COM3'
velocidad = 9600📌 Importante:
El puerto COM depende de tu sistema (COM3, COM4, /dev/ttyUSB0, etc.)
La velocidad DEBE coincidir exactamente con la configurada en Arduino
Velocidades comunes: 9600, 115200, 57600 baudios
3. Establecer Conexión
arduino = serial.Serial(puerto, velocidad)
time.sleep(2) # ⏰ ¡TIEMPO CRÍTICO!⚠️ ¡Atención con el tiempo!
Este time.sleep(2) es ESENCIAL. Muchos lo ignoran y luego tienen problemas. ¿Por qué?
La conexión necesita tiempo para establecerse correctamente
Sin este tiempo, Python intenta leer antes de que Arduino esté listo
Resultado: A veces funciona, a veces no (¡comportamiento errático!)
2 segundos es suficiente, pero puedes aumentar si tienes problemas
4. Leer Datos
datos = arduino.readline().decode('utf-8').rstrip()readline(): Lee hasta encontrar salto de línea (\n)decode('utf-8'): Convierte bytes a textorstrip(): Elimina espacios y saltos de línea extras
5. ⚠️ CERRAR LA CONEXÓN - ¡OBLIGATORIO!
finally:
arduino.close()🚨 ¡NO IGNORES ESTO!
Cerrar la conexión es CRÍTICO porque:
Evita que el puerto quede "colgado" o bloqueado
Libera recursos del sistema
Si no cierras, no podrás reconectar (¡error!)
Aplica para TODOS los tipos de comunicación: Serial, UDP, TCP, etc.
🔌 Código en Arduino (El Emisor)
void setup() {
Serial.begin(9600); // Misma velocidad que en Python
}
void loop() {
Serial.println("Hola Mundo"); // ⚠️ Con salto de línea (\n)
delay(1000); // Envia cada segundo
}📌 ¡Atención al salto de línea!
Serial.println(): Envía texto CON\nal finalEn Python usamos
readline()que espera ese\nSi usas
Serial.print()sinln, Python se queda esperando...
🎯 Resumen Visual del Proceso
Arduino Python
↓ ↓
Serial.begin(9600) → serial.Serial('COM3', 9600)
↓ ↓
Serial.println("Hola") → readline() (espera \n)
↓ ↓
delay(1000) ← time.sleep(2) inicial
↓ ↓
└─────────────────────→ print(datos)
↓
close() ¡SIEMPRE!🔍 Consejos y Solución de Problemas
✅ Si funciona intermitentemente:
Aumenta el
time.sleep()a 3-4 segundosVerifica que Arduino esté conectado antes de ejecutar Python
🚫 Error "Puerto no disponible":
Cierra el Monitor Serial del IDE Arduino
Espera unos segundos después de subir el código
Verifica el número correcto de puerto COM
📊 Para depuración:
Primero prueba con el Monitor Serial del IDE Arduino
Luego implementa la comunicación con Python
Usa
print()adicionales para ver el flujo
💡 Aplicaciones Prácticas
Esta técnica base sirve para:
Monitoreo de sensores en tiempo real
Registro de datos en archivos CSV/Excel
Creación de interfaces gráficas
Control remoto de dispositivos
Sistemas de adquisición de datos
📚 ¿Qué sigue?
Una vez dominada esta comunicación básica, podemos:
Enviar múltiples tipos de datos (números, texto, comandos)
Crear protocolos de comunicación más complejos
Implementar handshaking para sincronización
Desarrollar interfaces gráficas con Tkinter o PyQt
🤔 ¿Preguntas o Problemas?
¿Te quedaste atascado? ¿Algo no funciona como esperabas? ¡Déjalo en los comentarios! Estoy aquí para ayudar. 👨💻
#Python #Arduino #SerialCommunication #IoT #Programming #Electronics #DataAcquisition
¿Te resultó útil?
****************************************
Envío de Datos de Arduino a Python (Hola Mundo)
Te explico cómo enviar datos desde Arduino a Python, usando el clásico "Hola Mundo" como ejemplo.
Concepto Básico
Arduino se comunica con la computadora a través del puerto serial (USB). Python puede leer este puerto para recibir los datos.
1. Código en Arduino
void setup() {
// Inicia la comunicación serial a 9600 baudios
Serial.begin(9600);
// Espera a que el puerto serial esté listo
while (!Serial) {
; // Espera
}
}
void loop() {
// Envía "Hola Mundo" cada 2 segundos
Serial.println("Hola Mundo desde Arduino!");
// También puedes enviar otros datos
int sensorValue = analogRead(A0); // Ejemplo: leer sensor
Serial.print("Valor del sensor: ");
Serial.println(sensorValue);
delay(2000); // Espera 2 segundos
}2. Instalación de Python
Necesitas instalar la librería pyserial:
pip install pyserial3. Código en Python para recibir datos
import serial
import time
# Configura el puerto serial
# Windows: 'COM3', 'COM4', etc.
# Linux/Mac: '/dev/ttyUSB0', '/dev/ttyACM0', etc.
puerto = 'COM3' # ¡Cambia esto según tu sistema!
velocidad = 9600
try:
# Abre la conexión serial
arduino = serial.Serial(puerto, velocidad)
time.sleep(2) # Espera a que se establezca la conexión
print("Conectado a Arduino. Esperando datos...")
while True:
if arduino.in_waiting > 0:
# Lee una línea del puerto serial
datos = arduino.readline().decode('utf-8').rstrip()
# Muestra los datos recibidos
print(f"Datos recibidos: {datos}")
except serial.SerialException as e:
print(f"Error al conectar con Arduino: {e}")
except KeyboardInterrupt:
print("\nPrograma terminado por el usuario")
finally:
if 'arduino' in locals() and arduino.is_open:
arduino.close()
print("Conexión cerrada")4. Versión Mejorada con Más Funcionalidades
import serial
import time
from datetime import datetime
def leer_datos_arduino(puerto, velocidad=9600, tiempo_lectura=30):
"""
Lee datos de Arduino por un tiempo determinado
Args:
puerto: Puerto serial (ej: 'COM3' o '/dev/ttyUSB0')
velocidad: Velocidad en baudios (debe coincidir con Arduino)
tiempo_lectura: Tiempo total de lectura en segundos
"""
try:
# Conectar con Arduino
arduino = serial.Serial(puerto, velocidad, timeout=1)
time.sleep(2) # Tiempo para inicializar
print(f"Conectado a {puerto} a {velocidad} baudios")
print(f"Leyendo datos por {tiempo_lectura} segundos...")
print("Presiona Ctrl+C para terminar antes\n")
inicio = time.time()
contador = 0
while time.time() - inicio < tiempo_lectura:
try:
if arduino.in_waiting > 0:
# Leer línea
linea = arduino.readline().decode('utf-8', errors='ignore').strip()
if linea: # Si hay datos
contador += 1
timestamp = datetime.now().strftime("%H:%M:%S")
print(f"[{timestamp}] Mensaje {contador}: {linea}")
# Pequeña pausa para no saturar la CPU
time.sleep(0.01)
except UnicodeDecodeError:
print("Error al decodificar datos")
print(f"\nResumen: Se recibieron {contador} mensajes en {tiempo_lectura} segundos")
except serial.SerialException as e:
print(f"Error de conexión: {e}")
print("\nPosibles soluciones:")
print("1. Verifica que Arduino esté conectado")
print("2. Asegúrate de que el puerto sea correcto")
print("3. Cierra el IDE Arduino si está abierto")
except KeyboardInterrupt:
print("\nLectura interrumpida por el usuario")
finally:
if 'arduino' in locals() and arduino.is_open:
arduino.close()
print("Conexión serial cerrada")
# Ejecutar el programa
if __name__ == "__main__":
# Encuentra automáticamente el puerto en algunos sistemas
puertos_posibles = ['COM3', 'COM4', 'COM5', '/dev/ttyUSB0', '/dev/ttyACM0']
for puerto in puertos_posibles:
try:
# Intenta conectar
leer_datos_arduino(puerto, tiempo_lectura=15)
break
except:
continue5. Instrucciones Paso a Paso
Paso 1: Preparación del Hardware
Conecta tu Arduino a la computadora via USB
Abre el IDE de Arduino
Paso 2: Configuración del Arduino
Copia el código de Arduino al IDE
Selecciona la placa correcta (Tools → Board)
Selecciona el puerto (Tools → Port)
Sube el código a Arduino
Paso 3: Ejecución en Python
Encuentra el puerto correcto:
Windows: Ve al Administrador de Dispositivos → Puertos (COM y LPT)
Linux/Mac: Ejecuta
ls /dev/tty*en terminal
Modifica el código Python con el puerto correcto
Ejecuta el script Python:
python nombre_del_script.py
6. Ejemplo de Salida
Conectado a COM3 a 9600 baudios
Leyendo datos por 30 segundos...
Presiona Ctrl+C para terminar antes
[14:30:15] Mensaje 1: Hola Mundo desde Arduino!
[14:30:15] Mensaje 1: Valor del sensor: 512
[14:30:17] Mensaje 2: Hola Mundo desde Arduino!
[14:30:17] Mensaje 2: Valor del sensor: 510
...7. Posibles Problemas y Soluciones
Problema: "Puerto no encontrado"
Solución:
Cierra el IDE de Arduino (usa el puerto)
Reinicia Arduino
Verifica el cable USB
Problema: "Datos corruptos"
Solución:
Verifica que la velocidad (baud rate) sea la misma en ambos códigos
Asegura que los cables estén bien conectados
Agrega delay en Arduino si envías datos muy rápido
Problema: "Permission denied" (Linux/Mac)
Solución:
sudo chmod 666 /dev/ttyUSB0
# O agrega tu usuario al grupo dialout:
sudo usermod -a -G dialout $USER8. Aplicaciones Prácticas
Monitoreo de sensores en tiempo real
Registro de datos en archivos CSV
Control de dispositivos desde Python
Interfaz gráfica con datos de Arduino
Comentarios
Publicar un comentario