Ir al contenido

Controlador CL57T

Placa del controlador CL57T, con su módulo ESP32-C3 y sus borneras

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.

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.

Driver CL57T
ParámetroValorUnidadNotas
Motor compatibleNEMA17—
Tipo de lazoCerrado—encoder incremental
Señales desde esta placaPUL, DIR—detalle en Drivers y motores

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.

Resolución por eje (incluye reducción HTD3M + planetario 10:1 en codo y muñeca)
ParámetroValorUnidadNotas
Base10 000pasos/vuelta−80° a +80° · 27,78 pasos/°
Codo25 000pasos/vuelta0° a 136,5° · 69,44 pasos/°
Muñeca25 000pasos/vuelta−220° a 0° · 69,44 pasos/°

Del operador al motor. Cada tramo lleva el medio por el que viaja la orden.

  1. Meta Quest 3interfaz XR
  2. ZMQ · cmd (manip_cmd)
  3. NUCPython 3.12
  4. Serial · COM4
  5. Puente H maestroESP32-C3
  6. I²C 0x0B · texto ASCII
  7. Controlador CL57TESP32-C3
  8. PUL / DIR
  9. Driver CL57T × 3lazo cerrado
  10. NEMA17 + reductor planetario × 3base, codo y muñeca
  11. 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.

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 de motor paso a paso 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.

Configuración que asume el firmware
ParámetroValorUnidadNotas
Pulsos por vuelta del motor1 000pulsosdeducido: 10 000 ÷ 10 en la base, 25 000 ÷ 25 en codo y muñeca
Pulsos por vuelta de la base10 000pulsosreducción total 10:1
Pulsos por vuelta de codo y muñeca25 000pulsosreducció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.

Conexiones de los drivers CL57T
Cableado de los drivers CL57T, alojados dentro de la estructura en «C» que eleva el manipulador.
Motor NEMA 17 con reductor planetario acoplado

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.

Motor y reducción por eje
EjeReducción totalRangoPasos por grado
Base10:1 (planetario)−80° a +80°27,78
Codo25:1 (planetario × banda)0° a 136,5°69,44
Muñeca25: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.

Con 1 000 pulsos por vuelta y las reducciones de cada eje, los tiempos del firmware dan estas velocidades:

Velocidad por fase de movimiento, calculada del firmware
FaseMedio periodoPasos/sMotorBaseCodo y muñeca
Crucero1 600 µs312,518,75 rpm11,25 °/s4,5 °/s
Arranque y frenado2 500 µs20012 rpm7,2 °/s2,88 °/s
Homing rápido1 800 µs277,816,7 rpm—4,0 °/s
Homing fino3 200 µs156,39,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.

Esquemático en KiCad del controlador CL57T
Esquemático: el ESP32-C3, las salidas PUL/DIR hacia los tres drivers y las entradas de final de carrera.
Especificación de fabricación
ParámetroValorUnidadNotas
Dimensiones56,4 × 59,0mm
Capas de cobre2F.Cu / B.Cu
Espesor de placa1,6mm
Vías16—
Ancho de pista0,3 – 1,0mmSin pistas de potencia: no las necesita
Lista de materiales
DesignadoresCant.ValorEncapsulado
ESP32-C31ESP32-C3 SuperMiniMódulo SMD
U1–U66PC817DIP-4, zócalo SMD
VP_IN1–VP_IN44Bornera de salida a driverMX126-5.0, 2 P
DATA_IN1, DATA_OUT12Conector I²CJST EH 4 P vertical
CONN01X061Header HC-05JST EH 6 P vertical
R1, R3, R4, R7, R9–R117330 Ω1206
R20, R2124,7 kΩ1206
R16110 kΩ1206
R513,3 kΩ1206
C1, C32100 nF1206
D2, D32LED de datos y de potencia1206
SW21PulsadorRS-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.

Layout de PCB de dos capas del controlador CL57T
Layout de dos capas.
Vista de manufactura de JLCPCB del controlador CL57T
La vista de manufactura que devuelve JLCPCB al subir los Gerbers: la última revisión antes de pagar el lote.

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.

ConceptoCosto aproximado
Producción5,00 USD
Envío17,50 USD
Derechos de importación130 MXN

El envío pesa más del triple que la producción: conviene pedir las dos placas del proyecto en el mismo lote.

SeñalGPIOFunción
PUL_BASE / DIR_BASEGPIO20 / GPIO21Base
PUL_CODO / DIR_CODOGPIO7 / GPIO10Codo
PUL_MUNECA / DIR_MUNECAGPIO5 / GPIO6Muñeca
SW1GPIO1Final de carrera de la base
SW2 / SW3GPIO3 / GPIO4Finales de carrera de codo / muñeca
SDA / SCLGPIO8 / GPIO9Bus I²C esclavo (dirección 0x0B)
BTNGPIO0Botón local (homing sin NUC)

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.

Comandos principales — todos bloquean hasta que el movimiento termina
ComandoArgumentoRespuestaDescripción
PING—PONGVerificar que el esclavo responde
STATE?—OK busy=0 sw2=0 sw3=0 calibrated=1 base=… codo=… muneca=…Estado completo
HOME_ALL—OK / ERR HOME_ALLHoming de codo + muñeca
BASE_GOTOgradosOK BASE …Posición absoluta de base
CODO_GOTOgradosOK CODO …Posición absoluta de codo
MUNECA_GOTOgradosOK MUNECA …Posición absoluta de muñeca
POSEbase codo munecaOK POSE …Los 3 ejes en una sola trama

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 reproducible

La 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.

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.

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.

Perfil trapezoidal — idéntico en base, codo y muñeca
ParámetroValorUnidadNotas
Medio periodo de arranque2500µs200 pasos/s
Medio periodo de crucero1600µs312,5 pasos/s
Medio periodo de frenada2500µs200 pasos/s
Pasos de aceleración1500pasos
Pasos de deceleración1500pasos
Asentamiento tras cambio de DIR200µsEl 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.

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.

  1. Conecta el USB-C del ESP32-C3 a la PC y busca su puerto COM.
  2. Para mover: drivers CL57T alimentados y el brazo libre de obstáculos.
  3. Instala la dependencia: pip install pyserial.
  4. Corre la prueba:
Ventana de terminal
python prueba_controlador_cl57t.py --puerto COM6
python prueba_controlador_cl57t.py --puerto COM6 --home --mover
python prueba_controlador_cl57t.py --puerto COM6 --consola

La 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.