Restablecer generador de pulsos para ESP8266

Estoy tratando de generar un pulso de reinicio para activar un dispositivo ESP8266.

El ESP8266 admite una función de "sueño profundo", en la que consume muy poca energía. Sin embargo, la única forma de activarlo es restablecerlo (haciendo que el pin de reinicio esté bajo; el dispositivo se reiniciará tan pronto como el pin vuelva a estar alto).

Entonces, estoy tratando de usar un evento externo (digamos un interruptor normalmente abierto) para activar el dispositivo. Sin embargo, hay un inconveniente: el dispositivo debe activarse inmediatamente después de que se cierra el interruptor, aunque el interruptor puede permanecer cerrado durante muchos segundos o minutos después. Entonces necesito un circuito que genere un pulso de reinicio (bajo, luego alto después de varios milisegundos) cada vez que se cierre el interruptor.

Pensé para mis adentros: "¡No hay problema, eso debería ser fácil!" (sí, ¡soy así de novato! :)). Y construí este circuito, que funciona maravillosamente en el simulador...

primer intento

Pero, por supuesto, la vida real no se ajusta a la simulación... Estoy usando una placa de desarrollo Wemos D1 Mini, que agrega un nuevo nivel de complejidad , que incluye una resistencia pull-up en RST y un capacitor entre RST y tierra. Entonces, por supuesto, este circuito simple ya no funciona :(

Mi pregunta es: ¿cómo puedo cambiar este circuito para que haga el trabajo? O, si eso no es posible, ¿qué tipo de circuito podría usar en su lugar?

También consideré un 555, pero a) no estoy seguro del consumo de energía, y b) es un dispositivo de 5 V, por lo que podría ser más difícil que funcione con baterías.

Algunos desafíos adicionales:

  1. El circuito adicional debe usar la menor cantidad de energía posible (la idea general de usar el modo de suspensión profunda es hacer que el dispositivo funcione durante mucho tiempo con las baterías)
  2. ¿Sería posible usar varios interruptores para activar el dispositivo? (Luego podría ejecutar los interruptores en diferentes pines GPIO y obtener el estado de los pines en el inicio para averiguar exactamente qué evento generó la señal de activación)

¡Gracias!

¿Hay alguna razón por la que usó resistencias de 1M para su circuito además de la constante de tiempo realmente larga de ese circuito RC? Podría comenzar a interactuar con su microcontrolador. Además, consideraría colocar el interruptor de reinicio en paralelo con el capacitor entre la tierra y el puerto RST. De esa manera, expondrá correctamente su conexión a tierra a su puerto RST y no a través del capacitor. ¡Ya casi estás allí, algunos ajustes deberían ponerte en camino!
Las resistencias de 1M son un remanente de mis pruebas originales (en las que tenía un divisor de voltaje y quería que usara la menor cantidad de corriente posible). Puedo usar cualquier valor allí, ya que el pulso de reinicio mínimo parece ser del orden de decenas de ns. Pero, ¿puede explicar qué quiere decir con "interactuar con el microcontrolador"?
En cuanto al interruptor, no estoy seguro de lo que quiere decir: si muevo el interruptor a la derecha de mi capacitor (junto al pin RST), el pin permanecerá bajo mientras se presione el interruptor. Y eso es exactamente lo que estoy tratando de evitar, y la razón por la que agregué un condensador adicional (para volver a subir el RST, incluso si el interruptor permanece presionado).

Respuestas (5)

Usando su idea básica, puede hacer algo como esto (simplemente agregando una parte, el circuito en el cuadro punteado simula lo que hay en su placa de desarrollo):

esquemático

simular este circuito : esquema creado con CircuitLab

ingrese la descripción de la imagen aquí

El MOSFET 2N7000 se utiliza para descargar el condensador de reinicio de encendido de 100 nF en su placa.

La simulación muestra el encendido en t = 0 y luego el interruptor de reinicio presionado y mantenido en t = 100 ms.

Parece que podría ir fácilmente a resistencias de 10nF y 10M, e incluso menos en la capacitancia, pero tenga cuidado con la capacitancia de entrada del MOSFET si intenta ir muy bajo o intenta sustituir un tipo diferente de MOSFET (la mayoría de los cuales tendrán mucho más alto carga de la puerta).

Por curiosidad, ¿cuál fue la intención de agregar un MOSFET para descargar la capacitancia de entrada? ¿Qué beneficio trae?
@SimonMarcoux El beneficio principal es que lo hace funcionar. ;-) Una alternativa sería aumentar en gran medida la capacitancia en el circuito de OP (digamos a 2uF desde 100nF), pero eso haría que el tiempo de reinicio fuera muy largo o requeriría una resistencia de valor proporcionalmente más bajo que absorbería corriente siempre que se presione el interruptor. La transformación de impedancia del MOSFET hace que ese problema desaparezca.
@SimonMarcoux También hay otro problema con ese enfoque, puede que no sea obvio, pero el capacitor en el circuito OP hace que el diodo de protección superior en la MCU conduzca cuando se suelta el interruptor (es un duplicador de voltaje operado manualmente). Eso no es bueno, mucho peor con una resistencia de bajo valor.
Esto se ve absolutamente brillante, ¡gracias! Intenté varios enfoques similares a su segunda idea (jugando con el valor de la capacitancia y la resistencia), pero no pude hacerlo funcionar. ¡Nunca pensé en usar ese MOSFET! Lo probaré en una placa de pruebas y veré si puedo hacerlo funcionar.
Hasta que pueda probarlo, ¿puede dar más detalles sobre el problema del duplicador de voltaje / diodo de protección? Noté los picos de voltaje cuando se soltó el interruptor, pero supuse que podía enviarlos fácilmente a Vcc a través de un diodo (no estaba seguro de si el puerto tenía el diodo de protección o no). ¿Cuáles eran los riesgos allí y por qué era una mala idea?
La corriente es de solo unos pocos uA con una resistencia de 1 M, por lo que no es un problema, pero es una mala forma de polarizar deliberadamente hacia adelante los diodos de protección en el chip durante el funcionamiento normal. Por ejemplo, puede hacer que la corriente fluya desde los pines de otros puertos cercanos, lo que puede provocar un funcionamiento defectuoso con pines digitales o pines analógicos de alta Z. En sí misma, una pequeña corriente no dañará el chip.

Funcionaría una versión ligeramente modificada de su solución como señaló Simon en el comentario.

La clave es que C1 debe ser mucho más grande que el capacitor dentro de la placa (C2 aquí). La resistencia pull-up debe reducirse en el mismo orden para mantener constante el tiempo.

Además, a partir de los comentarios, veo un problema falso con el "doblador de voltaje", el voltaje en el pin de reinicio se dividirá entre R1 y R3 en un orden de 1/10, lo que significa que el pin de reinicio puede ir como máximo a 0,36 V sobre V1 con una corriente máxima de 36 uA que está permitido.

R2 está ahí para evitar un pico de corriente a través de SWX, C1 y C2, pero si los diseñadores de Wemos consideraron que no es necesario, puede omitirlo.

esquemático

simular este circuito : esquema creado con CircuitLab

Para un solo interruptor no se necesita el diodo ni la resistencia de 1M

El inconveniente de los conmutadores múltiples es que tendrá que esperar a que todo el software esté abierto de forma constante durante un tiempo para asegurarse de no perder ningún dato, pero si permanecen abiertos en su mayoría, esta solución simple podría funcionar bien.

Desearía poder aceptar múltiples respuestas a la misma pregunta... Acepté la respuesta de Spehro porque respondió la primera parte de mi pregunta y no requería partes adicionales (aparte de un MOSFET que ya tenía :)). Ojalá pudiera aceptar su respuesta también, ya que responde a la segunda parte. ¡Gracias!
@Bogd Está bien si eso funcionó para usted. Puede votar las respuestas que fueron útiles.
Lo intenté, pero en ese momento no tenía el privilegio de "votar" :) . Lo recibí mientras tanto, así que pude votar a favor. ¡Gracias de nuevo por tu ayuda!
¡Gracias, gracias, gracias! ¡Finalmente encontré la solución a mi problema!

Según nuestra conversación y sus comentarios, puede echar un vistazo a esos esquemas (Descargo de responsabilidad: no es mi esquema).

ingrese la descripción de la imagen aquí

El capacitor se carga a VCC hasta que lo pasa por alto usando el interruptor. Una vez que se usa el interruptor, descargará el capacitor por completo. Si desea que la descarga sea más lenta, puede poner una resistencia en serie con el interruptor.

Con respecto a la pregunta 1: la única corriente que se desperdiciará es la corriente de fuga que pasará por el puerto de reinicio y por el capacitor (corriente de fuga). Esos son inevitables por desgracia.

Con respecto a la pregunta 2: puede agregar muchos otros interruptores en paralelo con el primero. Cada interruptor podrá restablecer el ESP8266. Sin embargo, si desea enrutar cada conmutador a un GPIO, necesitará un tipo diferente de conmutador y configuración:

esquemático

simular este circuito : esquema creado con CircuitLab

R2 y R3 mantienen un estado de activación en su GPIO para garantizar que pueda diferenciar correctamente entre un 0 y un 1. Puede invertir VCC y conectar a tierra en ese subcircuito si desea lo contrario (ahora que lo pienso, podría ¡incluso sería mejor tirar hacia abajo y evitar la fuga de corriente!) Podría crear una lógica similar usando un interruptor de doble tiro dependiendo de lo que tenga en su mano.

Si quieres que dibuje el circuito usando doble tiro (si esto es lo que tienes a mano), házmelo saber y lo agregaré con gusto a la respuesta.
¡Primero que nada, gracias! Solo tengo interruptores de un solo tiro (contactos magnéticos o mecánicos), así que está bien. Mi pregunta principal con respecto a sus esquemas es: ¿cómo resuelven el problema "el interruptor permanece cerrado, pero la MCU tiene que despertarse"? Por lo que puedo decir, siempre que SW1 se mantenga presionado, el pin RESET se mantiene bajo, lo que evita que la MCU se despierte. ¿Me estoy perdiendo de algo?
no te estás perdiendo algo en la parte de comprensión aquí. De hecho, si mantengo el interruptor hacia abajo, se bajará todo el tiempo. Es posible que me haya perdido esa información cuando redacté su pregunta. Tener un "tiempo bajo" máximo antes de forzar un cambio de estado puede ser extremadamente complicado sin cambiar completamente la topología del circuito. La forma rápida y sucia de hacerlo sería usar un disparador cronometrado entre el puerto de reinicio y la etiqueta de reinicio de mi esquema. Normalmente, un circuito monoestable habría sido la elección para tal aplicación, pero está al revés de lo que necesita.
Por lo tanto, podría usar un monoestable junto con un inversor lógico que le dará el circuito de trabajo adecuado. Pero prefiero sugerir que elimine el circuito anterior que propuse y trabaje alrededor del circuito del temporizador 555 para lograr una funcionalidad similar.
Como mencioné en comentarios anteriores, tengo dos problemas con el 555: a) es un dispositivo de 5 V yb) no puedo encontrar cuánta corriente usa en un estado estable. Ambos son muy relevantes para un dispositivo que necesita funcionar durante mucho tiempo con baterías.
En ese caso, la solución de Spehro es probablemente lo que está buscando. No puede ser mucho mejor que eso. Además, si quieres poner muchos interruptores en paralelo, puedes transponer parte de mi esquema al suyo sin ningún problema. Lo mismo ocurre con el interruptor que causó el ''despertar''. No olvide aceptar su respuesta como buena práctica.

Hice algunas modificaciones en el primer circuito para que funcione con la señal de RESET del ESP01.

La señal de RESET se conecta al nodo donde se conecta el Voltimetes (entre la resistencia de 100 ohmios y el diodo. La resistencia de 3,3k hay que quitarla, la puse para simular la impedancia interna del pin RESET. Espero que te funcione

ingrese la descripción de la imagen aquí

botónEsto funciona lo que uso en mi proyecto, se necesita el segundo diodo para permitir el parpadeo sin desconectar el cable