Establecer Comunicación UART entre Raspberry Pi 4 y Placas HiFive1
En este laboratorio configurarás enlaces UART fiables entre una Raspberry Pi 4 y una HiFive1, programarás la HiFive1 para hacer eco de los datos recibidos, y crearás un script Python en la Pi para reenviar ángulos de dirección a la placa.
Parte 0: Habilitar UART en la Raspberry Pi 4
La Pi 4 viene con cuatro controladores UART. Para este ejercicio usaremos uart2 y uart3. Añade la siguiente línea a /boot/config.txt y reinicia:
dtoverlay=uart2,115200 dtoverlay=uart3,115200
Tras reiniciar, los nodos de dispositivo /dev/ttyAMA1 (uart2) y /dev/ttyAMA2 (uart3) estarán disponibles.
Conecta las placas de la siguiente forma:
- HiFive1 UART1 RX (pin 7) ↔ Pi 4 UART2 TX (pin 27) – canal de datos para comandos de dirección.
- HiFive1 UART0 TX (pin 1) ↔ Pi 4 UART3 RX (pin 29) – canal de depuración para salida de consola.
Desde la Pi puedes acceder a estos canales vía /dev/ttyAMA1 (enviar a HiFive1) y /dev/ttyAMA2 (recibir consola HiFive1).
Parte 1: Programar la HiFive1
En tu PC (no en la Pi), descarga el proyecto esqueleto:
$ cd ~/Documents/PlatformIO $ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz $ tar zxvf l10-comm.tar.gz
Añade la carpeta l10-interrupt a tu workspace de VSCode. El objetivo es leer datos de UART1, hacer eco en UART0, e imprimir el resultado en consola.
Aquí tienes un algoritmo conciso:
while (1) {
if (ser_isready(1)) {
char data = ser_read(1);
ser_write(0, data);
ser_printline(0, "Received: ");
/* ajustar formato según necesidad */
}
}
La API serial está definida en eecs388_lib.h/c:
void ser_setup(int devid); int ser_isready(int devid); void ser_write(int devid, char c); void ser_printline(int devid, char *str); char ser_read(int devid); int ser_readline(int devid, int n, char *str);
Recuerda que devid = 0 selecciona UART0 y devid = 1 selecciona UART1. La función ser_isready comprueba el registro IP de UART para datos pendientes:
int ser_isready(int devid) {
uint32_t regval = *(volatile uint32_t *)(UART_ADDR(devid) + UART_IP);
return regval;
}
Tras compilar y flashear, cambia a la Pi y abre dos terminales:
- Remitente de datos:
screen /dev/ttyAMA1 115200 - Visor de depuración:
screen /dev/ttyAMA2 115200
Escribe cualquier cadena en la terminal remitente; la misma cadena debería aparecer en la terminal de depuración, confirmando operación correcta.
Parte 2: Script Python en la Raspberry Pi 4
En lugar de terminales manuales, escribe un programa Python que:
- Abra
/dev/ttyAMA1para escribir ángulos de dirección. - Abra
/dev/ttyAMA2para depuración. - Capture frames de cámara, ejecute inferencia DNN, y envíe el ángulo resultante a la HiFive1.
Esqueleto de ejemplo usando pySerial:
import serial
import time
import cv2 # o tu interfaz de cámara
# Abrir puertos seriales
ser1 = serial.Serial('/dev/ttyAMA1', 115200, timeout=1)
ser2 = serial.Serial('/dev/ttyAMA2', 115200, timeout=1)
while True:
# Capturar frame
frame = cv2.imread('frame.jpg') # reemplazar con lectura real de cámara
# Ejecutar inferencia DNN
angle = dnn_inference(frame) # float32
# Convertir float a representación de 4 bytes
angle_bytes = angle.to_bytes(4, byteorder='little', signed=True)
ser1.write(angle_bytes)
# Opcional: leer salida de depuración
debug = ser2.readline().decode().strip()
if debug:
print('HiFive1:', debug)
# Control de tiempo (ej. 30 fps)
time.sleep(1/30)
# Limpieza
ser1.close()
ser2.close()
Nota: Convierte el float a bytes antes de enviar, y usa el mismo orden de bytes en la HiFive1 al interpretar el valor.
Apéndice: Visión General de GPIO y Periféricos de Raspberry Pi 4
La Pi 4 ofrece interfaces I²C, SPI y UART expandidas más allá de los modelos Pi originales. Usa el comando pinout para ver todos los pines:
pinout
Periféricos clave:
- I²C – hasta 6 buses, descubre dispositivos con
sudo i2cdetect -y 1. - SPI – habilita vía
raspi-config, usa líneas estándar SCLK/MOSI/MISO. - UART – serie asíncrono, ideal para comunicación headless o conexión a microcontroladores como la HiFive1.
Para configuración detallada, consulta la documentación oficial de Raspberry Pi: Guía Config-txt.
Proceso de manufactura
- Integración MQTT fluida: sensores NodeMCU DHT22 con Raspberry Pi 3 B+ como broker
- Integración de datos de sensores en Raspberry Pi: Guía práctica
- Integración I2C Fluida entre Arduino y Raspberry Pi 2 para Proyectos IoT con Sensores
- Comunicación M2M (Machine-to-Machine): Qué Es y Por Qué Importa
- Fundamentos de Comunicación Digital: De la Teoría a la Implementación Práctica
- Entendiendo el Flujo de Datos: De Simplex a Comunicación Full-Duplex
- Comunicación Óptica de Datos: Aprovechando la Luz para Transmisión de Alto Ancho de Banda Libre de Interferencias
- Determinismo y Tolerancia a Fallos: Principios Esenciales de Diseño para Redes de Control Industrial
- Dominando UART: el receptor/transmisor asíncrono universal explicado
- Amplificador óptico compacto revolucionario promete comunicaciones espaciales y de fibra sin ruido
- Dominando el alcance de comunicación inalámbrica: Cómo potencia, tasa de datos e interferencia moldean la conectividad