
El controlador CL57T es la placa que mueve los tres ejes del manipulador: base, codo y muñeca. Recibe de la NUC la posición a la que tiene que ir cada eje y la convierte en los pulsos que hacen girar sus motores.
Sinopsis
Sección titulada «Sinopsis»Una placa de diseño propio basada en un ESP32-C3. No mueve los motores
por sí misma: genera las señales de paso (PUL) y dirección (DIR)
para tres drivers CL57T comerciales, que son los
que entregan la potencia a cada motor NEMA17.
Comparte arquitectura con el módulo Puente H —ESP32-C3, aislamiento óptico, conectores I²C encadenables— pero sin etapa de potencia: de esta placa solo salen señales lógicas. Por eso es más pequeña y usa optoacopladores PC817 en lugar de 4N25.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Motor compatible | NEMA17 | — | |
| Tipo de lazo | Cerrado | — | encoder incremental |
| Señales desde esta placa | PUL, DIR | — | detalle en Drivers y motores |
Cómo funciona
Sección titulada «Cómo funciona»La NUC no le habla directamente. Manda la orden al Puente H maestro por USB,
y el maestro la reenvía por I²C a esta placa, que escucha en la dirección
0x0B. Cada orden es una línea de texto —CODO_GOTO <grados>,
POSE <base> <codo> <muñeca>— y la placa responde cuando el movimiento
termina.
Para cada eje convierte el ángulo pedido en pasos, según la reducción de su transmisión, y los emite con una rampa de aceleración y frenado. En cada encendido busca el cero del codo y de la muñeca con sus finales de carrera.
| 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/° |
Conexiones
Sección titulada «Conexiones»Del operador al motor. Cada tramo lleva el medio por el que viaja la orden.
Meta Quest 3interfaz XR- ZMQ · cmd (manip_cmd)
NUCPython 3.12- Serial · COM4
Puente H maestroESP32-C3- I²C 0x0B · texto ASCII
Controlador CL57TESP32-C3- PUL / DIR
Driver CL57T × 3lazo cerrado
NEMA17 + reductor planetario × 3base, codo y muñeca- SW2 GPIO3 · SW3 GPIO4Finales de carrera × 2 → Controlador CL57T: contacto en el tope
Finales de carrera × 2codo y muñeca
Del controlador cuelgan los dos finales de carrera que lee el firmware,
los del codo y la muñeca. La base tiene el suyo en la entrada SW1, pero el
firmware no lo lee. Sus entradas están en Asignación de
pines.
Drivers y motores
Sección titulada «Drivers y motores»Los actuadores del brazo son tres pares driver–motor, uno por eje. Esta placa solo les manda pulsos: la potencia la entregan los drivers.
Driver CL57T
Sección titulada «Driver CL57T»
Un driver comercial de motor paso a paso de lazo cerrado: además de mover el motor, lee su encoder y corrige la posición si el motor pierde pasos por carga. Por eso el brazo puede trabajar con motores de laboratorio sin que un tirón lo descuadre.
Recibe dos señales de esta placa por eje:
- PUL, un pulso por paso. En reposo la línea queda en alto y cada paso es un pulso en bajo; el bajo y el alto duran lo mismo, así que el valor de rampa del firmware es medio periodo.
- DIR, el sentido. Tras cambiarla, el firmware espera 200 µs antes del primer pulso para que el driver la vea estable.
El firmware no conmuta la entrada de habilitación: en la tabla de pines no
hay GPIO para ENABLE. Tampoco lee la salida de alarma del driver.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Pulsos por vuelta del motor | 1 000 | pulsos | deducido: 10 000 ÷ 10 en la base, 25 000 ÷ 25 en codo y muñeca |
| Pulsos por vuelta de la base | 10 000 | pulsos | reducción total 10:1 |
| Pulsos por vuelta de codo y muñeca | 25 000 | pulsos | reducción total 25:1 |
Los micropasos se fijan con los DIP switches de cada driver, y deben dar esos 1 000 pulsos por vuelta. Con otro ajuste el brazo se mueve, pero los ángulos que reporta dejan de coincidir con los reales. La corriente de cada driver no está documentada en el proyecto.
Los tres drivers van dentro de la caja de elevación, sobre el soporte de drivers.

NEMA 17 con reductor planetario
Sección titulada «NEMA 17 con reductor planetario»
Cada eje lo mueve un motor paso a paso NEMA 17 —brida cuadrada de 42 mm— con un reductor planetario 10:1 acoplado a su eje. Los motores no se eligieron para esta aplicación: eran el stock del laboratorio, y la reducción es lo que les da el par que el brazo necesita. En codo y muñeca, la banda HTD3M añade otro 2,5:1, como se explica en Mecanismo.
| Eje | Reducción total | Rango | Pasos por grado |
|---|---|---|---|
| Base | 10:1 (planetario) | −80° a +80° | 27,78 |
| Codo | 25:1 (planetario × banda) | 0° a 136,5° | 69,44 |
| Muñeca | 25:1 (planetario × banda) | −220° a 0° | 69,44 |
El modelo de referencia del CAD es un NEMA 17 de 4,4 kg·cm; el número de parte de los motores montados no está documentado.
Archivos
Archivo
STEP — Motor NEMA 17 (referencia)Archivo
STEP — Reductor planetario NEMA 17 (referencia)Velocidades resultantes
Sección titulada «Velocidades resultantes»Con 1 000 pulsos por vuelta y las reducciones de cada eje, los tiempos del firmware dan estas velocidades:
| Fase | Medio periodo | Pasos/s | Motor | Base | Codo y muñeca |
|---|---|---|---|---|---|
| Crucero | 1 600 µs | 312,5 | 18,75 rpm | 11,25 °/s | 4,5 °/s |
| Arranque y frenado | 2 500 µs | 200 | 12 rpm | 7,2 °/s | 2,88 °/s |
| Homing rápido | 1 800 µs | 277,8 | 16,7 rpm | — | 4,0 °/s |
| Homing fino | 3 200 µs | 156,3 | 9,4 rpm | — | 2,25 °/s |
Las rampas de 1 500 pasos equivalen a 54° en la base y a 21,6° en codo y muñeca. Un recorrido completo del codo, de 0° a 136,5°, tarda del orden de medio minuto.
La placa
Sección titulada «La placa»
| 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.

Archivos
Archivo
Gerbers de fabricación — Controlador CL57TArchivo
Lista de materiales — Controlador CL57T (CSV)Costo de fabricación
Sección titulada «Costo de fabricación»
Cifras reales de JLCPCB para un lote de 10 piezas de dos capas, sin ensamble de fábrica. El Puente H cae en el mismo rango.
| Concepto | Costo aproximado |
|---|---|
| Producción | 5,00 USD |
| Envío | 17,50 USD |
| Derechos de importación | 130 MXN |
El envío pesa más del triple que la producción: conviene pedir las dos placas del proyecto en el mismo lote.
Asignación de pines
Sección titulada «Asignación de pines»| 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 |
SW1 | GPIO1 | Final de carrera de la base |
SW2 / SW3 | GPIO3 / GPIO4 | Finales de carrera de codo / muñeca |
SDA / SCL | GPIO8 / GPIO9 | Bus I²C esclavo (dirección 0x0B) |
BTN | GPIO0 | Botón local (homing sin NUC) |
Firmware
Sección titulada «Firmware»El firmware es MicroPython sobre el ESP32-C3. Atiende las órdenes por I²C y también por USB serie, que queda siempre disponible para depurar.
Protocolo ASCII por I²C
Sección titulada «Protocolo ASCII por I²C»| 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
Sección titulada «Rutina de homing»El codo y la muñeca buscan su cero en cada encendido, en cuatro fases:
Fase 1 — Búsqueda rápida: avanza hacia el switch (medio periodo 1 800 µs)Fase 2 — Backoff: retrocede 220 pasos (medio periodo 3 200 µs)Fase 3 — Búsqueda fina: avanza de nuevo, lento (medio periodo 3 200 µs)Fase 4 — Clearance final: retrocede 120 pasos → posición cero reproducibleLa base tiene su propio final de carrera, en la entrada SW1, pero el
firmware actual no lo lee: la base no hace homing y arranca desde la
posición en la que haya quedado.
Una 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.
Fuera del homing, los finales de carrera también protegen: si durante
cualquier movimiento se activa el del codo o el de la muñeca, el movimiento
se detiene y la placa responde ABORT.
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. Cada valor es medio periodo del pulso —lo que dura en bajo, y lo mismo en alto—, así que un valor mayor significa ir más despacio: el movimiento arranca con 2 500 µs, acelera hasta 1 600 µs de crucero y vuelve a 2 500 µs para frenar. Las velocidades que resultan están en Velocidades resultantes.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Medio periodo de arranque | 2500 | µs | 200 pasos/s |
| Medio periodo de crucero | 1600 | µs | 312,5 pasos/s |
| Medio periodo de frenada | 2500 | µs | 200 pasos/s |
| 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.
Prueba desde tu PC
Sección titulada «Prueba desde tu PC»La placa acepta por USB los mismos comandos que recibe por I²C, así que se prueba sin el Puente H maestro: basta conectar su USB-C a una PC. El script consulta el estado y, si se lo pides, hace el homing y un vaivén corto de la base. Cada comando de movimiento bloquea hasta terminar.
- Conecta el USB-C del ESP32-C3 a la PC y busca su puerto COM.
- Para mover: drivers CL57T alimentados y el brazo libre de obstáculos.
- Instala la dependencia:
pip install pyserial. - Corre la prueba:
python prueba_controlador_cl57t.py --puerto COM6python prueba_controlador_cl57t.py --puerto COM6 --home --moverpython prueba_controlador_cl57t.py --puerto COM6 --consolaArchivos
Archivo
Prueba del Controlador CL57T — prueba_controlador_cl57t.pyLa placa debe responder PONG y una línea OK busy=0 … con los ángulos y
el estado de los finales de carrera. Tras HOME_ALL, calibrated=1.
Página anterior
Puente HPágina siguiente
Gripper