- Inicio
- El sistema
- Robot
- Sistemas embebidos
- Controlador de drivers (CL57T)
Controlador de drivers (CL57T)
En este artículo
Esta placa de diseño propio genera las señales de paso para los tres drivers de motor del manipulador. Está basada en un ESP32-C3, y cada uno de los drivers que gobierna es un CL57T de lazo cerrado, compatible con NEMA17.
Nivel de replicación
ConstruibleEstá la geometría acotada y el procedimiento. Tendrás que adaptarlos a tus herramientas y materiales.
Lo que encuentras aquí
- Gerbers verificados (13 archivos, incluye taladros PTH) listos para pedido
- Lista de materiales con designadores, cantidades y encapsulados
- Archivo de posiciones y designadores para ensamble
- Firmware completo, con pinout, protocolo, homing y rampas documentados
- Resolución y rango de recorrido de cada eje
Lo que falta para llegar a «Reproducible»
- Números de parte de proveedor: la columna LCSC del BOM está vacía
- Configuración de los DIP switch del propio driver CL57T: micropasos y corriente por fase, que fijan la resolución real del eje
- Diagrama de cableado entre la placa, los tres CL57T y sus fuentes de alimentación
Artefacto
Gerbers de fabricación — Controlador de driversArtefacto
BOM — Controlador de drivers (CSV)Artefacto
main_manipulador_final.pyRequisitos
Sección titulada «Requisitos»El controlador debía:
- Mover los tres ejes del manipulador de forma independiente.
- Generar las señales PUL, DIR y ENABLE hacia cada driver CL57T.
- Aceptar finales de carrera para las rutinas de homing.
- Recibir los comandos de posición desde la NUC por I²C, a través del Puente H maestro.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Motor compatible | NEMA17 | — | |
| Tipo de lazo | Cerrado | — | encoder incremental |
| Señales de control | PUL, DIR, ENABLE | lógica 5 V |
Resolución y rangos por eje
Sección titulada «Resolución y rangos por eje»| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Base | 10 000 | pasos/vuelta | −80° a +80° · 27,78 pasos/° |
| Codo | 25 000 | pasos/vuelta | 0° a 136,5° · 69,44 pasos/° |
| Muñeca | 25 000 | pasos/vuelta | −220° a 0° · 69,44 pasos/° |
La placa
Sección titulada «La placa»Comparte arquitectura con el módulo Puente H —ESP32-C3, aislamiento óptico, conectores I²C encadenables— pero sin etapa de potencia: aquí solo salen señales lógicas hacia los drivers, que son los que manejan los motores. Por eso es más pequeña y usa optoacopladores PC817 en lugar de 4N25.

| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Dimensiones | 56,4 × 59,0 | mm | |
| Capas de cobre | 2 | F.Cu / B.Cu | |
| Espesor de placa | 1,6 | mm | |
| Vías | 16 | — | |
| Ancho de pista | 0,3 – 1,0 | mm | Sin pistas de potencia: no las necesita |
| Designadores | Cant. | Valor | Encapsulado |
|---|---|---|---|
| ESP32-C3 | 1 | ESP32-C3 SuperMini | Módulo SMD |
| U1–U6 | 6 | PC817 | DIP-4, zócalo SMD |
| VP_IN1–VP_IN4 | 4 | Bornera de salida a driver | MX126-5.0, 2 P |
| DATA_IN1, DATA_OUT1 | 2 | Conector I²C | JST EH 4 P vertical |
| CONN01X06 | 1 | Header HC-05 | JST EH 6 P vertical |
| R1, R3, R4, R7, R9–R11 | 7 | 330 Ω | 1206 |
| R20, R21 | 2 | 4,7 kΩ | 1206 |
| R16 | 1 | 10 kΩ | 1206 |
| R5 | 1 | 3,3 kΩ | 1206 |
| C1, C3 | 2 | 100 nF | 1206 |
| D2, D3 | 2 | LED de datos y de potencia | 1206 |
| SW2 | 1 | Pulsador | RS-032G05A3-SMRT |
La placa lleva cuatro borneras de salida para tres ejes: la cuarta quedó como reserva y no se usa en esta configuración.
Asignación de pines ESP32-C3
Sección titulada «Asignación de pines ESP32-C3»| Señal | GPIO | Función |
|---|---|---|
PUL_BASE / DIR_BASE | GPIO20 / GPIO21 | Base |
PUL_CODO / DIR_CODO | GPIO7 / GPIO10 | Codo |
PUL_MUNECA / DIR_MUNECA | GPIO5 / GPIO6 | Muñeca |
SW2 / SW3 | GPIO3 / GPIO4 | Finales de carrera codo / muñeca |
SDA / SCL | GPIO8 / GPIO9 | Bus I²C esclavo (dirección 0x0B) |
BTN | GPIO0 | Botón local (homing sin NUC) |

Flujo de comando de eje
Sección titulada «Flujo de comando de eje»Meta Quest (XR) │ ZMQ cmd (manip_cmd) ▼NUC (Python 3.12) │ Serial COM4 ▼Puente H maestro (ESP32-C3) │ I²C addr 0x0B (texto ASCII) ▼Controlador CL57T (ESP32-C3) │ PUL / DIR / ENABLE ▼Driver CL57T × 3 → NEMA17 + reductor planetario × 3Protocolo ASCII por I²C (esclavo 0x0B)
Sección titulada «Protocolo ASCII por I²C (esclavo 0x0B)»| Comando | Argumento | Respuesta | Descripción |
|---|---|---|---|
| PING | — | PONG | Verificar que el esclavo responde |
| STATE? | — | OK busy=0 sw2=0 sw3=0 calibrated=1 base=… codo=… muneca=… | Estado completo |
| HOME_ALL | — | OK / ERR HOME_ALL | Homing de codo + muñeca |
| BASE_GOTO | grados | OK BASE … | Posición absoluta de base |
| CODO_GOTO | grados | OK CODO … | Posición absoluta de codo |
| MUNECA_GOTO | grados | OK MUNECA … | Posición absoluta de muñeca |
| POSE | base codo muneca | OK POSE … | Los 3 ejes en una sola trama |
Rutina de homing — 4 fases
Sección titulada «Rutina de homing — 4 fases»El codo y la muñeca necesitan homing en cada encendido. La base no lo necesita: no tiene final de carrera, y arranca desde la posición en la que haya quedado.
Fase 1 — Búsqueda rápida: avanza hacia el switch a 1 800 µs/pasoFase 2 — Backoff: retrocede 220 pasos a 3 200 µs/pasoFase 3 — Búsqueda fina: avanza de nuevo a 3 200 µs/paso (más precisión)Fase 4 — Clearance final: retrocede 120 pasos → posición cero reproducibleUna pulsación larga del botón físico (GPIO0) ejecuta HOME_ALL sin
intervención de la NUC. Esa vía sirve durante el desarrollo y para recuperar
el brazo tras un error. La lectura de cada final de carrera aplica un
debounce de 5 ms con doble confirmación.
Compensación mecánica de muñeca
Sección titulada «Compensación mecánica de muñeca»La transmisión de correa HTD3M entre el codo y la muñeca acopla físicamente ambos ejes: cuando el codo gira, la muñeca gira con él aunque nadie se lo haya ordenado.
El firmware compensa ese arrastre emitiendo pulsos hacia el motor de muñeca
en paralelo con los del codo. El efecto es que las dos variables se
separan: el ángulo lógico que ve el operador (pos_muneca) permanece
estable, mientras la posición física del motor (pos_muneca_motor) sí
cambia.
Rampas de velocidad
Sección titulada «Rampas de velocidad»Cada eje usa su propio perfil trapezoidal: aceleración lineal, crucero y deceleración lineal. Esa forma de arrancar y frenar evita la pérdida de pasos al inicio y la vibración al detenerse.
Los tres ejes comparten los mismos valores. El periodo entre pulsos es inverso a la velocidad, así que un periodo mayor significa ir más despacio: el movimiento arranca a 2 500 µs por paso, acelera hasta 1 600 µs de crucero, y vuelve a 2 500 µs para frenar.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Periodo de arranque | 2500 | µs/paso | |
| Periodo de crucero | 1600 | µs/paso | |
| Periodo de frenada | 2500 | µs/paso | |
| Pasos de aceleración | 1500 | pasos | |
| Pasos de deceleración | 1500 | pasos | |
| Asentamiento tras cambio de DIR | 200 | µs | El driver necesita ver DIR estable antes del primer pulso |
La base añade una regla propia: si un movimiento cruza el cero y recorre más de 60°, se parte en dos tramos. Un giro largo de la base a través del origen mueve todo el brazo, y partirlo evita el tirón en el punto de cruce.

Artefacto
Script de calibración del manipuladorVerificación
Sección titulada «Verificación»El controlador alcanza los rangos de cada eje sin pérdida de pasos detectada, y la rutina de homing funciona con los finales de carrera. El control remoto desde la interfaz XR seguía pendiente de integración completa en la última verificación registrada. El detalle está en Verificación del robot móvil.