
El Puente H es la placa que mueve los motores de tracción del robot. Recibe una consigna de velocidad y la convierte en la potencia que llega al motor. El robot lleva dos, uno por motor.
Sinopsis
Sección titulada «Sinopsis»Una tarjeta de control de motor DC de diseño propio. Usa una topología de puente H discreto, con aislamiento óptico entre la lógica y la potencia, y un ESP32-C3 que gestiona los modos de comunicación.
| Parámetro | Valor | Unidad |
|---|---|---|
| Alimentación de potencia | 12–24 | V DC nominal |
| Corriente continua deseada | 4–5 | A |
| Corriente pico máxima | 8 | A |
| Microcontrolador | ESP32-C3 SuperMini | — |
| Aislamiento lógica/potencia | Optoacopladores 4N25 | — |
| MOSFETs alto lado | IRF9540N | canal P, 117 mΩ |
| MOSFETs bajo lado | IRF540N | canal N, 44 mΩ |

- Etapa de potencia — puente H con MOSFETs IRF540N (N) e IRF9540N (P).
- Aislamiento de control — optoacopladores 4N25 que separan la lógica del circuito de conmutación.
- Control embebido — el ESP32-C3 administra modos de comunicación, lógica de mando y estados.
- Interfaz de expansión — conectores I²C de entrada y salida para la arquitectura maestro-esclavo.
- Protección e indicación — fusible de entrada, capacitor de filtrado, LEDs de estado, botón local.
Cómo funciona
Sección titulada «Cómo funciona»Al encender, la placa lee su DIP switch una sola vez, y esa lectura fija por dónde recibe las órdenes: I²C como maestro o esclavo, WiFi, BLE o Bluetooth clásico. En el robot, un módulo arranca como maestro y el otro como esclavo. Por USB-C acepta órdenes siempre, sea cual sea el modo.
Modos de operación (DIP switch)
Sección titulada «Modos de operación (DIP switch)»| SW3 | SW2 | SW1 | Modo | Descripción |
|---|---|---|---|---|
| 0 | 0 | 0 | Prueba local | Validación interna; rutina activable por botón |
| 0 | 0 | 1 | WiFi | Recibe comandos por red inalámbrica |
| 0 | 1 | 0 | BLE | Bluetooth Low Energy |
| 0 | 1 | 1 | HC-05 | Bluetooth clásico por UART externo |
| 1 | 0 | 0 | I²C Maestro | Nodo maestro en arquitectura distribuida |
| 1 | 0 | 1 | I²C Slave 1 | Esclavo 1 (dirección reservada) |
| 1 | 1 | 0 | I²C Slave 2 | Esclavo 2 (dirección reservada) |
| 1 | 1 | 1 | I²C Slave 3 | Esclavo 3 (dirección reservada) |
La placa arranca con la salida al motor deshabilitada, y solo la habilita tras una orden explícita de armado. Para mover el motor activa una de las dos diagonales del puente con PWM: una diagonal gira en un sentido, la otra en el contrario.
Tabla funcional del puente H
Sección titulada «Tabla funcional del puente H»PWM_0 = 1 y PWM_1 = 1 simultáneamente está prohibido: provoca
cortocircuito entre rieles de potencia.
| PWM_0 | PWM_1 | Estado | Descripción |
|---|---|---|---|
| 0 | 0 | Libre / deshabilitado | Ambos caminos apagados |
| 1 | 0 | Giro A | Activa diagonal A; combinable con PWM |
| 0 | 1 | Giro B | Activa diagonal B; combinable con PWM |
| 1 | 1 | Prohibido | Riesgo de cortocircuito |
Conexiones
Sección titulada «Conexiones»De la NUC a las ruedas. El maestro recibe las órdenes por USB y reenvía la suya al esclavo por I²C; cada módulo mueve su propio motor.
NUCPython 3.12- USB-CDC · COM4
Puente H maestroESP32-C3 · DIP 100- I²C 0x08 · tramas binarias
Puente H esclavoESP32-C3 · I²C 0x08- Salida al motor · uno por módulo
Motores DC de tracciónbase diferencial · 12–24 V
| Conector | Pines | Descripción |
|---|---|---|
| Entrada de potencia | 2 | Entrada principal de 12–24 V DC |
| Salida al motor | 2 | Terminales del puente H hacia la carga |
| Data_in I²C | 4 | +5V, SDA, SCL, GND — recibe el bus desde el maestro |
| Data_out I²C | 4 | Réplica del bus para encadenar el siguiente módulo |
| Header HC-05 | 6 | +5V, GND, RX, TX — Bluetooth clásico o debug UART |
| USB-C (ESP32-C3) | — | Programación, alimentación digital y debug prioritario |

La placa
Sección titulada «La placa»Se diseñó en KiCad 9 y se fabricó en JLCPCB. Los valores de abajo están leídos del archivo de layout, no transcritos: son los que hay que declarar al pedir la placa.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Dimensiones | 80,6 × 73,4 | mm | |
| Capas de cobre | 2 | F.Cu / B.Cu | |
| Espesor de placa | 1,6 | mm | |
| Vías | 14 | — | |
| Ancho de pista — potencia | 2,0 | mm | Diagonales del puente y rieles de alimentación |
| Ancho de pista — señal | 0,3 – 1,0 | mm |


Para pedir la placa basta subir gerbers.zip tal cual al fabricante y dejar
los parámetros por defecto de dos capas: el espesor de 1,6 mm y el acabado
estándar son los que se usaron. El ZIP incluye los taladros PTH, así que no
hay que exportar nada aparte.
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 Controlador CL57T 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. Por eso conviene pedir el Puente H y el Controlador CL57T en el mismo lote, y pedir diez piezas cuando hacen falta dos.
Archivos
Archivo
Gerbers de fabricación — Puente HArchivo
Proyecto KiCad completo — Puente HArchivo
Datasheet Puente H ESP32-C3Lista de materiales
Sección titulada «Lista de materiales»54 componentes en 21 referencias distintas, ordenados por función: el orden que importa al replicar es el de la compra.
| Designadores | Cant. | Valor | Encapsulado |
|---|---|---|---|
| U1 | 1 | ESP32-C3 SuperMini | Módulo SMD |
| Q1, Q2 | 2 | IRF9540N (canal P) | TO-220-3 vertical |
| Q3, Q4 | 2 | IRF540N (canal N) | TO-220-3 vertical |
| U2–U5 | 4 | 4N25 | DIP-6, paso 7,62 mm |
| D4–D7 | 4 | 1N47xxA (Zener — ver nota) | DO-41 horizontal |
| D1 | 1 | LED indicador | 1206 |
| D2 | 1 | LED de datos | 1206 |
| D3 | 1 | LED de potencia | 1206 |
| C1, C3, C4 | 3 | 100 nF | 1206 |
| C2 | 1 | 2200 µF 50 V | Radial D16 mm, paso 7,5 mm |
| R1–R4, R14, R15 | 6 | 330 Ω | 1206 |
| R7, R8, R10, R11, R16–R19 | 8 | 10 kΩ | 1206 |
| R6, R9, R12, R13 | 4 | 2,2 kΩ | 1206 |
| R20, R21 | 2 | 4,7 kΩ | 1206 |
| R5 | 1 | 3,3 kΩ | 1206 |
| F1 | 1 | Portafusible 5 × 20 mm | Clip inline horizontal |
| SW3 | 1 | DIP switch 4 posiciones | Slide, paso 2,54 mm |
| SW2 | 1 | Pulsador | RS-032G05A3-SMRT |
| M1 | 1 | Bornera salida a motor | MX126-5.0, 2 P |
| VP_IN1, VP_OUT1 | 2 | Bornera de potencia | 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 |
| J1–J4 | 4 | Puente de alambre | 0,5 mm² |
Dos advertencias antes de comprar:
- Los Zener D4–D7 no tienen valor cerrado. El esquemático usa el símbolo
genérico
1N47xxAde la librería de KiCad, cuyo datasheet por defecto apunta al 1N4728A (3,3 V, 1 W). Ese enlace viene de la librería, no de una elección registrada en el diseño, así que hay que confirmar la tensión contra la placa física antes de pedir. - La columna
LCSC Part #del BOM está vacía. No hay números de parte de proveedor, así que la compra se resuelve por valor y encapsulado.
Ensamble
Sección titulada «Ensamble»La placa mezcla SMD 1206 con componentes de orificio pasante voluminosos —MOSFETs TO-220, capacitor radial de 16 mm, borneras—, así que el ensamble manual es viable y fue el que se usó. El orden va de menor a mayor altura, para que un componente alto no estorbe el acceso a uno bajo:
- Resistencias y capacitores 1206, y los LED.
- Optoacopladores 4N25 en sus zócalos DIP-6. Respeta la marca de pin 1.
- Zener D4–D7 y los puentes J1–J4.
- Módulo ESP32-C3 SuperMini.
- DIP switch y pulsador.
- MOSFETs TO-220 — los cuatro van verticales.
- Portafusible, borneras, conectores JST y el capacitor de 2200 µF.
Antes de aplicar potencia por primera vez conviene verificar continuidad entre los rieles de alimentación y masa: un corto ahí es el fallo que la topología de puente H castiga más rápido.

Asignación de pines
Sección titulada «Asignación de pines»| Señal | GPIO | Función |
|---|---|---|
PWM_0 | GPIO6 | Salida de mando — diagonal A del puente H |
PWM_1 | GPIO7 | Salida de mando — diagonal B del puente H |
SDA | GPIO8 | Datos del bus I²C |
SCL | GPIO9 | Reloj del bus I²C |
LED | GPIO10 | LED de usuario / depuración |
RX / TX | GPIO20 / GPIO21 | UART para módulo HC-05 |
S0, S1, S2 | GPIO1, GPIO3, GPIO4 | Lectura del DIP switch |
BTN | GPIO5 | Botón local (pull-up interno) |
Firmware
Sección titulada «Firmware»MicroPython sobre el ESP32-C3. Acepta comandos por USB-C —canal prioritario, siempre activo— o por el medio seleccionado con el DIP switch.
Archivos
Archivo
Firmware — main_movil_final.pyPara cargarlo: instala el intérprete de MicroPython para ESP32-C3 en el
módulo, copia el archivo como main.py en su sistema de archivos y
reinicia. El firmware arranca leyendo el DIP switch, así que hay que fijar el
modo antes de alimentar la placa.
Máquina de estados
Sección titulada «Máquina de estados» BOOT │ lee DIP switch (solo una vez) ▼DISARMED ──── ARM explícito o botón largo ────► ARMED ▲ │ └─── timeout 2 500 ms sin comando ────────────┘ │FAULT ◄─── cortocircuito / error de checksumLa salida al motor permanece deshabilitada en DISARMED. Pasar a ARMED
exige un comando explícito, así que el robot no puede moverse por accidente
al encenderse ni al reconectarse.
Protocolo I²C binario
Sección titulada «Protocolo I²C binario»En los modos maestro y esclavo, todos los comandos al Puente H viajan como paquetes binarios de 7 bytes. El maestro construye la trama; los esclavos la validan antes de ejecutar.
| Byte | Campo | Descripción |
|---|---|---|
| 0 | PREAMBLE | Siempre 0xA5 — marca de sincronía |
| 1 | SEQ | Número de secuencia 0–255 para detección de duplicados |
| 2 | CMD_MODE | 0 STOP, 1 TARGET, 2 TEST |
| 3–4 | LO, HI | Consigna con signo como int16 little-endian |
| 5 | FLAGS | Bitmask: ARMED (0x01), FAULT (0x02), TEST (0x04) |
| 6 | CHECKSUM | XOR de los bytes 0–5 |
Si el checksum no coincide, el paquete se descarta silenciosamente y el motor permanece en su último estado: nunca se ejecuta un movimiento con datos corruptos.
Deadtime y rampas
Sección titulada «Deadtime y rampas»Conmutar ambas diagonales del puente H a la vez provoca cortocircuito. Para
evitarlo, apply_bridge_local_safe() impone 300 µs de tiempo muerto
entre cambios de diagonal.
Ningún cambio de velocidad es instantáneo. El duty cycle sube o baja 1 % cada 20 ms hasta alcanzar la consigna, con un techo de 70 %. Pasar de 0 % a velocidad máxima toma por tanto 1,4 s como mínimo, y esa rampa es la que limita las corrientes de arranque y el estrés mecánico sobre los motores DC.
El techo del 70 % es una decisión de seguridad de la plataforma móvil: con el manipulador montado, acelerar a fondo compromete la estabilidad.
| Parámetro | Valor | Unidad | Notas |
|---|---|---|---|
| Frecuencia PWM | 1000 | Hz | |
| Tiempo muerto entre diagonales | 300 | µs | Evita el cortocircuito de puente |
| Techo de velocidad | 70 | % de duty | |
| Rampa | 1 % cada 20 | ms | 1,4 s de 0 % al techo |
| Timeout de comunicación | 2500 | ms | Sin comando, vuelve a DISARMED |
| Refresco maestro → esclavo | 80 | ms | |
| Baudios del enlace serie | 115200 | bps | |
| Prioridad de USB | 8000 | ms | Ventana en que USB desplaza al medio del DIP switch |
Prueba desde tu PC
Sección titulada «Prueba desde tu PC»El maestro acepta por USB los mismos comandos de texto que le manda la NUC, así que se prueba conectándolo directo a una PC. El script consulta la placa y el bus I²C y, si se lo pides, mueve los dos motores unos segundos, reenviando la orden a 15 Hz como la NUC para que no salte el timeout de 2,5 s.
- Pon el DIP switch en
100(maestro) antes de alimentar la placa. - Conecta el USB-C del ESP32-C3 a la PC. Para mover, conecta también la potencia y deja las ruedas en el aire.
- Instala la dependencia:
pip install pyserial. - Corre la prueba:
python prueba_puente_h.py --puerto COM4python prueba_puente_h.py --puerto COM4 --mover --consigna 80 --segundos 3python prueba_puente_h.py --puerto COM4 --consolaArchivos
Archivo
Prueba del Puente H — prueba_puente_h.pyLa placa debe responder PONG, su estado, y I2C_SCAN:0x8,0xb si el
esclavo y el controlador CL57T están conectados al bus. Con --consola
puedes escribir cualquier comando; HELP los lista.
Página anterior
Conjunto I²CPágina siguiente
CL57T