
El gripper es la pinza en el extremo del manipulador. Abre y cierra sus dos dedos a la posición en milímetros que pide el operador, y se detiene solo si algo le impide seguir.
Sinopsis
Sección titulada «Sinopsis»Dos pinzas impresas en 3D con mecanismo de piñón y cremallera, movidas por un motor con encoder y reductor. Lo controla un ESP32-C3 SuperMini con un driver de motor TB6612FNG. A diferencia de las otras dos placas del robot, este controlador no tiene PCB dedicada: va cableado a mano.
| 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) |
Cómo funciona
Sección titulada «Cómo funciona»El piñón central engrana con las cremalleras internas de ambas pinzas, que se desplazan en sentidos opuestos: abren o cierran de forma sincronizada.
El firmware convierte la posición pedida en cuentas del encoder y lleva el motor hasta ella con un perfil de velocidad suave. El encoder es la única retroalimentación de posición: si deja de cambiar durante 500 ms con el motor activo, el firmware asume un obstáculo y detiene el motor.
Conexiones
Sección titulada «Conexiones»
NUCPython 3.12- USB-CDC · COM5NUC → Controlador del gripper: m <mm>Controlador del gripper → NUC: GRIPPER_STATE
Controlador del gripperESP32-C3 + TB6612FNG- PWM 20 kHzGripper → Controlador del gripper: encoder A / B
Grippermotor con encoder
La NUC publica el estado que recibe como gripper_state, en el puerto 5001
de ZeroMQ.
Hardware
Sección titulada «Hardware»Mecanismo
Sección titulada «Mecanismo»La geometría de las pinzas lleva refuerzos internos tipo costilla: rigidez sin peso.


Asignación de pines
Sección titulada «Asignación de pines»Sin PCB, el cableado 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 |
| AIN1 | GPIO6 | TB6612FNG | Dirección del canal A |
| AIN2 | GPIO7 | TB6612FNG | Dirección del canal A |
| PWMA | GPIO10 | TB6612FNG | PWM del canal A, 20 kHz |
Firmware
Sección titulada «Firmware»MicroPython sobre el ESP32-C3.
Archivos
Archivo
Firmware — main_gripper_final.pyEncoder de cuadratura
Sección titulada «Encoder de cuadratura»El firmware decodifica el encoder 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 no la modifique a media lectura.
Control de posición
Sección titulada «Control de posición»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 con freno activo y guarda la posición del eventoEl 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 y cremallera.
| 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 |
Comandos USB serie
Sección titulada «Comandos USB serie»Ninguno bloquea: el firmware sigue atendiendo el puerto mientras el motor se mueve.
| 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 |
Publica una línea de estado cada 250 ms y tras cada comando:
GRIPPER_STATE mm=40.000 count=-14285 target_mm=40.000 target_count=-14285 busy=0 calibrated=1 open_count=-28570 closed_count=0Calibración
Sección titulada «Calibración»- 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 que un corte a media escritura no
corrompa el archivo. Si no existe o está corrupto, el gripper arranca sin
calibrar y bloquea los comandos de posición hasta recalibrar.
La calibración del gripper construido sirve de referencia de orden de magnitud, pero no se puede copiar: depende del montaje 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.
Prueba desde tu PC
Sección titulada «Prueba desde tu PC»El script hace lo mismo que la NUC por COM5: pide el estado con p y manda
posiciones con m <mm>, esperando a que cada movimiento termine.
- Conecta el USB-C del ESP32-C3 a la PC y busca su puerto COM.
- Instala la dependencia:
pip install pyserial. - Corre la prueba:
python prueba_gripper.py --puerto COM5python prueba_gripper.py --puerto COM5 --mover --posiciones 60 20 40python prueba_gripper.py --puerto COM5 --consolaArchivos
Archivo
Prueba del gripper — prueba_gripper.pyLa primera línea muestra la posición, busy y calibrado. Si no está
calibrado, los comandos de posición están bloqueados: calibra primero con
so y sc desde --consola.
Página anterior
CL57TPágina siguiente
Verificación