10/04/2024
En el vasto universo de la electrónica y la programación, la comunicación entre dispositivos es la piedra angular de cualquier proyecto ambicioso. Arduino, siendo una plataforma de prototipado electrónico de código abierto, no es una excepción. Para que nuestros microcontroladores interactúen con otros sistemas, ya sean ordenadores, sensores o incluso otros Arduinos, necesitamos un método de intercambio de información. Aquí es donde entra en juego la comunicación serie, una de las formas más fundamentales y versátiles de lograr esta interacción. Este artículo te sumergirá en el corazón de la librería Serial de Arduino, explorando cómo permite la transmisión de datos de manera eficiente y sin la necesidad de un reloj de sincronización compartido entre el transmisor y el receptor. Prepárate para desentrañar sus funciones clave y descubrir cómo puedes conectar tu Arduino con el mundo exterior, incluso integrando la potencia de Python para una interacción aún más dinámica.

¿Qué es la Librería Serial de Arduino?
La librería Serial de Arduino es un conjunto de funciones predefinidas que facilitan la comunicación serie a través de los pines digitales 0 (RX) y 1 (TX) de la placa (o a través del puerto USB virtual en la mayoría de las placas, que internamente usa estos pines). Su principal característica es que permite la transmisión de datos de forma asíncrona, lo que significa que no se requiere una señal de reloj común para sincronizar el envío y la recepción de datos. En cambio, ambas partes deben acordar una "velocidad de transmisión" o "baudios" (baud rate), que es la cantidad de bits por segundo que se transfieren. Esta simplicidad la convierte en una herramienta invaluable para depurar código, enviar comandos o recibir datos de sensores.
Configuración Inicial: Serial.begin()
Antes de poder enviar o recibir cualquier dato, es fundamental inicializar la comunicación serie. Esto se logra con la función Serial.begin(). Esta función toma un argumento obligatorio: la velocidad en baudios. Las velocidades comunes incluyen 9600, 19200, 38400, 57600 y 115200. Es crucial que tanto el Arduino como el dispositivo con el que se comunica estén configurados a la misma velocidad para evitar la corrupción de datos.
void setup() { Serial.begin(9600); // Inicializa la comunicación serie a 9600 baudios } void loop() { // Aquí irá el resto de tu código }Una vez que Serial.begin() ha sido llamada en la función setup(), la comunicación serie está lista para usarse.
Envío de Datos: Serial.print() y Serial.println()
Las funciones Serial.print() y Serial.println() son tus herramientas principales para enviar datos desde Arduino a un monitor serie (como el del IDE de Arduino) o a otro dispositivo. La diferencia fundamental entre ambas es que Serial.println() añade un carácter de nueva línea al final de los datos enviados, mientras que Serial.print() no lo hace.
void setup() { Serial.begin(9600); } void loop() { Serial.print("Hola"); // Envía "Hola" sin nueva línea Serial.print(" "); // Envía un espacio Serial.println("Mundo!"); // Envía "Mundo!" y un salto de línea delay(1000); // Espera un segundo }Estas funciones son increíblemente versátiles, ya que pueden imprimir varios tipos de datos: texto (cadenas de caracteres), números enteros, números decimales e incluso valores booleanos. También permiten especificar la base numérica para los números (binario, octal, decimal, hexadecimal).
Serial.print(123, DEC); // Imprime "123" Serial.print(123, HEX); // Imprime "7B" Serial.print(123, BIN); // Imprime "1111011" Serial.print(3.14, 2); // Imprime "3.14" (2 decimales)Recepción de Datos: Serial.available() y Serial.read()
Para que Arduino reciba datos, necesitamos dos funciones clave: Serial.available() y Serial.read().
Serial.available()
Esta función devuelve el número de bytes (caracteres) disponibles en el búfer de entrada serie. El búfer serie es una pequeña área de memoria donde se almacenan los datos entrantes hasta que el programa los lee. Es crucial verificar si hay datos disponibles antes de intentar leerlos, para evitar errores o lecturas de datos vacíos.
if (Serial.available() > 0) { // Hay datos para leer }Serial.read()
Una vez que sabemos que hay datos disponibles, Serial.read() se encarga de leer el primer byte disponible del búfer de entrada serie y lo devuelve. Si no hay datos disponibles, devuelve -1. Es importante tener en cuenta que Serial.read() lee un solo byte a la vez.
void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char incomingByte = Serial.read(); // Lee el byte entrante Serial.print("Recibí: "); Serial.println(incomingByte); // Imprime el byte recibido } }Cómo Leer una Línea Completa en Arduino
Mientras que Serial.read() lee byte a byte, a menudo necesitamos leer una línea completa de texto, que generalmente termina con un carácter de nueva línea (\n) o un retorno de carro (\r). Aunque la librería Serial no tiene una función directa como readLine() para esto, podemos construirla usando un bucle y las funciones que ya conocemos.
String readString; // Variable para almacenar la línea void setup() { Serial.begin(9600); Serial.println("Listo para recibir comandos:"); } void loop() { while (Serial.available()) { char c = Serial.read(); // Lee cada carácter readString += c; // Añade el carácter a la cadena delay(2); // Pequeña pausa para permitir que todos los bytes lleguen } if (readString.length() > 0) { // Si hay algo en la cadena y el último carácter es un salto de línea if (readString.endsWith("\n")) { // Eliminar el salto de línea para procesar la cadena limpia readString.trim(); // Elimina espacios en blanco y saltos de línea al final Serial.print("Línea recibida: "); Serial.println(readString); // Aquí puedes procesar 'readString' readString = ""; // Limpia la cadena para la siguiente lectura } } }Este enfoque permite acumular caracteres hasta que se detecta un final de línea, momento en el que la cadena completa puede ser procesada. Es un patrón común para leer comandos o datos estructurados.
La Potencia de la Integración: Arduino y Python con PySerial
Python es un lenguaje de programación que ha ganado una enorme popularidad por su sencillez y versatilidad, lo que lo hace ideal para proyectos de Internet de las Cosas (IoT) y la interacción con hardware. Conectar Arduino con Python a través del puerto serie es sorprendentemente fácil gracias a la librería PySerial. Esta combinación abre un abanico de posibilidades, permitiéndonos crear interfaces de usuario complejas, almacenar datos en bases de datos o incluso controlar Arduino desde una aplicación de escritorio.
Instalación de Python y PySerial
Lo primero es asegurarse de tener Python instalado en tu sistema. Si no es así, puedes encontrar guías de instalación para Windows y Linux en la documentación oficial de Python. Una vez que Python esté listo, la instalación de PySerial es sencilla utilizando pip, el gestor de paquetes de Python:
python -m pip install PySerialCon este comando, PySerial se descargará e instalará automáticamente, dejándolo listo para su uso en tus scripts.

Ejemplo 1: Recibir Información de Arduino en Python
Imaginemos que Arduino está enviando datos continuamente y queremos capturarlos y mostrarlos en Python. Primero, cargamos el siguiente sketch en nuestro Arduino. Este sketch simplemente envía la frase "Hola mundo" cada segundo.
// Sketch de Arduino: Enviar "Hola mundo" cada segundo void setup() { Serial.begin(9600); } void loop() { Serial.println("Hola mundo"); delay(1000); }Ahora, en Python, creamos un archivo (por ejemplo, read_arduino.py) con el siguiente código:
import serial, time # Configura el puerto serie (reemplaza 'COM4' por tu puerto de Arduino) # Puedes encontrar el puerto en el IDE de Arduino, en Herramientas -> Puerto arduino = serial.Serial('COM4', 9600) time.sleep(2) # Espera 2 segundos para establecer la conexión try: while True: if arduino.in_waiting > 0: # Verifica si hay datos en el búfer rawString = arduino.readline() # Lee una línea completa (hasta \n) print(rawString.decode('utf-8').strip()) # Decodifica y limpia la cadena except KeyboardInterrupt: print("\nComunicación detenida.") finally: arduino.close() # Cierra el puerto serieEn este script, serial.Serial('COM4', 9600) inicializa la comunicación. Es crucial reemplazar 'COM4' por el puerto COM real al que está conectado tu Arduino (puede ser COM3, /dev/ttyACM0, etc.). time.sleep(2) es importante para dar tiempo al puerto serie para inicializarse. La función arduino.readline() lee la línea de datos hasta que encuentra un carácter de nueva línea. Usamos .decode('utf-8').strip() para convertir los bytes recibidos a una cadena de texto legible y eliminar espacios en blanco o saltos de línea adicionales.
Ejemplo 2: Enviar Información a Arduino desde Python
Ahora, veamos cómo Python puede enviar comandos a Arduino. Utilizaremos un sketch de Arduino que hace parpadear un LED integrado (PIN 13) un número de veces específico, recibido por serie (un dígito del '1' al '9').
// Sketch de Arduino: Controlar LED con número recibido por serie const int pinLED = 13; void setup() { Serial.begin(9600); pinMode(pinLED, OUTPUT); } void loop() { if (Serial.available() > 0) { char option = Serial.read(); // Lee el carácter enviado if (option >= '1' && option <= '9') { int numFlashes = option - '0'; // Convierte el carácter a número entero for (int i = 0; i < numFlashes; i++) { digitalWrite(pinLED, HIGH); delay(100); digitalWrite(pinLED, LOW); delay(200); } } } }Y aquí el script de Python (por ejemplo, write_arduino.py) para enviar el número:
import serial, time arduino = serial.Serial("COM4", 9600) time.sleep(2) try: # Enviar el número '5' como un byte # Es crucial enviar bytes, por eso la 'b' antes de la cadena arduino.write(b'5') print("Enviado '5' a Arduino.") except Exception as e: print(f"Error al enviar datos: {e}") finally: arduino.close() print("Puerto serie cerrado.")En este caso, arduino.write(b'5') envía el carácter '5' como un byte. Es fundamental anteponer una b al carácter o cadena en Python para indicar que se está enviando un literal de bytes, ya que la función write() de PySerial espera bytes y no cadenas de texto estándar.
Funciones Adicionales y Consideraciones
La librería Serial de Arduino ofrece otras funciones útiles para la comunicación:
Serial.readBytes(buffer, length): Lee un número específico de bytes en un búfer.Serial.readString(): Lee caracteres del búfer serie en una cadena hasta que el tiempo de espera (timeout) expire.Serial.parseFloat()/Serial.parseInt(): Funciones muy útiles para leer números flotantes o enteros del búfer serie, ignorando caracteres no numéricos.Serial.setTimeout(timeout): Establece el tiempo máximo en milisegundos para esperar datos serie cuando se usan funciones comoreadBytes()oreadString().Serial.flush(): Espera a que la transmisión de datos salientes se complete. No vacía el búfer de entrada.
Tabla Comparativa: print() vs. write()
Aunque a menudo usamos Serial.print(), es importante entender la diferencia con Serial.write(), especialmente cuando se trabaja con datos binarios.
| Función | Descripción | Uso Principal | Tipo de Dato |
|---|---|---|---|
Serial.print() / Serial.println() | Envía datos legibles por humanos (ASCII) al puerto serie. | Depuración, envío de mensajes de texto. | Cadenas, números (convertidos a ASCII). |
Serial.write() | Envía bytes binarios crudos al puerto serie. | Comunicación con protocolos específicos, envío de valores numéricos como bytes. | Bytes (valores numéricos de 0 a 255). |
Cuando envías un número como Serial.print(65), se envía la cadena "65". Cuando envías Serial.write(65), se envía el carácter cuyo código ASCII es 65, que es la letra 'A'. Entender esta distinción es clave para una comunicación serie efectiva.
Preguntas Frecuentes (FAQ)
¿Por qué mis datos serie aparecen como caracteres extraños?
Esto casi siempre se debe a una velocidad en baudios (baud rate) incorrecta. Asegúrate de que la velocidad configurada en Serial.begin() en tu código de Arduino coincida exactamente con la velocidad configurada en el monitor serie de tu IDE, o en tu script de Python.
¿Qué es el búfer serie y cómo me afecta?
El búfer serie es una pequeña área de memoria RAM (generalmente 64 bytes) que almacena los datos entrantes hasta que tu programa los lee. Si recibes datos más rápido de lo que los procesas, el búfer puede desbordarse, y los datos más antiguos se perderán. Es vital procesar los datos de forma eficiente usando Serial.available().
¿Puedo usar los pines 0 y 1 para otras cosas si no uso la comunicación serie?
Sí, los pines digitales 0 (RX) y 1 (TX) son los pines de comunicación serie hardware. Si no estás usando la comunicación serie a través de USB (o si tu placa no tiene un chip USB-serie dedicado), puedes usarlos como pines digitales normales. Sin embargo, si estás cargando un programa o usando el monitor serie, estos pines se utilizan para la comunicación y no deben interferir con otros componentes.
¿Cómo sé qué puerto COM usar en Python?
En el IDE de Arduino, ve a Herramientas -> Puerto y verás la lista de puertos disponibles con tu Arduino conectado. Será algo como COMx en Windows o /dev/ttyUSBx o /dev/ttyACMx en Linux/macOS. Asegúrate de que el IDE de Arduino no esté abierto y conectado al puerto mientras intentas usarlo con Python, ya que solo un programa puede acceder al puerto a la vez.
Conclusión
La librería Serial de Arduino es una herramienta fundamental que todo desarrollador debe dominar. Desde la depuración básica de código hasta la construcción de sistemas complejos que interactúan con ordenadores o dispositivos externos, la comunicación serie es indispensable. Hemos explorado sus funciones esenciales, desde la inicialización con Serial.begin() hasta el envío y la recepción de datos con print(), read() y available(). Además, hemos visto cómo la integración con Python a través de PySerial amplifica enormemente las capacidades de nuestros proyectos, permitiendo una interacción fluida y poderosa. Con estos conocimientos, tienes las bases sólidas para hacer que tus proyectos de Arduino no solo funcionen de forma aislada, sino que se comuniquen y se conecten con un ecosistema más amplio, abriendo la puerta a un sinfín de posibilidades en el mundo de la electrónica y la programación.
Si quieres conocer otros artículos parecidos a Comunicación Serie en Arduino: Guía Completa puedes visitar la categoría Librerías.
