El dilema del bus de colector abierto: Por qué unos diodos necesarios pueden bloquear tu Modbus


Si estás leyendo esto, es probable que hayas montado un bus con varios dispositivos, como los populares medidores PZEM, y te hayas encontrado con un comportamiento extraño: todo funciona a medias. Lees datos sin problema, pero en el momento de intentar algo más complejo, como cambiar la dirección de un dispositivo (con el comando setAddress), todo falla.

Lo más frustrante es que, a menudo, el culpable no es un componente defectuoso, sino un pequeño detalle de diseño que, aunque necesario, introduce un efecto secundario inesperado. Este es el caso de los diodos en un bus de colector abierto con múltiples dispositivos.Analicemos por qué ocurre esto y cómo diagnosticar el problema.

pzem004 1712339109

La Necesidad de los Diodos: Protegiendo el Bus

En un bus donde varios dispositivos comparten la misma línea de comunicación y usan salidas de colector abierto (o drenaje abierto), los diodos son esenciales. Su función es evitar que un dispositivo que está en reposo (con su salida en alta impedancia) bloquee la línea de pull-up cuando otro dispositivo intenta comunicarse.

La orientación correcta, y la que seguramente tienes, es con el cátodo hacia el pin TX del PZEM y el ánodo conectado al bus común. Esta es la configuración estándar para que un bus de colector abierto funcione correctamente. Sin estos diodos, el bus quedaría permanentemente bloqueado.

Por lo tanto, el problema no es la presencia de los diodos en sí, sino un efecto secundario de los mismos que interfiere con la comunicación bidireccional completa que exige el protocolo.

El Diagnóstico: Por qué la Lectura es Posible y la Escritura No

Para entenderlo, veamos qué sucede en los dos escenarios típicos con un bus que tiene esta topología.

1. Lectura por Broadcast (Funciona sin problemas)

Imagina que tu ESP32 envía una solicitud de lectura a todos los dispositivos (broadcast).

  1. La orden sale: La señal de tu ESP32 viaja directamente por la línea TX hacia los pines RX de todos los PZEM. No hay ningún obstáculo.
  2. La respuesta llega (a medias): El PZEM que tiene la dirección solicitada procesa el comando y debe responder por su línea TX.
    • Para enviar un ‘0’ lógico (nivel bajo), el pin TX del PZEM se conecta a tierra. El diodo conduce y la señal llega limpiamente al bus y al ESP32. Perfecto.
    • Para enviar un ‘1’ lógico (nivel alto), el pin TX del PZEM se pone en alta impedancia (desconectado). Aquí es donde el diodo de ese PZEM se polariza inversamente, actuando como un interruptor abierto y bloqueando la señal.

En este modo de broadcast, el ESP32 no espera una respuesta directa de un único dispositivo. El sistema puede funcionar porque el flanco de bajada (‘0’) es lo suficientemente claro para que el maestro interprete la comunicación, aunque la señal esté degradada. Por eso no se detecta un fallo inmediato.

2. Escritura con Confirmación (setAddress) (Falla estrepitosamente)

Aquí es donde se revela el verdadero problema. El comando setAddress no es una simple orden que se envía y se olvida. El protocolo Modbus-RTU, que utilizan los PZEM, exige una confirmación.

  1. El ESP32 ordena: Envía el comando para cambiar la dirección al PZEM M3.
  2. El PZEM M3 confirma: Para que el comando sea exitoso, el PZEM M3 debe enviar una trama de confirmación (ACK) de vuelta al ESP32.
    • El ‘0’ sí pasa: Para enviar un ‘0’ lógico, el TX del M3 se pone a tierra, el diodo conduce y la señal llega al ESP32. Perfecto.
    • El ‘1’ es bloqueado (¡problema!): Para enviar un ‘1’ lógico, el TX del M3 se pone en alta impedancia. En ese instante, el diodo del M3 se polariza inversamente y bloquea completamente la señal. La línea de datos se queda «flotando», sin que el pull-up pueda subirla a nivel alto.

El resultado es que el ESP32 nunca recibe los bits en ‘1’ que forman parte de la trama de confirmación. La comunicación se corrompe, el checksum no coincide y el comando setAddress falla.

En Resumen

El diodo actúa como una válvula unidireccional desde la perspectiva del PZEM hacia el bus. Permite que el PZEM tire de la línea a tierra (para enviar un ‘0’), pero le impide soltarla para que la resistencia de pull-up la lleve a estado alto (para enviar un ‘1’). Este comportamiento, que es inherente a la forma en que están colocados los diodos, es letal para un protocolo bidireccional y basado en flancos como Modbus.

Ahora que sabes que los diodos son la causa del bloqueo, el siguiente paso es buscar una solución. ¿La más común? Implementar un puente removible de modo que cuando vayamos a programar la dirección de un modulo PZEM podemos cortocircuitar el diodo de modo que una vez programado podamos liberar ese cortocircuito en su operación normal. Algo mucho mas avanzado es montar un circuito que convierta las señales unidireccionales en verdaderamente bidireccionales, como un adaptador de nivel lógico o un circuito discreto con transistores. Pero esa, como suele decirse, es una historia para otro post.

Mucho cuidado con circuitos mal diseñados para obtener una mayor corriente


El LM317 es un todo un clásico: un regulador de tensión lineal ajustable que proporciona una salida de entre 1,2 y 37 voltios con una corriente máxima de 1,5 A. Sus terminales principales son entrada (IN), salida (OUT) y ajuste (ADJ), y solo requiere dos resistencias externas para fijar el voltaje deseado. Incluye protecciones contra sobrecarga, limitación de corriente y exceso de temperatura, lo que lo hace más robusto que reguladores fijos. Funciona como regulador flotante, tolerando hasta 40 V de diferencia entre entrada y salida, y suele necesitar pocos condensadores si está cerca de los filtros de alimentación. La salida mínima estable es de 1,25 V, ideal para fuentes de laboratorio o proyectos con motores y LEDs.​

Para configurarlo, debemos conectar un resistencia fija (como 220-240 Ω) entre OUT y ADJ,y un potenciómetro (5 kΩ) entre ADJ y masa para ajustar el voltaje. En módulos comerciales step-down, el potenciómetro ya está integrado, aceptando entradas de 4-40 V y entregando hasta 2 A con disipador. Para corrientes mayores, se acopla con transistores como TIP35 o se usa el LM350.

Este CI se emplea en fuentes de alimentación variables para prototipos, control de motores DC o estabilización de voltajes en IoT y electrónica embebida. En entornos como Arduino o ESP32, es útil para generar 3,3 V o 5 V estables desde baterías de 12 V. Requiere un disipador si la diferencia de voltaje genera calor significativo.

Ejemplo de Implementación

Este circuito utiliza el IC LM317 como regulador de voltaje variable. El voltaje de salida puede ajustarse entre 1,5V y 24V mediante el potenciómetro de 5KΩ. El condensador de 1000µF filtra el voltaje de entrada para mantenerlo estable, mientras que el condensador de 10µF en la salida reduce el rizado. La resistencia de 270Ω actúa como limitador de corriente de referencia para la regulación de voltaje.

Ejemplos de circuitos mal diseñados para obtener una mayor corriente

Es posible aumentar la corriente de salida del circuito anterior usando mosfet de potencia, pero no al modo de muchos tutoriales que existen circulando por la red. Aunque sí, es factible construir una fuente de alimentación regulada ajustable de hasta 40 A utilizando el LM317 con MOSFETs como el IRF4905 (P-channel, hasta -74 A, -55 V) , mucho cuidado con usar esquemas no verificados disponibles en redes sociales pues en muchos casos no van a funcionar. ​El LM317 solo soporta 1.5 A de forma nativa, y de hecho se puede combinar con MOSFETs en paralelo para desviar la corriente extra mientras el IC controla el voltaje de salida (típicamente 0-35 V). Circuitos probados usan varios IRF4905 conectados al OUT/ADJ del LM317, con una resistencia de puerta (como 10 Ω/10 W) para activación. Obviamente se necesitaran disipadores masivos con ventilador y un potenciómetro para ajuste.​​

En muchos esquemas disponibles en redes sociales aparece el IRF4505 que no debería estar en diseños estándar (posible error tipográfico por IRFP450, N-channel de 14 A/500 V, no compatible directamente), pero múltiples IRF4905 en paralelo si podrían alcanzan 40 A con baja Rds(on) de 0.02 Ω. Requiere entrada DC > salida + dropout (~3 V), protección contra cortos y buena refrigeración para evitar sobrecalentamiento.

El esquema erróneo es el siguiente (NO probar porque no funcionará):

La imagen muestra un módulo regulador de voltaje teórico basado en el LM317, diseñado para manejar corrientes elevadas (hasta 40 A) gracias al uso de transistores MOSFET de potencia IRF4905 e ¿IRF4505(MAL)?. En el diagrama esquemático revela los siguientes detalles:

  • Entrada de alimentación de 12 a 30 V DC.
  • El LM317 configurado para regular el voltaje.
  • Transistores MOSFET que permiten entregar altas corrientes.
  • Un regulador LM7812 para alimentar un ventilador de refrigeración.
  • Conexiones opcionales para un voltímetro externo.

Hay algunos detalles en el esquema que nos pueden dar que sospechar: claramente falta el potenciómetro para ajustar el voltaje de salida y claramente el segundo mosfet debería ser también un IRF4905 (hay un error tipográfico pues pone IRF4505) .Además los mosfet estan claramente mal conexionados pues en ambos cortocircuitan dos terminales (drain y source) y lo peor !en ambos transistores!. Además por si fuera poco se muestra una imagen (mas abajo) claramente generada con IA con las conexiones igualmente incorrectas ( obsérvese por ejemplo lo sospechoso de los cables rojo y negro que parecen salir de las clemas de entrada y salida):

En resumen hay que tener mucho cuidado pues con los esquemas de circuitos generados por la IA o por algunos aficionados porque no siempre son correctos como vemos en este ejemplo .