- Inicio
- El sistema
- Robot
- Sistemas embebidos
- Controlador del gripper
Controlador del gripper
En este artículo
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
ConstruibleEstá 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
main_gripper_final.py
Hardware
Sección titulada «Hardware»| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Microcontrolador | ESP32-C3 SuperMini | — | |
| Driver de motor | TB6612FNG | — | dual, solo canal A usado |
| Motor | Pololu | — | encoder de cuadratura, reductor 100:1 |
| Recorrido total | 80 | mm | |
| Resolución | 357,1 | counts/mm | 28 570 counts en los 80 mm de recorrido |
| Comunicación con NUC | USB-CDC | 115 200 baud (COM5) |

Conexionado
Sección titulada «Conexionado»Sin PCB, el conexionado es lo único que fija el montaje. Estos son los pines que usa el firmware.
| Señal | GPIO | Destino | Función |
|---|---|---|---|
| ENC_A | GPIO3 | Encoder del motor | Canal A de cuadratura, por interrupción |
| ENC_B | GPIO4 | Encoder del motor | Canal B de cuadratura, por interrupción |
| STBY | GPIO5 | TB6612FNG | Standby: en bajo, el driver queda inhibido |
| PWMA | GPIO10 | TB6612FNG | PWM del canal A, 20 kHz |
Parámetros de control
Sección titulada «Parámetros de control»| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Frecuencia PWM | 20 | kHz | Por encima del rango audible |
| Periodo del lazo | 8 | ms | |
| Tolerancia de posición | 35 | counts | ≈ 0,1 mm |
| Umbral de stall | 500 | ms sin cambio de encoder | |
| Duty de crucero | 50 | % | |
| Duty mínimo | 10 | % | Por debajo, el motor no vence la fricción |
| Boost de arranque | 40 % durante 12 | ms | Rompe la inercia inicial |
| Tramo de aceleración | 30 | % del recorrido | |
| Tramo de desaceleración | 55 | % del recorrido |
Encoder de cuadratura
Sección titulada «Encoder de cuadratura»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.
Control de posición — goto_mm_async
Sección titulada «Control de posición — goto_mm_async»1. mm_to_count(mm) — convierte mm a counts de encoder2. Si |target − current| ≤ 35 counts: ya está en posición, freno + stop3. Bucle de control cada 8 ms: perfil de velocidad con boost inicial de 12 ms, 30 % de recorrido en aceleración, 55 % en desaceleración4. Detección de stall: si el encoder no cambió en 500 ms, detiene y guarda el estadoEl 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.
Detección de stall
Sección titulada «Detección de stall»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.
Comandos USB serial (no bloqueantes)
Sección titulada «Comandos USB serial (no bloqueantes)»| Comando | Descripción |
|---|---|
m <mm> | Ir a posición absoluta |
o <mm> / c <mm> | Abrir / cerrar delta mm desde la posición actual |
to / tc | Ir a completamente abierto / cerrado |
s / b | Stop suave / freno activo inmediato |
sc / so | Guardar posición actual como cerrado / abierto |
save / load | Guardar / cargar calibración desde JSON |
Calibración y persistencia
Sección titulada «Calibración y persistencia»- Mover manualmente (o con pulsos
po/pc) a la posición abierta máxima →soguardaOPEN_COUNT. - Mover a la posición cerrada máxima →
scguardaCLOSED_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
Calibración de referencia — gripper_cal.jsonArtefacto
Script de calibración del gripperEstado publicado
Sección titulada «Estado publicado»GRIPPER_STATE mm=40.000 count=-14285 target_mm=40.000 target_count=-14285 busy=0 calibrated=1 open_count=-28570 closed_count=0La NUC parsea esta línea y la publica como gripper_state en el tópico ZMQ
del puerto 5001.
Verificación
Sección titulada «Verificación»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.