Interferencia de relé RPi GPIO con entrada

Estoy tratando de usar un RPi3 para emitir/controlar una lámpara usando este módulo de relé.

También quiero poder leer desde un botón y un interruptor.

El problema que tengo es que parece que cambiar el relé introduce ruido en la entrada GPIO y crea falsos positivos.

El RPi y el módulo de relés se encuentran en un gabinete para exteriores de 190 mm x 145 mm x 140 mm. Ellos tienen razón el uno al otro.

Intenté usar un relé de estado sólido y eso resolvió el problema de la interferencia, pero preferiría usar un relé convencional debido al tamaño y precio.

Intenté ver el ruido captado por el GPIO usando un osciloscopio USB digital Hantek económico, pero desafortunadamente no pude ver nada. Sigo esperando para comprobar con mi osciloscopio analógico. Además, estoy pensando en probar el cable blindado desde el botón pulsador y cambiar al GPIO y también envolver el módulo de relé en una malla metálica conectada a tierra para crear una jaula de Faraday.

Hasta ahora he intentado poner un filtro de paso bajo para cada entrada.

El primer circuito que probé fue: C1 - 10n y 100n

esquemático

simular este circuito : esquema creado con CircuitLab

Luego probé un filtro de paso bajo:
R1 - 100 y 1k
C1 - 1u, 10n, 100n

esquemático

simular este circuito

También probé con GPIO pull-up encendido y apagado

En cualquier caso ninguno de ellos mejora el resultado.

Por el lado del software, estoy usando Python, RPi.GPIO event_detect; Intenté aumentar el tiempo de rebote e insertar un retraso después de la detección de eventos para "filtrar" los eventos generados por humanos, pero esto solo funcionaría para el caso del botón pulsador, no para el interruptor.

Cualquier consejo sería apreciado.

ACTUALIZACIÓN : este módulo de relé inserta mucho ruido, probé con la porción de RPI HAT de verdad y el mismo código funcionó bien, pudo detectar cualquier falso positivo en una prueba rápida.

este es el codigo:

#!/usr/bin/python


import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)


GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)


def read2(channel):
    print "GPIO 2"

def read20(channel):
    print "Button"

def read23(channel):
    print "Switch"


if __name__ == '__main__':

    GPIO.add_event_detect(26, GPIO.BOTH, callback=read2, bouncetime=300)
    GPIO.add_event_detect(20, GPIO.BOTH, callback=read20, bouncetime=300)
    GPIO.add_event_detect(23, GPIO.BOTH, callback=read23, bouncetime=300)

    while True:
        pass

Independientemente, todavía estoy buscando cómo poder usar esa placa.

¿Está tratando de controlar este relé directamente desde Raspberry Pi? De todos modos, apenas entiendo qué y por qué intentas hacer, y cuál es el problema.
Si bien no es estrictamente antirrebote, ya que la causa no es el rebote de contacto, puede intentar simplemente ignorar la entrada durante medio segundo después de cada cambio en el relé. Sin embargo, valdría la pena suprimir los efectos eléctricos, ya que podrían causar daños acumulativos en el circuito lógico, incluso si no lo destruyen de inmediato.
Ignorar la entrada mientras se cambia la salida es una buena idea. Lo probaré.
No sé cómo podré implementar eso usando eventos, tendré que pensarlo.
@AndreyPro: sí, tratando de controlar el relé directamente desde el Rpi, que funciona bien. Solo que al hacerlo se está afectando la funcionalidad general de mi aplicación.
primero necesito entender qué es la "funcionalidad general de su aplicación". No puedo entender tu circuito.
En general, leo el botón y el interruptor y, según eso, enciendo la lámpara usando el tablero de relés que se indica en la publicación, hay un enlace que muestra el tablero en cuestión. el diagrama solo muestra el "circuito" utilizado para la entrada, no para la salida. La salida (relé) es un cable simple que va desde un GPIO al pin IN de las placas/módulo. Más VCC y GND. Avíseme si tiene alguna otra pregunta. Gracias.
Considere usar un relé con funcionalidad de aislamiento para evitar que se produzca ruido en la bobina del relé. Hay módulos de relé más baratos que contienen relé con aislamiento de salida.
@PrasanDutt ¿Podría mostrarme a qué se refiere con relé con aislamiento de salida?
@PrasanDutt: básicamente, lo que estoy usando. ¿De verdad leíste mi publicación? hay un enlace a ese mismo módulo? Aunque soy un poco más barato... FYI, el optoacoplador no evita que entre ruido en la salida de los GPIO.

Respuestas (4)

Debería poder recuperar su interruptor en el software. Siempre es una buena práctica "tirar" de la entrada en la dirección opuesta a la acción del interruptor usando una resistencia de 10k ohm o más.

Con respecto a los transitorios de conmutación del relé, parece que hay diodos de amortiguamiento en las bobinas del relé. Entonces, intentaría colocar un capacitor de 100 uF o más grande directamente a través de los terminales de la fuente de alimentación de la placa de relés. Esto ayudará a "mantener" el suministro de 5 voltios a la placa cuando el relé esté energizado.

¿Está diciendo que ponga un límite entre vcc (3.3) y GND de la placa de relés? obviamente ambos vienen del RPi... también los relés están activos bajos, no sé si eso afectará.
En el interruptor de rebote por software, supongo que quiere decir algo así como almacenar el valor anterior del interruptor, ver cuándo cambia, esperar unos pocos ms y luego tomar medidas. ¿correcto?
Sí, recomendaría una tapa en el tablero de relés como lo describe. Proporciona almacenamiento de energía local para que el relé no necesite extraer la corriente máxima a través del bus.
Tienes el concepto de rebote del software correcto. Un tiempo de espera de 50 a 75 mS generalmente funciona bien. Si lo hace demasiado alto, el usuario sentirá que no responde y si es demasiado bajo, puede obtener múltiples activadores.
Sospecho que este relé inserta "más de lo habitual" EMI como lo he intentado con RPi realmente HAT con otro relé y no crea este problema, voy a realizar algunas pruebas más tarde cuando regrese del trabajo en el Pi HAT para ver si en realidad es menos ruidoso
También me pregunto qué quiso decir con su comentario de "extracción" con respecto al primer diagrama (ahí estaba usando los pullups internos del IC) o el segundo diagrama (aumentar el tamaño del pullup) o con respecto a mi comentario que probé con pull-ups encendido y apagado, en cuyo caso me refería a pull-ups IC para el segundo diagrama. Gracias
Si tiene pull ups internos, eso debería ser suficiente.
RPi Relat HAT mismo problema

Me he enfrentado exactamente al mismo problema y justo antes de volverme loco, encontré la causa raíz y la solución.

Su problema es que la detección de borde es muy, muy, muy, muy sensible a los picos de voltaje. Probablemente verá detecciones falsas incluso cuando encienda o apague otros equipos en su casa.

Para superar este problema, simplemente coloque un retraso de suspensión de 10 ms en sus definiciones de devolución de llamada y lea el estado del pin nuevamente; si sigue igual que realizar la acción, de lo contrario, solo fue un pico. Los condensadores pueden ayudar, pero deben diseñarse de una manera específica para que la sincronización sea perfecta, también tienen un comportamiento de carga y descarga diferente, ¡así que esto es bastante difícil!

Eche un vistazo a: https://www.raspberrypi.org/forums/viewtopic.php?t=134394 para obtener información real y adecuada. ¡Espero que tengas éxito!

Gracias, quería evitar el uso de "cheque retrasado". Experimenté la detección falsa al encender/apagar el equipo en mi casa. Especialmente cosas con calentadores y motores... el horno estaba hermoso... Gracias.

No estoy seguro de si se aplica, pero existen múltiples problemas posibles con estos relés.

  1. Tienen una bobina de 5 V, por lo que requieren un cambio de nivel del GPIO de 3,3 V de RPi.
  2. La resistencia de la bobina es de solo 70 ohmios, lo que provocaría una gran corriente de los pines GPIO, posiblemente destruyéndolos. Esto podría resolverse junto con la p. 1
  3. Un relé necesita un diodo flyback para proteger los pines GPIO de EMF potencialmente destructivos.

A menos que el módulo de relé los proporcione (no pudo encontrar la hoja de datos del módulo), debe hacerlo usted mismo. Ahora, dado que el módulo está diseñado para Arduino, que, AFAIK, tiene GPIO de 5 V, existe una alta probabilidad de que al menos p. 1 está en el lugar. Es decir, el módulo espera 5 V como voltaje de control y tratar de controlarlo con 3.3 V RPi GPIO conduce a una operación inestable.

Creo que la placa viene con un diodo snubbing/flyback, le pedí al revendedor que me proporcionara alguna documentación. Estoy usando los 5V del pi.
El RPi GPIO es de 3.3 V, ¿o quiere decir que cambia de nivel? Es difícil probar algo sin una hoja de datos, o al menos un esquema de la placa.
Oh, ya veo lo que quieres decir, pensé que te referías al poder. Como RPi también tiene un pin de alimentación de 5v. ¿Crees que si controlo un transistor para que se encienda/apague a través de GPIO y la salida del RPis 5V podría resolver el problema?

Por fin, un límite de 100 uf en el tablero de relés entre VCC y GND resolvió los problemas de falsos positivos.

No es necesario cambiar de nivel.

Gracias a todos.

ACTUALIZACIÓN : ¡Falsa alarma! estaba probando sin carga (LAMP) no funciona con el módulo de relé o RPi HAT.

Estoy empezando a creer que estoy tratando de hacer algo imposible. creo que solo me quedan las opciones de SSR y/o "antirrebote" de software...