杰瑞科技汇

Arduino Yun与Python如何协同工作?

¡Claro que sí! Usar Python con un Arduino Yún es una de sus características más potentes. La idea principal es que el procesador ARM del Yún (el mismo que en un Raspberry Pi) corre un sistema operativo Linux (Linino OS) sobre el cual puedes ejecutar scripts de Python, mientras que el microcontrolador ATmega32u4 (el mismo que en un Arduino Uno) se encarga de leer sensores, controlar motores, etc.

Arduino Yun与Python如何协同工作?-图1
(图片来源网络,侵删)

La comunicación entre ambos lados (el sketch de Arduino y el script de Python) se realiza a través del puente de comunicación (Bridge), que básicamente es un demonio en el Linux del Yún que permite que el lado del Arduino envíe y reciba datos a través de una "consola" virtual.

Aquí tienes una guía completa, desde los conceptos básicos hasta un ejemplo práctico.


Conceptos Clave: El Puente (Bridge)

El Puente es el componente que hace todo posible. Funciona de la siguiente manera:

  1. Lado del Arduino (Sketch): En lugar de usar Serial.print() para enviar datos a tu computadora, usas la clase Process para ejecutar un comando en el Linux del Yún.
  2. Comando del Puente: El comando más común es python. Tu sketch de Arduino ejecuta python /mnt/sda1/mi_script.py (o la ruta a tu script).
  3. Lado de Linux (Python): El sistema operativo ejecuta tu script de Python. Este script puede leer los datos que le pasa el sketch de Arduino a través de stdin (entrada estándar) y puede escribir respuestas que el sketch de Arduino leerá desde stdout (salida estándar).

Ventaja: Puedes usar la potencia de las librerías de Python para tareas complejas (análisis de datos, peticiones a una API, procesamiento de texto, etc.) mientras el Arduino se encarga de la interacción con el hardware de bajo nivel.

Arduino Yun与Python如何协同工作?-图2
(图片来源网络,侵删)

Requisitos Previos

  1. Arduino Yún: Claro.
  2. Cuenta SSH: Necesitas acceder al Linux del Yún a través de SSH para instalar Python y transferir tus scripts.
    • La dirección por defecto es arduino.local en macOS/Linux o \\arduino.local en Windows.
    • El usuario es root y la contraseña es arduino.
  3. Python en el Yún: El Yún ya viene con Python instalado, pero es una versión antigua. Es una buena práctica actualizarlo.
    • Conéctate por SSH y ejecuta:
      opkg update
      opkg install python3
    • Ahora tendrás python3 disponible, que es la versión moderna de Python.

Flujo de Trabajo Típico

  1. Escribe el Sketch de Arduino: El sketch leerá un sensor y usará la clase Process para llamar a un script de Python, pasándole los datos como argumentos o a través de stdin.
  2. Transfiere el Sketch: Carga el sketch en tu Arduino Yún desde el IDE de Arduino.
  3. Escribe el Script de Python: Crea un archivo de Python en tu computadora.
  4. Transfiere el Script de Python: Usa scp (Secure Copy) o el gestor de archivos del IDE de Arduino para copiar tu script a una carpeta del Yún (por ejemplo, /mnt/sda1/ si tienes un USB conectado, o /home/root/).
  5. Ejecuta y Depura: Conecta por SSH para ver los resultados, reiniciar el script si es necesario, o depurar errores.

Ejemplo Práctico: Sensor de Temperatura DHT11

Vamos a crear un sistema donde el Arduino Yún lee un sensor de temperatura DHT11 y envía los datos a un script de Python. El script de Python los formateará y los mostrará en la consola.

Paso 1: Conexiones del Hardware

Conecta el sensor DHT11 a tu Yún:

  • VCC -> 5V
  • GND -> GND
  • DATA -> Pin Digital 2

Paso 2: El Sketch de Arduino (dht_arduino_bridge.ino)

Este sketch lee el sensor y ejecuta un script de Python llamado process_dht.py.

#include <Bridge.h>
#include <Process.h>
#include <DHT.h>
// Definir el pin y el tipo de sensor
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  // Inicializar el Puente. ¡Es crucial!
  Bridge.begin();
  Serial.begin(9600);
  // Esperar a que el Puente esté listo
  while (!Serial); 
  Serial.println("Puente iniciado. Listo para leer el sensor.");
  dht.begin();
}
void loop() {
  // Leer datos del sensor
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  // Comprobar si la lectura fue exitosa
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Error al leer del sensor DHT!");
    return;
  }
  // Calcular el índice de calor (Heat Index)
  float heatIndex = dht.computeHeatIndex(temperature, humidity, false);
  // Crear un comando para ejecutar el script de Python
  Process pythonProcess;
  // Formateamos los datos como argumentos para el script de Python
  // El comando será: python3 /mnt/sda1/process_dht.py 25.50 45.20
  String command = "python3 /mnt/sda1/process_dht.py " + String(temperature) + " " + String(humidity);
  // Iniciar el proceso
  pythonProcess.runShellCommand(command);
  // Esperar a que el proceso termine
  while (pythonProcess.running());
  // Opcional: Leer cualquier salida del script de Python
  while (pythonProcess.available() > 0) {
    char c = pythonProcess.read();
    Serial.write(c);
  }
  // Esperar 10 segundos antes de la próxima lectura
  delay(10000);
}

Paso 3: El Script de Python (process_dht.py)

Este script se ejecutará en el Linux del Yún. Recibirá los datos como argumentos de la línea de comandos.

Arduino Yun与Python如何协同工作?-图3
(图片来源网络,侵删)
#!/usr/bin/env python3
import sys
import time
def process_data(temp_str, hum_str):
    """
    Procesa los datos recibidos y los imprime de forma legible.
    """
    try:
        temperature = float(temp_str)
        humidity = float(hum_str)
        print("--------------------------------------------------")
        print(f"Datos recibidos del Arduino a las {time.ctime()}")
        print(f"Temperatura: {temperature:.2f} °C")
        print(f"Humedad:     {humidity:.2f} %")
        print("--------------------------------------------------")
        print() # Línea en blanco para separar lecturas
    except ValueError:
        print("Error: No se pudieron convertir los datos a números.")
        print(f"Recibido: Temp='{temp_str}', Hum='{hum_str}'")
if __name__ == "__main__":
    # sys.argv es una lista con los argumentos de la línea de comandos.
    # sys.argv[0] es el nombre del script en sí.
    # sys.argv[1] es el primer argumento, sys.argv[2] el segundo, etc.
    if len(sys.argv) == 3:
        process_data(sys.argv[1], sys.argv[2])
    else:
        print("Uso incorrecto. Se esperaban 2 argumentos.")
        print("Ejemplo: python3 process_dht.py 25.50 45.20")

Paso 4: Transferencia y Ejecución

  1. Carga el Sketch: Abre el IDE de Arduino, pega el código de dht_arduino_bridge.ino, conécta tu Yún y haz clic en "Subir".

  2. Transfiere el Script Python:

    • Método A (SCP - Recomendado): Abre una terminal en tu computadora (no en el Yún).
      # Asegúrate de tener el script process_dht.py en la misma carpeta
      scp process_dht.py root@arduino.local:/mnt/sda1/

      (Si no tienes una partición USB, usa /home/root/ en lugar de /mnt/sda1/).

    • Método B (IDE de Arduino): Ve a Herramientas > Administrar Placas > Añadir URL de Placa... y añade http://arduino.esp8266.com/stable/package_esp8266com_index.json. Luego, en Herramientas > Placa, selecciona Arduino Yún. Verás una opción para Cargar a través de la Red que te permite transferir archivos.
  3. Haz el Script Ejecutable: Conéctate por SSH al Yún:

    ssh root@arduino.local

    Ahora, dale permisos de ejecución a tu script:

    chmod +x /mnt/sda1/process_dht.py
  4. Reinicia el Yún: A veces es necesario reiniciar para que todo funcione correctamente.

    reboot
  5. Observa los Resultados: Después de que el Yún se reinicie, conéctate por SSH de nuevo y abre el monitor serie del Yún (o simplemente espera, ya que el script se ejecuta continuamente).

    # Conéctate por SSH
    ssh root@arduino.local
    # El script de Python se ejecutará cada 10 segundos llamado por el sketch de Arduino.
    # Verás la salida formateada en tu terminal SSH.

    Deberías ver una salida similar a esta cada 10 segundos:

    --------------------------------------------------
    Datos recibidos del Arduino a Wed Oct 26 10:30:00 2025
    Temperatura: 25.50 °C
    Humedad:     45.20 %
    --------------------------------------------------

Alternativa: Comunicación a Través de stdin/stdout

En lugar de pasar argumentos, puedes enviar datos a través de stdin. Esto es útil para flujos de datos más continuos.

Sketch de Arduino Modificado:

// ... (setup igual) ...
void loop() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  if (isnan(temperature) || isnan(humidity)) {
    return;
  }
  Process pythonProcess;
  pythonProcess.begin("python3");
  pythonProcess.addParameter("/mnt/sda1/process_dht_stdin.py");
  // Enviar los datos a stdin del script de Python
  pythonProcess.println(String(temperature) + "," + String(humidity));
  pythonProcess.run(); // run() en lugar de runShellCommand()
  while (pythonProcess.available() > 0) {
    Serial.write(pythonProcess.read());
  }
  delay(10000);
}

Script de Python Modificado (process_dht_stdin.py):

#!/usr/bin/env python3
import sys
import time
def process_data(data_str):
    try:
        # Los datos vienen como "temperatura,humedad"
        temp_str, hum_str = data_str.strip().split(',')
        temperature = float(temp_str)
        humidity = float(hum_str)
        print(f"Datos a las {time.ctime()}: Temp={temperature:.2f}°C, Hum={humidity:.2f}%")
    except (ValueError, IndexError) as e:
        print(f"Error procesando datos: {e}. Recibido: '{data_str.strip()}'")
if __name__ == "__main__":
    # sys.stdin es un flujo de entrada. Podemos leer línea por línea.
    # En este caso, el sketch solo escribe una línea por ciclo.
    for line in sys.stdin:
        process_data(line)

Posibles Problemas y Soluciones

  • Error python: command not found: Asegúrate de que Python esté instalado correctamente (python3 --version). Revisa la ruta a tu script en el sketch de Arduino.
  • El script no se ejecuta: Asegúrate de haber dado permisos de ejecución con chmod +x /ruta/a/tu/script.py.
  • El Puente no está listo: Asegúrate de llamar a Bridge.begin() en el setup() y de incluir #include <Bridge.h>. A veces, un pequeño delay(1000) después de Bridge.begin() ayuda.
  • Problemas de permisos de escritura: Si intentas guardar datos en un archivo, asegúrate de que el usuario root tenga permisos sobre ese directorio. Usar /mnt/sda1/ (un USB) suele ser más fácil que /home/root/.

Ideas para Proyectos Más Avanzados

  • Servidor Web Simple: Usa el BridgeServer en el sketch de Arduino para que el script de Python responda a peticiones HTTP.
  • Control Remoto: El script de Python puede leer un botón en una página web y enviar una señal de vuelta al Arduino para encender un LED.
  • Registro de Datos (Data Logging): El script de Python puede escribir los datos del sensor en un archivo CSV en una tarjeta SD o incluso en una base de datos en la nube.
  • Notificaciones: El script de Python puede usar librerías como requests para enviar los datos a un servicio como IFTTT, Telegram o Slack.

Espero que esta guía detallada te sea de gran ayuda para empezar a programar tu Arduino Yún con Python. ¡Es una combinación increíblemente versátil

分享:
扫描分享到社交APP
上一篇
下一篇