Ir al contenido

Un firmware MicroPython sobre ESP32-C3 SuperMini controla el motor del gripper por posición en milímetros. A diferencia de los otros dos controladores del robot, este no tiene PCB dedicada: el ESP32-C3 se conecta al driver TB6612FNG sobre protoboard.

Nivel de replicación

Construible

Está la geometría acotada y el procedimiento. Tendrás que adaptarlos a tus herramientas y materiales.

Lo que encuentras aquí

  • Firmware completo y funcional
  • Conexionado pin a pin entre ESP32-C3 y driver TB6612FNG
  • Todos los parámetros de control: PWM, perfil de velocidad, tolerancia y umbral de stall
  • Valores de calibración reales del gripper construido
  • Procedimiento de calibración y juego de comandos completo

Lo que falta para llegar a «Reproducible»

  • Referencia exacta del motor Pololu: número de parte, tensión y cuentas por vuelta del encoder
  • STL de las pinzas, la cremallera y el piñón, con módulo de engrane y parámetros de impresión

Artefacto

PYmain_gripper_final.py

19 KB

Vista superior del gripper con el piñón central del mecanismo
El mecanismo que este firmware acciona: piñón central engranando las cremalleras de ambas pinzas.
Componentes del controlador
ParámetroValorUnidadNotas
MicrocontroladorESP32-C3 SuperMini
Driver de motorTB6612FNGdual, solo canal A usado
MotorPololuencoder de cuadratura, reductor 100:1
Recorrido total80mm
Resolución357,1counts/mm28 570 counts en los 80 mm de recorrido
Comunicación con NUCUSB-CDC115 200 baud (COM5)
Conjunto del gripper con su piñón, cremallera y motor
El conjunto completo: motor, piñón y cremallera que convierten el giro en apertura lineal.

Sin PCB, el conexionado es lo único que fija el montaje. Estos son los pines que usa el firmware.

Conexiones entre ESP32-C3 y TB6612FNG
SeñalGPIODestinoFunción
ENC_AGPIO3Encoder del motorCanal A de cuadratura, por interrupción
ENC_BGPIO4Encoder del motorCanal B de cuadratura, por interrupción
STBYGPIO5TB6612FNGStandby: en bajo, el driver queda inhibido
PWMAGPIO10TB6612FNGPWM del canal A, 20 kHz
Parámetros leídos del firmware
ParámetroValorUnidadNotas
Frecuencia PWM20kHzPor encima del rango audible
Periodo del lazo8ms
Tolerancia de posición35counts≈ 0,1 mm
Umbral de stall500ms sin cambio de encoder
Duty de crucero50%
Duty mínimo10%Por debajo, el motor no vence la fricción
Boost de arranque40 % durante 12msRompe la inercia inicial
Tramo de aceleración30% del recorrido
Tramo de desaceleración55% del recorrido

El encoder es la única fuente de retroalimentación de posición del gripper. El firmware lo decodifica por interrupciones, con una tabla de transición phase-correct que da resolución de ±1 count.

La lectura del contador es atómica: se envuelve en disable_irq/enable_irq para que la interrupción del encoder no la modifique a media lectura.

1. mm_to_count(mm) — convierte mm a counts de encoder
2. Si |target − current| ≤ 35 counts: ya está en posición, freno + stop
3. Bucle de control cada 8 ms: perfil de velocidad con boost inicial
de 12 ms, 30 % de recorrido en aceleración, 55 % en desaceleración
4. Detección de stall: si el encoder no cambió en 500 ms, detiene y
guarda el estado

El perfil de velocidad usa la función smoothstep01(x) = x²(3 − 2x) para suavizar las transiciones. Sin ella, los escalones de aceleración provocan saltos mecánicos en el mecanismo de piñón-cremallera.

Si el encoder no cambia durante 500 ms con el motor activo, el firmware asume un obstáculo o límite mecánico y detiene el motor con freno activo, guardando la posición del evento para diagnóstico.

ComandoDescripción
m <mm>Ir a posición absoluta
o <mm> / c <mm>Abrir / cerrar delta mm desde la posición actual
to / tcIr a completamente abierto / cerrado
s / bStop suave / freno activo inmediato
sc / soGuardar posición actual como cerrado / abierto
save / loadGuardar / cargar calibración desde JSON
  1. Mover manualmente (o con pulsos po/pc) a la posición abierta máxima → so guarda OPEN_COUNT.
  2. Mover a la posición cerrada máxima → sc guarda CLOSED_COUNT.

Los valores se guardan en gripper_state.json con escritura atómica (archivo temporal + rename) para evitar corrupción si se interrumpe el proceso. Si el archivo no existe o está corrupto, el gripper arranca no calibrado y bloquea los comandos de posición hasta recalibrar.

Esta es la calibración real del gripper construido. Sirve de referencia para saber si una réplica queda en el mismo orden de magnitud, pero no se puede copiar: los valores dependen del montaje concreto de cada mecanismo.

{ "closed_count": 0, "open_count": -28570 }

El signo negativo es la convención de sentido del encoder: abrir cuenta hacia abajo desde el cero de cerrado. De ahí sale la resolución de 357,1 counts/mm.

Artefacto

JSONCalibración de referencia — gripper_cal.json

41 B

Artefacto

PYScript de calibración del gripper

20 KB

GRIPPER_STATE mm=40.000 count=-14285 target_mm=40.000 target_count=-14285 busy=0 calibrated=1 open_count=-28570 closed_count=0

La NUC parsea esta línea y la publica como gripper_state en el tópico ZMQ del puerto 5001.

El gripper recorre sus 80 mm completos sin perder posición, detiene un stall en 500 ms sin dañar el mecanismo, conserva la calibración tras reiniciarse y responde a la NUC con menos de 50 ms de latencia. El detalle de cada resultado está en Verificación del robot móvil.