Modulo de 2 Relays induce ruido a Arduino Mega

Buenos días, este es mi primer post. Leí las normas y espero no estar infringiendo ninguna al escribir esto. Llegado el caso ruego la/s señalen.

Decidí abrir un hilo después de buscar largo y tendido en Google, foros, etc., y probar posibles soluciones sin llegar a buen puerto. Estoy teniendo un problema de ruido al accionar un modulo de 2 relays con un Arduino Mega.

Contexto:

El proyecto en cuestión consiste en el automatismo de un proceso de llenado y calentamiento de agua dentro de un tanque de acero inoxidable, durante un tiempo dado. Los elementos principales de este proyecto son:

  • Arduino Mega 2560
  • Encoder rotativo KY-040
  • Display OLED 1.3" 128x64 SH1106
  • Modulo de 2 Relay
  • Sensor de temperatura ds18b20 sumergible
  • Sensor de nivel digital de acero inoxidable(básicamente un flotante como el de la mochila del inodoro)
  • Resistencia calentadora de mesa(se consigue en cualquier ferretería) de 700W
  • Bomba de acuario

El funcionamiento es sencillo. Se usa el encoder con interrupciones externas(LOW para la rotación y RISING para el pulsador) para navegar e interactuar con un menú mostrado en el display(ver este video). En una de las opciones de ese menú se define la temperatura que se precisa alcanzar, en otra se define durante cuanto tiempo el proceso va a estar corriendo, y finalmente con otra opción se da comienzo al proceso. Durante el tiempo definido el sistema mide la temperatura y el nivel de agua. Si la temperatura baja del valor seteado, se enciende la resistencia por medio de uno de los 2 relays del módulo, y se apaga cuando se alcanza el valor deseado. Si el tanque esta vacío o baja el nivel de agua, se acciona la bomba mediante el otro relay del módulo para llenarlo hasta que el sensor de nivel cambia de estado y la apaga.

Problema:

Todo anda perfecto con el sistema en vacío. El problema es cuando lo pruebo en carga. Al accionar un relay, el otro, o ambos con la resistencia y la bomba conectadas, aparentemente se filtra ruido al Arduino y el síntoma que se ve es que se "pulsa solo" el encoder. En realidad se dispara la interrupción asociada a él y me doy cuenta porque, por ejemplo, si estoy parado en una opción del menú, se mete en el submenú asociado sin que yo toque nada. O también si el display esta apagado(se apaga solo cada un minuto de inactividad), se prende automáticamente, cosa que debería ocurrir únicamente con una rotación o una pulsación. Pasa lo mismo también si conecto un ventilador en otro toma de la casa, al prenderlo o apagarlo el Arduino detecta un pulso del encoder. Digo síntoma porque no se en profundidad el alcance del problema.

Cuestiones técnicas que probé y/o tuve en cuenta:

El módulo de 2 relay incluye para cada relay su respectivo transistor con resistencia, un optoacoplador y un diodo flyback(ambos están probados y funcionan). Al módulo lo alimento con una fuente de 5V externa, distinta de la que alimenta al Arduino, y el conexionado esta hecho de forma que los optos trabajan. Adjunto imágenes con el datasheet y el conexionado.

Probé colocando capacitores cerámicos entre Vcc y las entradas IN1 e IN2 del módulo, de 11, 22, 33 y 100nf, así como entre GND y las entradas IN1 e IN2, y el problema persiste.

Incluí debounce tanto para la rotación como para la pulsación del encoder.

El encoder NO utiliza resistencias de pull-up(interna ni externa) ni de pull-down.

Para las conexiones entre el Arduino y el módulo NO estoy utilizando cables mallados ni trenzados.

La instalación eléctrica NO tiene descarga a tierra.

Ideas sobre como resolver este tema, o si a alguien ya le pasó y quiere compartir su experiencia, será bienvenido.

Desde ya, muchas gracias!

Bienvenido al foro Arduino, Leo que dices haber leído las normas pero los detalles que te indico es que justamente te has pasado por alto algunas cosas que estan ahí señaladas. Por favor, lee el privado que te he enviado para que edites tu post inicial usando etiquetas para enlaces y hagas visibles las imágenes.

Respecto a tu problema te diré que es muy común. Ya que ya tienes los relés es tarde para sugerirte usar un SSR con disparo x cruce x cero. Habitualmente reducen los problemas al punto que tal vez no tendrías ninguno.

Incluí debounce tanto para la rotación como para la pulsación del encoder.

El encoder NO utiliza resistencias de pull-up(interna ni externa) ni de pull-down.

En lo personal creo que hay doble error. Usas debounce y luego interrupciones, una cosa incompatible con la otra. No le pones resistencia pull-up o down y de nuevo eso asegura que se filtren ruidos. Entonces no se como tienes el debounce pero es impráctico con interrupciones. Te aconsejo que lo retires. Coloca según tu caso la resistencia adecuada para cada canal del encoder A y B. Veamos entonces como se comporta.

Si falla o sigue fallando entonces trabajemos sobre las cargas. Espero tus comentarios

Seria bueno que nos muestres el código para evaluar el tema encoder.

Buenas noches. En primer lugar, muchas gracias por responder. Pido disculpas por las cosas que se me pasaron, corregí lo del enlace al vídeo. Pido paciencia para corregir lo de las imágenes ya que voy a estar fuera durante el fin de semana y por ende lejos de una pc, pero apenas tenga oportunidad lo arreglo.

En cuanto al problema que plantee, vamos por partes:

Debounce: esta hecho con millis(). Inicialmente no lo utilizaba. Lei en algún lado que utilizarlo podia reducir las posibilidades de error, pero lo incluí y el error persistió. Podria volver a retirarlo.

Resistencias pull-up/down: según el datasheet del encoder, en la circuiteria interna del componente están incluidas resistencias de pull-up de 10k para los canales A y B. Para la pulsación, busqué información al respecto de posibles valores de R para este encoder puntual, pero no encontré mucho, entonces probé agregando tanto resistencias externas de pull-up y pull-down de 4k7(obviamente no en simultáneo), asi como con la interna del Arduino, pero al hacerlo no andaba correctamente, asi que lo dejé sin nada. Quizás erré en los valores, es algo que voy a probar a mi regreso. También apenas pueda subo el datasheet del encoder y la parte del codigo que lo maneja.

Lo de los SSR lo desconozco por completo, tengo que investigar al respecto. La realidad es que soy nuevo en el mundo Arduino. Hace sólo un mes que inicié este proyecto de 0 sin ningún conocimiento en el tema, sólo sabiendo algo de electrónica básica, por eso hay cosas que se me escapan, como por ejemplo lo de que el debounce y las interrupciones son incompatibles.

Reitero mi agradecimiento por contestar y reitero las disculpas por los errores en el post, serán corregidos. Y espero seguir contando con ayuda para poder resolver este tema, ya que necesito entregarlo y poner en marcha trabajos similares.

Saludos!

Resistencias pull-up/down: según el datasheet del encoder, en la circuiteria interna del componente están incluidas

Listo, si estan incluídas olvidemos lo anterior.

Lo de los SSR lo desconozco por completo, tengo que investigar al respecto

Puedes investigar lo que gustes pero resuelves el 95% de los problemas usándolos.

Moderador: Seré paciente con esto.

reitero las disculpas por los errores en el post, serán corregidos.

Buenas noches. Ya corregí lo que quedaba pendiente de mi post, si hay algún otro error por favor haganmelo saber.

Volviendo al tema, quité el debounce del encoder y lo deje como estaba originalmente, sigo viendo la misma falla. Adjunto esa porción de código por si lo quieren ver:

///Interrupcion por Pulso///
void ISRencoderSwitch()                                 //Esta rutina detecta si se pulsa el encoder. En caso de pulsarlo se lleva a true
{                                                       //la variable pulse, que luego sera utilizada para disparar las acciones correspondientes 
  int buttonState = LOW;
  int lastButtonState = digitalRead(ENCODER_SW);
  
  if(buttonState != lastButtonState)
  {
    lastButtonState = buttonState;
    if(digitalRead(ENCODER_SW) == HIGH)
    {
      pulse = true;
    }
  } 
}

Dudo que el problema venga por este lado, ya que en vacío todo funciona correctamente, y además pude ver otras fallas como parpadeos del display o cuelgues del Arduino que alejarían el diagnostico de todo lo relativo al encoder.

Estuve investigando que los módulos SSR tienen un fusible de 2A a la salida. La resistencia que estoy utilizando consume 3A, por ende no me servirían, no? Entiendo que podría no usar los módulos y armar todo el circuito correspodiente a los SSR comprando componente por componente, pero me gustaría que esa fuera la última alternativa.

Hay alguna otra cosa que se pueda probar para resolver el problema que tengo y poder usar el módulo de relays comunes?

Desde ya, muchas gracias!

Hi, No dices que voltaje usas para las resistencias pero dices que son las que son caseras por la tanto deben de usar 120v o 220v AC dependiendo del paiz que vives. Los SSR los hay de varios voltajes y corrientes. La bomba que voltaje usa voltajes AC o DC. Creo que si quires tratar de usar los relays puede usar lo que se conoce como snubbers que es una resistencia de 50 ohmios con un condesador en serie de .1uf conectado en parallelo a los contactos del relay. La otra alternativa seria la del uso de un MOV o metal oxide varistor. Esto se usan para controlar los ruidos que se producen en los contactos de un relay mecanico cuando los abre/ cierras. Final si todas estas alternativas fallan la unica solucion sera usar los SSR. Si dice que voltajes usan la bomba y la resistencia se te podra aconsejar que MOV o que SSR puedes usar. Trate de leer los hilos y no encontre donde mencionas los voltajes de la bomba y la resistencia.

Tienes dos elementos conectados a AC que son: 1) Resistencia calentadora de mesa(se consigue en cualquier ferretería) de 700W 2) Bomba de acuario

La bomba es la posible responsable de los problemas. Dudo que la resistencia lo sea. Comienza eliminando la bomba solo para probar a ver como se comporta todo sin ella.

Estuve investigando que los módulos SSR tienen un fusible de 2A a la salida. La resistencia que estoy utilizando consume 3A, por ende no me servirían, no?

Los módulos SSR de 2A creo que son los OMRON que te mencioné no? Si es asi claro que no sirven. Pero si buscas en otro hilo, tauro acaba de recomendar un Fotek SSR-10A ver link

Que tal vez sirva a tus fines.

tauro0221: Si dice que voltajes usan la bomba y la resistencia se te podra aconsejar que MOV o que SSR puedes usar.

Hola! Ambas cargas funcionan a 220V AC.

surbyte: La bomba es la posible responsable de los problemas.

Tambien lo pensamos inicialmente, para descartar problemas con ambas cosas directamente estamos probando con una lamparita de 50W, y el problema persiste

Tambien lo pensamos inicialmente, para descartar problemas con ambas cosas directamente estamos probando con una lamparita de 50W, y el problema persiste

Bien, a esta altura cuando hablas del problema te refieres al encoder que sigue haciendo cosas raras al igual que el Display OLED no?

surbyte: Bien, a esta altura cuando hablas del problema te refieres al encoder que sigue haciendo cosas raras al igual que el Display OLED no?

Si. Para pasar en limpio los problemas que veo:

  • Encoder se "pulsa solo" al accionar los relays, o al accionar otro electrodomestico que no tiene que ver con el sistema.

  • Display sufre pequeños parpadeos, como cuando la TV tiene interferencia.

Cosas que ya probé:

  • Capacitores cerámicos en paralelo entre las entradas del módulo y VCC/GND

  • Filtro RC también en paralelo entre las entradas del módulo y VCC/GND(me quedan dudas sobre los valores que use, quizás eran incorrectos)

  • Desconectar bomba y resistencia y probar con lamparita de 50W

  • Alimentación separada para el módulo de relays

Bueno si en vacío pasa esto

Encoder se "pulsa solo" al accionar los relays, o al accionar otro electrodomestico que no tiene que ver con el sistema.

hay que trabajar con la alimentación de tu Arduino.

Recuérdanos como lo alimentas. Desde la PC o con fuente externa.

Al módulo lo alimento con una fuente de 5V externa, distinta de la que alimenta al Arduino, y el conexionado esta hecho de forma que los optos trabajan.

Qué más puedes decirnos de la fuente que alimenta Arduino? Prueba quitar esa fuente (la del Arduino) y alimenta Arduino con la PC via USB a ver si tienes el mismo comportamiento.

Hi, Pregunta cual es el proposito para usar ese encoder? Segun el link adjunto el encoder necesita tres pines clock,dta y switch. Tambien usa una libreria para leer los pulso de salida del encoder y no veo nada de esto en tu sketch. En el link dice que ese encoder produce mucho ruido de los contactos. Tambien un link que al final explica los pulsos de salida de los encoder.Posiblemente estoy equivocado pero es bueno que aclares esto.Tu mencionas que el encoder se activa solo y si esto es cierto posiblemente la fuente de energia puede ser que se este pierdiendo voltaje cuando energizas la bomba y las resistencias a la misma vez. Sugerencia es de que hagas un sketch que solamente active la bomba y las resistencia para ve que pasa y deja el encoder fuera.

Link: https://www.brainy-bits.com/arduino-rotary-encoder-ky-040/

link:http://www.switchchannel.com/switches/encoder%20switches/re11/mechanical%20rotary%20encoder%20switch.htm

surbyte:
Bueno si en vacío pasa esto

hay que trabajar con la alimentación de tu Arduino.

Como explicaba en el post inicial, los problemas se presentan al cargar el sistema con la parte de potencia. Es decir, al conectarle la resistencia y la bomba, y empezar a trabajar con 220V de por medio. Mientras el sistema está en vacío, todo funciona perfecto.

Para la alimentación, al modulo de relays lo alimento con una fuente de 5V, al Arduino probé alimentarlo con el USB de la PC, con un cargador de celular y con una fuente de un router que tengo, pero en cualquier caso, con el sistema EN CARGA, se presentan las fallas arriba descriptas.

tauro0221:
Hi,
Pregunta cual es el proposito para usar ese encoder?

Elegimos usar un encoder porque reemplazas 3 pulsadores individuales con un sólo componente. Además, como esto está pensado para un entorno de tipo más industrial, el encoder es lo que más se adecúa. Adicionalmente, en algunas opciones del menú en las que hay que incrementar o decrementar valores, con el encoder es mucho más cómodo y sencillo de lograr, tanto desde el punto de vista del manejo manual como del código.

Lo del uso de la librería es relativo a lo que quieras hacer. Si bien hay algunas que te dan algunas funcionalidades adicionales, para lo que necesitamos nosotros, haciendo el código a mano nos permitió optimizarlo a la menor cantidad de líneas posibles, conociendo línea a línea el comportamiento del componente, cosa que con una librería creada por algún tercero, en combinación con nuestros limitados conocimientos de programación y manejo de librerías, nos habría llevado horas de entender y optimizar.

Si tenés un rato mira éste video. La parte más “compleja” del componente es la rotación, manejada por una comparación de estados entre el pin clk y data, que son justamente los que generan los pulsos digitales a los que se refiere el link que pasaste. El pin sw es un pulsador común, sólo que embebido dentro de este “aparato” rotatorio.

Electrónicamente el encoder sería una especie de generador de señales, pero no tiene componentes activos, por ende no es algo que demande determinada corriente a la fuente ni al Arduino para funcionar correctamente.

Por el tema del ruido en los contactos, entiendo que haya proyectos en los cuales los encoders se usan para tareas un poco mas complejas, ej.: posicionar motores. En nuestro caso solo lo usamos para navegar un menú, aumentar o decrementar un valor, tareas sencillas con un margen de error amplio ya que si erraste en setear un valor, entras de vuelta en el menú correspondiente y lo corregís. En nuestro caso con un simple de-bounce por tiempo para las rotaciones horarias y anti-horarias, nos basta para corregir cualquier error grosero que pudiera llegar a representar un verdadero dolor de cabeza.

Pero bueno, supongamos que el problema de que el encoder se dispare sólo sea justamente por problemas en el componente, cómo se explica que los fallos se den casualmente cuando se carga al sistema con elementos alimentados a 220V? Y asi y todo, si yo pudiera corregir los rebotes del encoder, o reemplazarlo por otro componente que no rebote, como se que el ruido que se filtra desapareció? Porque si eso quedara dando vueltas, el sistema no sería para nada confiable, ya que el ruido es impredecible y de la misma forma lo son sus posibles consecuencias.

Voy a investigar un poco más respecto de los snubbers y los MOVs, ver que se consigue en la zona en la que vivo, y nada, a seguir probando. Sus ideas seguirán siendo bienvenidas!

Hi,
Muchas gracias por tu explicacion del el porque usar el encoder. Pero de todas maneras elimina el encoder y trata de energizar la valvula y la resistencia para ver como funciona y si deja de funcionar el micro. Otra sugerencia es de leer los voltajes de la energia que alimentan los componentes para ver si el voltaje se mantiene fijo cuando la valvula y la resistencias se energizan. Tu mencionas que usas dos resistencias de 700 vatios y si las energizas ambas van consumir 6 amperios mas la corriente de la valvula. Otra cosa sabes que corriente usa la valvula o el modelo de la valvula.

En un hilo similar puse el link del topico donde se habla de los snubbers y todas las opciones posibles como TVS, MOV, etc. Esta en esta misma sección y fue hecho en estos días.

tauro0221: Tu mencionas que usas dos resistencias de 700 vatios y si las energizas ambas van consumir 6 amperios mas la corriente de la valvula. Otra cosa sabes que corriente usa la valvula o el modelo de la valvula.

Buen día. Perdón por la demora en contestar. Alimentamos una sola resistencia de 700W que consume 3A. La bomba no se exactamente cuánto consume, pero es menos de 1A. Vamos a probar reemplazando el módulo de relays con triacs, y de ahí veremos que pasa.