Este documento detalla la arquitectura, lógica y configuración del firmware para el controlador del brazo robótico de 4 grados de libertad (3 ejes cartesianos + 1 Gripper). El sistema corre sobre un STM32F103C8T6 (BluePill) utilizando STM32CubeIDE y la librería HAL.
El proyecto sigue una estructura modular donde se separa la lógica de negocio, el control de hardware y la comunicación.
| Archivo | Propósito / Alcance |
|---|---|
main.c / .h | Punto de Entrada. Configuración inicial de periféricos (HAL_Init), bucle infinito (while(1)), instanciación de variables globales y orquestación entre USB y Motores. |
robot_logic.c / .h | Cerebro del Robot. Interpreta los comandos ASCII recibidos, gestiona la máquina de estados (Calibración, Aprendizaje, Ejecución) y controla la telemetría automática. |
motor_driver.c / .h | Control de Movimiento (Paso a Paso). Contiene la lógica matemática para generar pulsos, rampas (si aplica), rutinas de Homing y gestión de interrupciones de temporizadores para los pasos. |
gripper_driver.c / .h | Control del Efector Final. Maneja el servo mediante PWM. Abstrae los ángulos físicos a comandos lógicos (Open/Close). |
comm_manager.c / .h | Gestor de Comunicación. Wrapper para la transmisión USB (CDC) segura y funciones de utilidad para parseo de cadenas (substrings, atoi). |
stm32f1xx_it.c / .h | Interrupciones. Manejadores de interrupciones de hardware (IRQ Handlers) para Timers y Pines EXTI (Fines de carrera/Emergencia). |
lcd_i2c.c / .h | Driver de Pantalla. Librería de bajo nivel para controlar el LCD 16x2/20x4 mediante el bus I2C. |
robot_defines.h | Definiciones Globales. Contiene las estructuras de datos principales (StepperMotor) y constantes del sistema. |
A continuación se detallan las funciones críticas que dan vida al robot:
void Robot_ProcesarComando(char *cmd): Recibe la trama cruda del USB (ej.:#X100|Y200). Usa unswitchpara derivar al modo correcto::--> Modo Calibración (Homing, Set Zero, Config Velocidad).:#-> Modo Ejecución (Movimiento coordinado).
uint8_t Robot_ModoEjecucion(void): Parsea coordenadas X, Y, Z y actualiza el setpoint de los motores. Aplica la velocidad global configurada.void Robot_UpdateTelemetry(void): Se ejecuta cada 50ms. Verifica si hubo cambios en posición o sensores y envía el estado al PC:STATUS|X:100|Y:100|....
void moveMotors(StepperMotor *motor, ...): No mueve el motor directamente. Calcula el intervalo de tiempo necesario entre pasos basándose en la velocidad deseada y la resolución del timer.void Motor_Timer_Callback(void): Llamada desde la interrupción del Timer. Si el contador llega al intervalo calculado, genera un pulso físico en el pinSTEP.int HomingMotors(...): Rutina bloqueante. Mueve los ejes secuencialmente hacia el sensor, espera la interrupción y establece el cero lógico.
EXTI15_10_IRQHandler: Se dispara al tocar cualquier fin de carrera o el botón de emergencia. Llama inmediatamente aMotor_Sensor_Triggeredpara detener los pulsos.
| Eje | Pin STEP | Pin DIR | Notas |
|---|---|---|---|
| X | PA0 | PA3 | |
| Y | PA1 | PA4 | |
| Z | PA2 | PA5 | |
| Enable | PB8 | - | Activo en BAJO (Lógica negativa) |
| Función | Pin | Interrupción |
|---|---|---|
| Fin X | PB12 | EXTI Line 12 |
| Fin Y | PB13 | EXTI Line 13 |
| Fin Z | PB14 | EXTI Line 14 |
| E-STOP | PB15 | EXTI Line 15 (Prioridad Máxima) |
- Servo (Gripper):
PB9(PWM TIM4 CH4). - LCD I2C:
PB6(SCL),PB7(SDA). - LEDs Estado:
PB3(Home),PB4(Finish),PB5(Wait). - USB:
PA11(DM),PA12(DP).
El sistema utiliza interrupciones de temporizador para generar los pasos con precisión.
- TIM2: Generación de Pasos. Configurado a 20 kHz. Es el "metrónomo" del sistema.
- TIM3: Base de Tiempo (Segundos). Usado para timeouts en rutinas de homing (Watchdog por software).
- TIM4: PWM Servo. Frecuencia 50Hz (Periodo 20ms) para control estándar de servos.
Considerando el siguiente hardware estándar:
- Motor: NEMA 17 (1.8° por paso = 200 pasos/vuelta).
- Driver: A4988 en modo Full Step (Microstepping desactivado o MS1/MS2/MS3 a GND).
- Timer Frequency (
TIMER_FREQUENCY): 20,000 Hz.
El firmware recibe un valor de velocidad (V) que se interpreta directamente como frecuencia en Hz (Pasos por segundo).
Para saber la velocidad rotacional real del eje:
Ejemplos Prácticos:
| Comando USB | Velocidad (Hz) | RPM (Eje Motor) | Descripción |
|---|---|---|---|
:-V010 | 100 Hz | 30 RPM | Velocidad muy lenta (precisión). |
:-V050 | 500 Hz | 150 RPM | Velocidad media. |
:-V100 | 1000 Hz | 300 RPM | Velocidad rápida (Límite típico sin rampa). |
Nota: La variable
velocidadGlobalen el código se escala multiplicando el input por 10 (Input 10-100 -> Output 100-1000 Hz).