Categoría: Arduino-robotica

  • 2 – Lectura y almacenamiento de datos de sensores en Windows

    2 – Lectura y almacenamiento de datos de sensores en Windows

    PARTE 1 – Preparar el Arduino para enviar datos correctamente

    1.1 Conectar el Arduino

    1. Conectar el cable USB tipo A-B.
    2. Abrir Arduino IDE.
    3. Ir a:

    Herramientas → Placa → Arduino Mega 2560
    Herramientas → Puerto → Seleccionar el puerto COM correcto.

    Si no sabes cuál es:

    • Desconecta el cable.
    • Mira qué puerto desaparece.
    • Vuelve a conectar.
    • Ese es el correcto.

    1.2 Código base para enviar datos estructurados

    Es FUNDAMENTAL que los datos tengan formato fijo.

    Ejemplo usando un sensor analógico en A0:

    void setup() {
      Serial.begin(9600);
    }void loop() {
      int valor = analogRead(A0);  
    Serial.print("S1;ANALOGICO;");
      Serial.println(valor);  
      delay(2000);
    }

    Esto genera una línea clara:

    S1;ANALOGICO;523

    Siempre el mismo patrón. Sin texto decorativo.

    Subir el programa.

    ⚠️ Muy importante:
    NO abrir el Monitor Serie después. El puerto solo puede usarse por un programa a la vez.


    PARTE 2 – Preparar Windows para capturar datos

    Windows no guarda automáticamente lo que sale por USB. Necesitamos un programa que lea el puerto serie y lo escriba en un archivo.

    La solución más limpia: Python.


    PARTE 3 – Instalar Python en Windows

    3.1 Descargar

    Ir a:
    https://www.python.org/downloads/

    Descargar versión para Windows.

    3.2 Instalación correcta

    Durante la instalación:

    ✔ Marcar “Add Python to PATH”
    ✔ Install Now

    Finalizar instalación.


    PARTE 4 – Instalar librería para comunicación serie

    Abrir:

    Inicio → escribir “cmd” → Enter

    Ejecutar:

    pip install pyserial

    Si aparece “Successfully installed”, está correcto.


    PARTE 5 – Crear el programa que guarda datos

    5.1 Crear archivo

    En el escritorio:

    Crear archivo llamado:

    guardar_datos.py

    Abrir con Bloc de notas y pegar:

    import serial
    import csv
    from datetime import datetime
    
    # CAMBIAR ESTE PUERTO POR EL CORRECTO
    PUERTO = "COM3"
    BAUDIOS = 9600
    
    try:
        ser = serial.Serial(PUERTO, BAUDIOS, timeout=1)
    except:
        print("No se puede abrir el puerto. Verifica el COM.")
        exit()
    
    archivo = open("datos_sensores.csv", mode="a", newline="")
    writer = csv.writer(archivo, delimiter=";")
    
    print("Capturando datos... Presiona Ctrl+C para detener.")
    
    try:
        while True:
            linea = ser.readline().decode("utf-8").strip()
    
            if linea:
                timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                datos = linea.split(";")
    
                fila = datos + [timestamp]
                writer.writerow(fila)
                archivo.flush()
    
                print(fila)
    
    except KeyboardInterrupt:
        print("Finalizando captura...")
        archivo.close()
        ser.close()

    Guardar archivo.


    PARTE 6 – Ejecutar captura de datos

    1. Cerrar el Monitor Serie del IDE.
    2. Abrir CMD.
    3. Ir al escritorio:
    cd Desktop
    1. Ejecutar:
    python guardar_datos.py

    Si todo funciona, verás:

    [‘S1’, ‘ANALOGICO’, ‘523’, ‘2026-03-02 21:30:10’]

    Y se creará automáticamente:

    datos_sensores.csv


    PARTE 7 – Verificar archivo generado

    Abrir el archivo con Excel.

    Formato típico:

    S1;ANALOGICO;523;2026-03-02 21:30:10
    S1;ANALOGICO;517;2026-03-02 21:30:12

    Ya tienes registro histórico con timestamp.

    Eso significa:

    • Persistencia de datos
    • Trazabilidad
    • Capacidad de análisis

    PARTE 8 – Problemas comunes y solución

    Error: “Access denied”
    → El Monitor Serie está abierto.

    Error: “No se puede abrir el puerto”
    → Puerto incorrecto.

    Símbolos extraños
    → Baudrate incorrecto (debe coincidir con Serial.begin).

    No se guardan datos
    → El Arduino no está enviando líneas con println.


  • 3 – Instalación de Raspberry Pi OS y conexión por WiFi (en remoto)

    3 – Instalación de Raspberry Pi OS y conexión por WiFi (en remoto)

    En esta práctica aprenderás a:

    • Preparar una tarjeta microSD con Raspberry Pi OS.
    • Configurar la Raspberry Pi sin monitor ni teclado (modo headless).
    • Conectar la Raspberry Pi a una red WiFi.
    • Acceder a ella desde tu portátil mediante SSH.

    La Raspberry Pi funcionará como un pequeño servidor Linux conectado por WiFi.


    1. Material necesario

    Cada grupo necesitará:

    • 1 Raspberry Pi
    • 1 tarjeta microSD (16GB o más)
    • 1 lector de tarjetas microSD
    • 1 portátil
    • 1 router WiFi del aula
    • alimentación para la Raspberry Pi

    No se utilizarán:

    • monitor
    • teclado
    • ratón

    Toda la administración se hará desde el portátil mediante SSH.


    2. Arquitectura de red de la práctica

    La red del aula tendrá esta estructura:

               Router WiFi Aula
    192.168.1.1
    ~~~~~~~~~~~~~~~~~
    )) ((
    )) ((
    )) ((
    ┌──────────────┐ ┌──────────────┐
    │ Portátil │ │ Raspberry Pi │
    │ del alumno │ │ │
    │ │ │ Servidor │
    │ SSH Client │──▶│ SSH Server │
    └──────────────┘ └──────────────┘

    La Raspberry Pi se conectará al router por WiFi y el alumno accederá mediante SSH.


    3. Descarga del sistema operativo

    El sistema operativo oficial es:

    Raspberry Pi OS

    Descargar la herramienta:

    Raspberry Pi Imager

    desde:

    https://www.raspberrypi.com/software

    Disponible para:

    • Windows
    • Linux
    • macOS

    4. Instalación de Raspberry Pi Imager

    En Windows:

    1. Descargar el instalador.
    2. Ejecutar el archivo .exe.
    3. Instalar el programa.
    4. Abrir Raspberry Pi Imager.

    5. Insertar la tarjeta microSD

    1. Introducir la tarjeta en el lector.
    2. Conectarla al ordenador.
    3. Abrir Raspberry Pi Imager.

    Verás tres botones principales:

    Choose OS
    Choose Storage
    Write

    6. Seleccionar el sistema operativo

    Pulsar:

    Choose OS

    Seleccionar:

    Raspberry Pi OS Lite (64-bit)

    Elegimos esta versión porque:

    • no tiene entorno gráfico
    • consume menos recursos
    • es ideal para servidores
    • todo se controla por terminal

    7. Seleccionar la tarjeta microSD

    Pulsar:

    Choose Storage

    Elegir la tarjeta microSD conectada al ordenador.


    8. Configuración avanzada (muy importante)

    Antes de escribir la tarjeta, pulsar el icono del engranaje ⚙.

    Aquí configuraremos la Raspberry antes de arrancarla por primera vez.


    Nombre de la máquina

    Hostname:

    raspberry01 (deben ser diferentes en casa maquina)

    Activar SSH

    Activar:

    Enable SSH

    Elegir:

    Use password authentication

    Usuario y contraseña

    Crear usuario:

    usuario: alumno
    contraseña: alumno123

    Configuración WiFi

    Activar WiFi e introducir:

    SSID: nombre_wifi
    Password: passwordwifi

    Configurar también:

    Country: ES

    Esto es importante para que la Raspberry pueda usar correctamente el WiFi.


    Configuración regional

    Configurar:

    Time zone: Europe/Madrid
    Keyboard layout: es

    9. Escribir el sistema en la tarjeta

    Pulsar:

    Write

    El programa:

    1. descargará el sistema
    2. lo copiará a la tarjeta
    3. verificará los datos

    Este proceso puede tardar varios minutos.


    10. Primer arranque de la Raspberry Pi

    Cuando termine:

    1. sacar la tarjeta microSD
    2. insertarla en la Raspberry Pi
    3. conectar la alimentación

    La Raspberry Pi arrancará automáticamente.

    Durante el arranque:

    • se conectará al WiFi
    • arrancará el servidor SSH
    • quedará disponible en la red

    El proceso tarda aproximadamente 1 minuto.


    11. Descubrir la IP de la Raspberry Pi

    Necesitamos saber qué IP le ha asignado el router.

    Hay varias formas.



    Escaneo de red

    En Linux o macOS:

    arp -a

    o

    nmap -sn 192.168.1.0/24

    12. Conectarse por SSH

    Abrir una terminal en el portátil.

    Ejecutar:

    ssh alumno@192.168.1.37

    (sustituir la IP por la real).

    La primera vez aparecerá un aviso de seguridad:

    The authenticity of host can't be established

    Escribir:

    yes

    Después introducir la contraseña:

    alumno123

    Si usas Windows

    Puedes usar:

    Terminal de Windows

    ssh alumno@192.168.1.37

    o el programa:

    PuTTY


    13. Primera sesión en la Raspberry Pi

    Si todo funciona verás algo como:

    alumno@raspberry01:~ $

    Ya estás dentro de la Raspberry Pi.

    Estás controlando un ordenador remoto desde tu portátil.


    14. Comandos básicos de prueba

    Información del sistema:

    uname -a

    Versión del sistema:

    cat /etc/os-release

    Ver la IP:

    ip a

    Actualizar el sistema:

    sudo apt update
    sudo apt upgrade

  • 4 – Práctica guiada: varios Arduinos con sensores conectados a una Raspberry Pi y almacenamiento en CSV o JSON

    4 – Práctica guiada: varios Arduinos con sensores conectados a una Raspberry Pi y almacenamiento en CSV o JSON

    1. Introducción

    En esta práctica vais a construir un pequeño sistema de adquisición de datos distribuido. En lugar de trabajar con un único sensor conectado a un solo dispositivo, vais a montar una arquitectura formada por varios Arduinos, cada uno con uno o varios sensores, y una Raspberry Pi que actuará como centro de recepción y almacenamiento.

    El objetivo no es solo «leer sensores», sino comprender cómo se organiza un sistema real donde varios nodos capturan información y un equipo central la recibe, la procesa y la guarda para su análisis posterior.

    Este tipo de arquitectura se parece mucho a sistemas reales de monitorización, automatización, IoT, domótica o control industrial.


    2. Objetivos de la práctica

    Al finalizar la práctica, debéis ser capaces de:

    • Conectar sensores a varios Arduinos.
    • Leer datos de sensores desde Arduino.
    • Enviar esos datos por comunicación serie a través de USB.
    • Conectar varios Arduinos a una Raspberry Pi.
    • Identificar los puertos serie de cada Arduino en Linux.
    • Crear en la Raspberry Pi un programa en Python que reciba datos desde varios Arduinos.
    • Guardar los datos recibidos en archivos CSV o JSON.
    • Documentar correctamente el montaje, el código y el funcionamiento del sistema.

    3. Descripción general del sistema

    La arquitectura general de la práctica será la siguiente:

    [Sensores] → [Arduino 1] ┐
    [Sensores] → [Arduino 2] ├── USB ──> [Raspberry Pi] ──> [CSV / JSON]
    [Sensores] → [Arduino 3] ┘

    Cada Arduino actuará como nodo de captura de datos.

    La Raspberry Pi actuará como:

    • receptor central,
    • sistema de almacenamiento,
    • y punto de análisis de los datos.

    4. Material necesario

    Cada grupo deberá disponer, como mínimo, de:

    • 1 Raspberry Pi con Raspberry Pi OS.
    • 2 o más placas Arduino.
    • Sensores asignados por el profesor.
    • Cables USB para conectar los Arduinos a la Raspberry Pi.
    • Protoboard y cables Dupont.
    • Resistencias si el sensor lo necesita.
    • Tarjeta microSD con sistema operativo funcional en la Raspberry Pi.
    • Acceso al terminal de la Raspberry Pi.

    Material opcional recomendable

    • Hub USB alimentado, si se van a usar muchos Arduinos.
    • Teclado, ratón y monitor para la Raspberry Pi, o acceso por SSH.

    5. Requisitos mínimos del proyecto

    El sistema desarrollado debe cumplir, al menos, con los siguientes requisitos:

    1. Usar varios Arduinos conectados a la Raspberry Pi.
    2. Cada Arduino debe leer al menos un sensor.
    3. Cada Arduino debe enviar sus datos por puerto serie.
    4. La Raspberry Pi debe recibir datos de todos los Arduinos.
    5. Los datos deben guardarse en un archivo CSV o JSON.
    6. Cada dato debe quedar identificado con:
      • fecha y hora,
      • identificador del Arduino,
      • nombre del sensor,
      • valor recibido.
    7. El grupo debe entregar documentación técnica y capturas.


    FASE 1. Diseño del sistema

    6.1. Planificación previa

    Antes de montar nada, debéis diseñar vuestro sistema.

    Debéis definir:

    • Cuántos Arduinos vais a usar.
    • Qué sensor o sensores irá conectado a cada Arduino.
    • Qué tipo de dato enviará cada uno.
    • Qué formato de mensaje vais a usar.
    • Si guardaréis los datos en CSV, JSON o ambos.

    Ejemplo de reparto

    • Arduino 1: temperatura y humedad
    • Arduino 2: luz
    • Arduino 3: movimiento

    6.2. Formato común de los datos

    Todos los grupos debéis usar un formato de texto común para enviar los datos desde Arduino a la Raspberry Pi.

    Formato recomendado

    arduino=A1;sensor=temp;valor=23.4
    arduino=A1;sensor=hum;valor=41.2
    arduino=A2;sensor=luz;valor=820
    arduino=A3;sensor=mov;valor=1

    Reglas del formato

    • Cada línea representa una lectura.
    • Cada dato estará compuesto por pares clave=valor.
    • Los pares estarán separados por ;.
    • Cada línea terminará con salto de línea.

    Este formato es muy sencillo de leer y muy fácil de procesar en Python.


    FASE 2. Montaje del hardware

    7. Conexión de sensores a los Arduinos

    Cada grupo conectará los sensores asignados a sus placas Arduino.

    Recomendaciones

    • Revisad siempre el voltaje de trabajo del sensor.
    • Comprobad si necesita resistencia pull-up o pull-down.
    • Verificad qué pin usaréis: digital o analógico.
    • Etiquetad en vuestra documentación qué sensor está conectado a qué pin.

    Ejemplo de tabla de montaje

    ArduinoSensorTipo de pinPin usado
    A1Sensor de temperaturaAnalógicoA0
    A1Sensor de humedadAnalógicoA1
    A2LDRAnalógicoA0
    A3PIRDigitalD2

    8. Conexión de los Arduinos a la Raspberry Pi

    Una vez que cada Arduino funcione correctamente con su sensor, debéis conectarlos a la Raspberry Pi mediante USB.

    Importante

    • Cada Arduino se conectará con su propio cable USB.
    • Si no hay suficientes puertos USB en la Raspberry, usad un hub USB.
    • Si usáis varios Arduinos, es recomendable que el hub sea alimentado externamente.

    FASE 3. Programación de cada Arduino

    9. Objetivo del código Arduino

    Cada Arduino debe:

    1. Inicializar su comunicación serie.
    2. Leer el valor del sensor.
    3. Construir un mensaje con el formato definido.
    4. Enviar ese mensaje por el puerto serie.
    5. Repetir el proceso cada cierto tiempo.

    10. Estructura general del programa Arduino

    Ejemplo genérico

    const String ID_ARDUINO = "A1";
    
    void setup() {
      Serial.begin(9600);
    }
    
    void loop() {
      int valorSensor = analogRead(A0);
    
      Serial.print("arduino=");
      Serial.print(ID_ARDUINO);
      Serial.print(";sensor=luz;valor=");
      Serial.println(valorSensor);
    
      delay(2000);
    }

    11. Recomendaciones para el código Arduino

    • No enviéis datos demasiado rápido.
    • Para empezar, una lectura cada 1 o 2 segundos es suficiente.
    • No mezcléis mensajes de depuración con mensajes de datos.
    • Usad siempre el mismo formato.

    Mal ejemplo

    Serial.println("Leyendo sensor...");
    Serial.println(valor);

    Buen ejemplo

    Serial.println("arduino=A1;sensor=luz;valor=830");

    FASE 4. Comprobación de los Arduinos en la Raspberry Pi

    12. Detectar los puertos serie

    Cuando conectéis los Arduinos a la Raspberry, debéis comprobar qué puertos se han creado.

    Comandos útiles

    ls /dev/ttyACM*
    ls /dev/ttyUSB*

    También podéis usar:

    dmesg | tail

    Posible resultado

    /dev/ttyACM0
    /dev/ttyACM1
    /dev/ttyACM2

    Cada uno suele corresponder a un Arduino distinto.


    13. Identificación más estable de los dispositivos

    En algunos casos, el nombre /dev/ttyACM0 puede cambiar al reiniciar o reconectar.

    Para identificar los puertos de forma más estable, podéis usar:

    ls /dev/serial/by-id/

    Esto mostrará nombres más largos, pero normalmente más estables.


    14. Prueba manual del puerto serie

    Antes de escribir el programa final en Python, comprobad que la Raspberry recibe datos.

    Podéis usar herramientas como:

    cat /dev/ttyACM0

    O instalar herramientas como screen o minicom.


    FASE 5. Preparación del entorno Python en Raspberry Pi

    15. Instalar Python y pyserial

    Normalmente Python ya estará instalado. Debéis instalar la librería pyserial.

    sudo apt update
    sudo apt install python3-pip -y
    pip3 install pyserial

    Si el sistema os da problemas con permisos, podéis usar entorno virtual o instalar el paquete del sistema si está disponible.


    FASE 6. Programa receptor en Raspberry Pi

    16. Objetivo del programa Python

    El script en Python debe:

    • abrir varios puertos serie,
    • escuchar los datos de varios Arduinos,
    • interpretar cada línea recibida,
    • añadir fecha y hora,
    • guardar los datos en CSV o JSON.

    17. Formato final recomendado de almacenamiento

    Opción CSV

    timestamp,arduino,sensor,valor
    2026-03-10 10:15:00,A1,temp,23.4
    2026-03-10 10:15:01,A1,hum,41.2
    2026-03-10 10:15:03,A2,luz,820

    Opción JSON (un registro por línea)

    {"timestamp":"2026-03-10 10:15:00","arduino":"A1","sensor":"temp","valor":"23.4"}
    {"timestamp":"2026-03-10 10:15:01","arduino":"A1","sensor":"hum","valor":"41.2"}
    {"timestamp":"2026-03-10 10:15:03","arduino":"A2","sensor":"luz","valor":"820"}

    18. Script Python de ejemplo para varios Arduinos y CSV

    import serial
    import threading
    import csv
    import os
    from datetime import datetime
    
    PUERTOS = [
        "/dev/ttyACM0",
        "/dev/ttyACM1",
        "/dev/ttyACM2"
    ]
    
    BAUDIOS = 9600
    ARCHIVO_CSV = "datos_sensores.csv"
    CAMPOS = ["timestamp", "arduino", "sensor", "valor"]
    lock_csv = threading.Lock()
    
    
    def parsear_linea(linea):
        datos = {}
        partes = linea.strip().split(";")
        for parte in partes:
            if "=" in parte:
                clave, valor = parte.split("=", 1)
                datos[clave.strip()] = valor.strip()
        return datos
    
    
    def inicializar_csv():
        if not os.path.exists(ARCHIVO_CSV) or os.path.getsize(ARCHIVO_CSV) == 0:
            with open(ARCHIVO_CSV, "w", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=CAMPOS)
                writer.writeheader()
    
    
    def guardar_csv(registro):
        with lock_csv:
            with open(ARCHIVO_CSV, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=CAMPOS)
                writer.writerow(registro)
    
    
    def escuchar_puerto(puerto):
        try:
            ser = serial.Serial(puerto, BAUDIOS, timeout=1)
            print(f"Escuchando {puerto}")
    
            while True:
                linea = ser.readline().decode("utf-8", errors="ignore").strip()
    
                if linea:
                    print(f"{puerto} -> {linea}")
                    datos = parsear_linea(linea)
    
                    if "arduino" in datos and "sensor" in datos and "valor" in datos:
                        registro = {
                            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                            "arduino": datos["arduino"],
                            "sensor": datos["sensor"],
                            "valor": datos["valor"]
                        }
                        guardar_csv(registro)
        except Exception as e:
            print(f"Error en {puerto}: {e}")
    
    
    def main():
        inicializar_csv()
        hilos = []
    
        for puerto in PUERTOS:
            hilo = threading.Thread(target=escuchar_puerto, args=(puerto,), daemon=True)
            hilo.start()
            hilos.append(hilo)
    
        for hilo in hilos:
            hilo.join()
    
    
    if __name__ == "__main__":
        main()

    19. Script Python de ejemplo para guardar en JSON

    import serial
    import threading
    import json
    from datetime import datetime
    
    PUERTOS = [
        "/dev/ttyACM0",
        "/dev/ttyACM1"
    ]
    
    BAUDIOS = 9600
    ARCHIVO_JSON = "datos_sensores.jsonl"
    lock_json = threading.Lock()
    
    
    def parsear_linea(linea):
        datos = {}
        partes = linea.strip().split(";")
        for parte in partes:
            if "=" in parte:
                clave, valor = parte.split("=", 1)
                datos[clave.strip()] = valor.strip()
        return datos
    
    
    def guardar_json(registro):
        with lock_json:
            with open(ARCHIVO_JSON, "a", encoding="utf-8") as f:
                f.write(json.dumps(registro, ensure_ascii=False) + "\n")
    
    
    def escuchar_puerto(puerto):
        try:
            ser = serial.Serial(puerto, BAUDIOS, timeout=1)
            print(f"Escuchando {puerto}")
    
            while True:
                linea = ser.readline().decode("utf-8", errors="ignore").strip()
    
                if linea:
                    print(f"{puerto} -> {linea}")
                    datos = parsear_linea(linea)
    
                    if "arduino" in datos and "sensor" in datos and "valor" in datos:
                        registro = {
                            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                            "arduino": datos["arduino"],
                            "sensor": datos["sensor"],
                            "valor": datos["valor"]
                        }
                        guardar_json(registro)
        except Exception as e:
            print(f"Error en {puerto}: {e}")
    
    
    def main():
        hilos = []
    
        for puerto in PUERTOS:
            hilo = threading.Thread(target=escuchar_puerto, args=(puerto,), daemon=True)
            hilo.start()
            hilos.append(hilo)
    
        for hilo in hilos:
            hilo.join()
    
    
    if __name__ == "__main__":
        main()

    FASE 7. Ejecución del programa

    20. Guardar y ejecutar el script

    Guardad el script con un nombre como:

    nano receptor_sensores.py

    Pegad el código, guardadlo y ejecutadlo:

    python3 receptor_sensores.py

    Si todo funciona, deberíais ver en pantalla líneas como estas:

    /dev/ttyACM0 -> arduino=A1;sensor=temp;valor=23.7
    /dev/ttyACM1 -> arduino=A2;sensor=luz;valor=801
    /dev/ttyACM2 -> arduino=A3;sensor=mov;valor=1

    21. Comprobar los archivos generados

    Para CSV

    cat datos_sensores.csv

    Para JSON

    cat datos_sensores.jsonl

    FASE 8. Validación del sistema

    22. Qué debéis comprobar

    Debéis verificar que:

    • todos los Arduinos envían datos,
    • la Raspberry recibe los mensajes,
    • los datos se guardan correctamente,
    • cada línea incluye el identificador del Arduino,
    • los archivos se actualizan conforme llegan nuevas lecturas.

    23. Pruebas recomendadas

    Realizad pruebas como estas:

    1. Desconectar un Arduino y comprobar qué ocurre.
    2. Volver a conectarlo.
    3. Modificar el valor del sensor (por ejemplo, tapar una LDR o mover un PIR).
    4. Verificar que el cambio se refleja en el CSV o JSON.
    5. Comprobar si el sistema sigue funcionando con varios Arduinos enviando datos al mismo tiempo.

    FASE 9. Posibles errores y soluciones

    24. Error: no aparece /dev/ttyACM0

    Posibles causas

    • El cable USB no funciona.
    • El Arduino no está correctamente conectado.
    • El sistema no ha detectado la placa.

    Soluciones

    • Probar otro cable.
    • Ejecutar dmesg | tail.
    • Probar con otro puerto USB.

    25. Error: permiso denegado al abrir el puerto serie

    Solución posible

    Añadir el usuario al grupo adecuado:

    sudo usermod -a -G dialout $USER

    Después debéis cerrar sesión y volver a entrar.


    26. Error: el script recibe líneas vacías o mal formadas

    Posibles causas

    • El Arduino está enviando texto extra.
    • La velocidad en baudios no coincide.
    • El formato del mensaje no es correcto.

    Soluciones

    • Revisar Serial.begin(9600) en Arduino.
    • Comprobar que Python usa la misma velocidad.
    • Revisar el formato clave=valor;clave=valor.

    Entrega del trabajo

    27. Qué debéis entregar

    Cada grupo debe entregar:

    1. Código de todos los Arduinos.
    2. Código Python de la Raspberry Pi.
    3. Archivo README o memoria técnica.
    4. Esquema del sistema.
    5. Fotografías del montaje.
    6. Capturas del terminal mostrando la recepción de datos.
    7. Ejemplo del CSV o JSON generado.
    8. Explicación de problemas encontrados y cómo los resolvisteis.

    28. Estructura recomendada de carpetas

    practica-raspberry-arduinos/
    ├── README.md
    ├── arduino/
    │   ├── arduino_1/
    │   │   └── arduino_1.ino
    │   ├── arduino_2/
    │   │   └── arduino_2.ino
    │   └── arduino_3/
    │       └── arduino_3.ino
    ├── raspberry/
    │   ├── receptor_csv.py
    │   └── receptor_json.py
    ├── evidencias/
    │   ├── foto_montaje_1.jpg
    │   ├── terminal_recepcion.png
    │   └── csv_generado.png
    └── datos_ejemplo/
        ├── datos_sensores.csv
        └── datos_sensores.jsonl




    Conclusión

    Esta práctica os permitirá trabajar con una arquitectura completa de adquisición de datos usando varios microcontroladores y un sistema Linux central.

    No se trata solo de conectar cables y leer números, sino de entender cómo diseñar un sistema modular, organizado y ampliable. Ese enfoque es mucho más valioso que hacer una sola lectura aislada en un monitor serie.

    Cuando el sistema funcione, habréis construido una pequeña red de sensores con almacenamiento centralizado, algo muy cercano a muchos proyectos reales de automatización, IoT y monitorización.