El UART es uno de los interfaces más utilizados para comunicar Raspberry Pi con otros dispositivos, como sensores, módulos GPS, módulos Bluetooth, y otros microcontroladores.
El UART (Universal Asynchronous Receiver-Transmitter) es un protocolo de comunicación serial que permite la transmisión de datos entre dispositivos de forma asíncrona.
A veces lo vais a oir llamar simplemente “puerto serie”, sobre todo si venís del mundillo de Arduino o similar.
Vamos a ver cómo podemos usarlo con una Raspberry Pi 👇
¿Qué es UART?
UART es un protocolo de comunicación serial que utiliza dos líneas de datos: TX (Transmisión) y RX (Recepción). Estas líneas permiten la comunicación bidireccional entre dos dispositivos.
- TX (Transmisión): Envía datos desde el dispositivo.
- RX (Recepción): Recibe datos en el dispositivo.
La comunicación UART es asíncrona, lo que significa que no hay una señal de reloj compartida entre los dispositivos. En su lugar, ambos dispositivos deben estar configurados para usar la misma velocidad de transmisión, conocida como baud rate.
A diferencia de otros protocolos como SPI o I2C, UART no requiere un reloj compartido, lo que lo hace más simple pero también más lento en comparación.
Si quieres aprender más sobre Puerto Serie consulta,
UART en Raspberry Pi
La Raspberry Pi tiene un puerto UART integrado que se puede utilizar para comunicarse con otros dispositivos. En la mayoría de los modelos de Raspberry Pi, el UART está disponible en los pines GPIO:
- TX (GPIO 14): Pin 8 en el conector GPIO.
- RX (GPIO 15): Pin 10 en el conector GPIO.
Además, el UART en Raspberry Pi puede ser utilizado para la comunicación con la consola serial, lo que es útil para la depuración y la configuración del sistema.
Es importante tener en cuenta que el UART en Raspberry Pi funciona a 3.3V, mientras que muchos dispositivos, como los Arduinos, funcionan a 5V.
Para evitar daños en la Raspberry Pi, es necesario utilizar un convertidor de nivel lógico.
Configuración del UART en Raspberry Pi
Habilitar la consola serial
Por defecto, el UART en Raspberry Pi puede estar deshabilitado o utilizado para la consola serial. Para habilitarlo, debemos modificar el archivo de configuración del sistema.
Abre el archivo de configuración:
sudo nano /boot/config.txt
Busca la línea que comienza con enable_uart
y asegúrate de que esté configurada como sigue:
enable_uart=1
Guarda los cambios y reinicia la Raspberry Pi:
sudo reboot
Verificar el UART
Para verificar que el UART está funcionando correctamente, puedes utilizar el siguiente comando:
ls /dev/serial*
Si el UART está habilitado, deberías ver algo como /dev/serial0
o /dev/ttyAMA0
.
Deshabilitar la consola serial
Si no necesitas la consola serial y quieres liberar el UART para otros usos, puedes deshabilitarla:
Abre el archivo de configuración:
sudo nano /boot/cmdline.txt
Elimina cualquier referencia a console=serial0,115200
o console=ttyAMA0,115200
.
Guarda los cambios y reinicia la Raspberry Pi:
sudo reboot
Ejemplo práctico
Vamos a ver cómo funciona, con un ejemplo práctico de cómo utilizar el UART para comunicar una Raspberry Pi con un Arduino.
- Conecta el TX de la Raspberry Pi al RX del Arduino.
- Conecta el RX de la Raspberry Pi al TX del Arduino.
- Conecta el GND de la Raspberry Pi al GND del Arduino.
Código en Arduino
El siguiente código en Arduino espera recibir un carácter por UART y luego lo devuelve a la Raspberry Pi.
void setup() {
Serial.begin(9600); // Inicializa el UART a 9600 baudios
}
void loop() {
if (Serial.available() > 0) {
char receivedChar = Serial.read(); // Lee un carácter recibido
Serial.print("Received: ");
Serial.println(receivedChar); // Devuelve el carácter recibido
}
}
Código en Raspberry Pi
En la Raspberry Pi, utilizaremos Python para enviar y recibir datos a través del UART. Asegúrate de tener instalada la biblioteca pyserial
:
sudo apt-get install python3-serial
Luego, puedes utilizar el siguiente código en Python:
import serial
import time
# Configura el puerto serial
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
ser.flush()
try:
while True:
# Envía un carácter al Arduino
ser.write(b'A')
print("Sent: A")
# Espera una respuesta
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(f"Received: {line}")
time.sleep(1)
except KeyboardInterrupt:
print("Program terminated")
finally:
ser.close()
Ahora
- Sube el código al Arduino.
- Ejecuta el script de Python en la Raspberry Pi.
- Deberías ver en la consola de la Raspberry Pi que se envía el carácter
A
y se recibe la respuesta del Arduino.