Saltar a contenido
← Volver a OPRobots.org

Comunicaciones

UltiBot tiene dos sistemas de comunicación: un enlace USART entre los dos microcontroladores (protocolo de comandos de motor) y un receptor infrarrojo RC5 para control remoto (inicio/parada/menú).

Enlace USART — Placa Principal ↔ Placa FOC

Parámetro Valor
Periférico USART6 (STM32F4) ↔ USART3 (STM32F1)
Velocidad 115200 baudios
Formato 8N1 (8 bits, sin paridad, 1 stop)
Pines PA11 (TX), PA12 (RX)
Protocolo Texto delimitado por \n

Protocolo de comandos

El protocolo es ASCII con un carácter de comando seguido de un valor entero, terminado por salto de línea:

Comando Formato Acción
D D0\n Deshabilitar motores
E E0\n Habilitar motores
L L30\n Velocidad motor izquierdo (-80 a 80)
R R-50\n Velocidad motor derecho (-80 a 80)

El comando se envía mediante printf(), que en UltiBot transmite a ambos USART1 (debug) y USART6 (FOC) simultáneamente.

⚠️ Advertencia: Cualquier printf() de debug se envía también a la placa FOC. La salida de debug puede interferir con el protocolo de comandos. Ver CM-01.

sequenceDiagram
    participant Main as STM32F4 (Main)
    participant FOC as STM32F1 (FOC)

    Main->>FOC: E0\n (enable)
    Main->>FOC: L30\n (vel. izq.)
    Main->>FOC: R30\n (vel. der.)
    Note over Main,FOC: ... combate ...
    Main->>FOC: L0\n (parar izq.)
    Main->>FOC: R0\n (parar der.)
    Main->>FOC: D0\n (disable)

Implementación

El envío se realiza en motors.c:17:

void set_motors_speed(int16_t velI, int16_t velD) {
  // clamp a [-80, 80]
  send_command(CMD_MOTOR_SPEED_LEFT, velI);
  send_command(CMD_MOTOR_SPEED_RIGHT, velD);
}

send_command() usa printf("%c%d\n", command, value) que transmite por ambos USARTs.

La recepción en la placa FOC se gestiona en la ISR de USART3, con un buffer de 8 bytes y parseo al recibir \n. Ver documentación de OPRcontrolFOC.


Control Remoto RC5

Parámetro Valor
Protocolo RC5 (Philips)
Frecuencia portadora 36 kHz
Bits por trama 14 (2 start + 1 toggle + 5 address + 6 command)
Receptor IR demodulador en PB3 (EXTI3)
Decodificación Manchester por flancos

Direcciones y comandos

Dirección Valor Función
ADDRESS_PROG 0x0B Programar códigos del mando
ADDRESS_COMP 0x07 Iniciar/parar competición
ADDRESS_MENU 0x1B Navegación de menú
Comando Valor Función
CUSTOM_CMD_MENU 0x0D Cambio de modo de menú
CUSTOM_CMD_MENU_UP 0x0E Cambio de configuración (arriba)
CUSTOM_CMD_MENU_DOWN 0x0C Cambio de configuración (abajo)

Modo de programación

Al recibir una trama con ADDRESS_PROG, el firmware almacena los códigos del mando en EEPROM. Los comandos se derivan secuencialmente: - DATA_STOP = command - DATA_START = command + 1 - DATA_MENU = command - DATA_MENU_UP = command + 1 - DATA_MENU_DOWN = command + 2

ISR de decodificación

stateDiagram-v2
    [*] --> STATE_MID1
    STATE_MID1 --> STATE_MID0: evento 0
    STATE_MID1 --> STATE_START1: evento start
    STATE_MID0 --> STATE_MID1: evento 1
    STATE_MID0 --> STATE_START0: evento start
    STATE_START1 --> STATE_MID1: tras start
    STATE_START0 --> STATE_MID0: tras start

La ISR alterna entre flancos de subida y bajada, midiendo la duración entre ellos para clasificar pulsos cortos (444–1333 µs) y largos (1334–2222 µs).


Salida de Debug — USART1

Parámetro Valor
Periférico USART1
Velocidad 115200 baudios
Pines PA9 (TX), PA10 (RX)
Función Consola serie (USB-Serial)

Los modos de debug RAW, CALIBRATED y POSITION imprimen por USART1 a 20 Hz.

Nota: La función _write() transmite tanto por USART1 como por USART6. Ver CM-01 para el impacto de este diseño.


Documento generado el 2026-06-30. Ver también Arquitectura Software, Debug, Menú.