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)

python
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

python
import serial
import time
  • serial: Para comunicación con puertos seriales

  • time: Para manejar tiempos (como un delay en Arduino)

2. Configurar Puerto COM

python
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

python
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

python
datos = arduino.readline().decode('utf-8').rstrip()
  • readline(): Lee hasta encontrar salto de línea (\n)

  • decode('utf-8'): Convierte bytes a texto

  • rstrip(): Elimina espacios y saltos de línea extras

5. ⚠️ CERRAR LA CONEXÓN - ¡OBLIGATORIO!

python
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)

cpp
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 \n al final

  • En Python usamos readline() que espera ese \n

  • Si usas Serial.print() sin ln, Python se queda esperando...


🎯 Resumen Visual del Proceso

text
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 segundos

  • Verifica 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:

  1. Primero prueba con el Monitor Serial del IDE Arduino

  2. Luego implementa la comunicación con Python

  3. 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:

  1. Enviar múltiples tipos de datos (números, texto, comandos)

  2. Crear protocolos de comunicación más complejos

  3. Implementar handshaking para sincronización

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

cpp
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:

bash
pip install pyserial

3. Código en Python para recibir datos

python
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

python
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:
            continue

5. Instrucciones Paso a Paso

Paso 1: Preparación del Hardware

  1. Conecta tu Arduino a la computadora via USB

  2. Abre el IDE de Arduino

Paso 2: Configuración del Arduino

  1. Copia el código de Arduino al IDE

  2. Selecciona la placa correcta (Tools → Board)

  3. Selecciona el puerto (Tools → Port)

  4. Sube el código a Arduino

Paso 3: Ejecución en Python

  1. Encuentra el puerto correcto:

    • Windows: Ve al Administrador de Dispositivos → Puertos (COM y LPT)

    • Linux/Mac: Ejecuta ls /dev/tty* en terminal

  2. Modifica el código Python con el puerto correcto

  3. Ejecuta el script Python:

    bash
    python nombre_del_script.py

6. Ejemplo de Salida

text
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:

bash
sudo chmod 666 /dev/ttyUSB0
# O agrega tu usuario al grupo dialout:
sudo usermod -a -G dialout $USER

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

Entradas populares de este blog

¿Qué es el Modelo OSI?

bit -El codigo ASCII

38. Tema 1: Protocolos de comunicación.