Control AC de persianas - Relés cambian solos

Buenas a todos.
Tengo un proyecto de hace meses donde a traves de arduino controlo persianas, con botones que hacen de interruptor como a traves de ethernet mediante una ap que me he hecho.

Tengo tres persianas que suben o bajan usando 6 reles de 30 amperios conectados con una fuente de alimentación aparte de 12v con las ground conectadas, cada persiana usa dos reles, uno de subida y otro de bajada (inicialmente eran de estado solido pero los cambié).

El programa funciona correctamente, las persianas suben y bajan bien desde la app (red ethernet) o desde los botones.

Mi problema es que a menudo, cuando una persiana llega a su final de carrera, se activa otro relé y no se porque. Tengo entendido que cuando un motor llega a su final de carrera genera por un momento más tensión.

He puesto un diodo en antiparalelo entre la fuente de alimentación de los relés para evitar el rebote de la corriente, pero no hace nada (foto 2).

No se si poner un diodo en antiparalelo para cada salida de pin que activa los reles y evitar el retorno de energia. Es mala idea?

Alguien saba que puede ser? los cables pequeños (ftp cat5) que activan los reles?
Agradeceria mucho alguna idea.

Adjunto fotos de los reles
Adjunto código de Arduino por si alguien lo quiere usar como control remoto de persianas (lo pongo como adjunto porque el foro no me permite mas de 9000 carácteres).


Adjunto

intentXML3Persiana_menjador.ino (17.1 KB)

Buenas. Felicitaciones por el proyecto.

Yo probaria poniendo un diodo en cada rele.

Lo otro es poner un sensor de proximidad o algún corte antes de que el motor haga tope.

Gracias por contestar
Te refieres a poner un diodo en cada pin que vaya a arduino, como lo que te he marcado en el sketch adjunto? Lo habia pensado pero no me atrevia.
Puede funcionar?

Hola buenas,
pues nada, he puesto un diodo en cada salida del arduino hacia relé para rectificar pero continua igual.
También he puesto un diodo entre positivo y negativo de la alimentación de los relés por si acaso y tampoco hace nada.

A la que una de las tres persianas llega al final de carrera se activa por arte de magia otro relé haciendo que otra persiana suba o baje sin haberlo solicitado.

Estoy casi seguro que tiene que ver con la carga inductiva de la corriente que de alguna manera afecta el comportamiento de mi arduino, pero estoy más perdido que un pulpo en un garaje.

La verdad es que me siento algo fracasado y estoy por volver al sistema de interruptores convencionales y encerrarme en un monasterio.

A alguien se le ocurre como solucionar este problema? Se lo agradeceria de por vida

Hablanos del motor de la persiana, Danos detalles del mismo. Leo en tu título que es un motor AC?

Veamos si podemos resolverlo sino esa sería una alternativa ya que podrías regular un poco el comportamiento de la persiana.
Dime donde veo donde estan los finales de carrera? es lo que veo en tu post#3 como pulsadores en el esquema Fritzing?

Si esos fueran tu pulsadores o switches de fin de carrera no veo resistencia pull down que asegure un estado estable. Es fácil que por ahi se te filtre ruido.
Ahora miraré tu código a ver si los definiste como INPUT_PULLUP.

Si estan así definidos.

// switches PERSIANA1
    pinMode(30, INPUT_PULLUP);
    pinMode(31, INPUT_PULLUP);
    pinMode(32, INPUT_PULLUP);
    
// switches PERSIANA2
    pinMode(37, INPUT_PULLUP);
    pinMode(38, INPUT_PULLUP);
    pinMode(39, INPUT_PULLUP);
    
// switches PERSIANA3
    pinMode(47, INPUT_PULLUP);
    pinMode(48, INPUT_PULLUP);
    pinMode(49, INPUT_PULLUP);

Bueno entonces eso no debería ser el problema.
Sigo mirando y te daré alguna respuesta de modo que volveré a editar este post.

Esta sección del código es la que comprueba tus fin de carrera.

 // PERSIANA 1 ACCIONS
        if (digitalRead(30) == 0){ 
                 delay(100);
                PER1_on = "on";   
                PER1_off = "off";  // save LED state
                botoStop1 = "off"; 
                digitalWrite(22, HIGH);
                digitalWrite (23, LOW);
                sendGET();
            }
        else if (digitalRead(31) == 0){ 
                delay(100);
                PER1_on = "off";  
                PER1_off = "on"; 
                botoStop1 = "off"; 
                digitalWrite (22, LOW); 
                digitalWrite (23, HIGH); 
                sendGET();
            
          } 
         else if (digitalRead(32) == 0){ 
                 delay(100);
                PER1_on  = "off";  
                PER1_off = "off";
                botoStop1 = "on"; 
                digitalWrite (22, LOW); 
                digitalWrite (23, LOW); 
                sendGET();
                
                }

         // PERSIANA 2 ACCIONS
         
        else if (digitalRead(37) == 0){ 
                 delay(20);
                PER2_on = "on";   
                PER2_off = "off";  // save LED state
                botoStop2 = "off"; 
                digitalWrite(20, HIGH);
                digitalWrite (21, LOW);
                sendGET();
            }
        else if (digitalRead(38) == 0){ 
          delay(20);
                PER2_on = "off";  
                PER2_off = "on"; 
                botoStop2 = "off"; 
                digitalWrite (20, LOW); 
                digitalWrite (21, HIGH); 
                sendGET();
            
          } 
         else if (digitalRead(39) == 0){ 
          delay(20);
                PER2_on  = "off";  
                PER2_off = "off";
                botoStop2 = "on"; 
                digitalWrite (20, LOW); 
                digitalWrite (21, LOW); 
                sendGET();
                }
                
         // PERSIANA 3 ACCIONS
         
         
        else if (digitalRead(47) == 0){ 
                 delay(20);
                PER3_on = "on";   
                PER3_off = "off";  // save LED state
                botoStop3 = "off"; 
                digitalWrite(28, HIGH);
                digitalWrite (29, LOW);
                sendGET();
            }
        else if (digitalRead(48) == 0){ 
          delay(20);
                PER3_on = "off";  
                PER3_off = "on"; 
                botoStop3 = "off"; 
                digitalWrite (28, LOW); 
                digitalWrite (29, HIGH); 
                sendGET();
            
          } 
         else if (digitalRead(49) == 0){ 
          delay(20);
                PER3_on  = "off";  
                PER3_off = "off";
                botoStop3 = "on"; 
                digitalWrite (28, LOW); 
                digitalWrite (29, LOW); 
                sendGET();
                }

Vamos a modificar levemente su comportamiento y en lugar de ver estados veremos transiciones 1-> 0 a ver si mejora el comportamiento o incluso si esto no mejora, usaremos alguna rutina antirebotes.

Defino como globales estos flags que tendrán el estado de los fines de carrera.

Acabo de subir el archivo como adjunto.
Veamos si se comporta igual o mejora el comportamiento.
Si falla vamos con una rutina antirebotes.

intentXML3Persiana_menjador.ino (16.9 KB)

Corregidme si me equivoco, pero no seria un poco raro que fuera problema fisico y no de software? Es decir, se supone que los reles traen un optoacoplador, luego no veo logico que un rele le transmita al circuito del arduino una carga para que salte otra persiana :confused:

El relé no le provoca un problema pero su acción si, a través del motor.

A ver, el problema segun he entendido viene de cuando el motor de una persiana llega a su final de carrera, que segun dice emite algun tipo de pulso hacia el rele y se cree que este pulso que afecta al rele tambien afecta al arduino ya que se acciona otro rele distinto que hace que suba o baje otra persiana. Por eso mismo digo que no entiendo como es posible que un pulso proveniente del motor afecta directamente al arduino.

Un saludo

Estudia que pasa cuando un circuito inductivo que esta alimentado deja de estarlo o a la inversa. El circuito inductivo siempre se opone al cambio. Ese cambio se transmite por la línea eléctrica al arduino que entonces requiere de un filtro RFI o otras medidas para mitigar el problema

Una solución que disminuiría considerablemente este problema es usar SSR (solid state relay) en lugar de los reles comunes que estas usando.
Un SSR con disparo x cruce por cero prácticamente no tiene generación de ruido eléctrico.

Acabo de subir el código que me ha pasado Surbyte (muchas gracias) pero sin éxito.
Más datos: los relés están alimentados a 12V con un alimentador independiente. Arduino con otro a 6v por entrada Vin. Probé ayer de alimentar arduino desde una bateria (pila) de 9V para sacarlo de la linea de corriente pero sin éxito tampoco

Referente a los relés de estado sólido, ya lo probé pero me daban problemas similares. Os adjunto una imagen:

Os dejo un par de videos (muy cortos) hechos ahora para que veais lo que sucede y el montaje.

En el primero se ve como el relé cambia cuando la persiana llega al final, en el segundo se ve como cuandu una llega, la otra baja:

surbyte:
Estudia que pasa cuando un circuito inductivo que esta alimentado deja de estarlo o a la inversa. El circuito inductivo siempre se opone al cambio. Ese cambio se transmite por la línea eléctrica al arduino que entonces requiere de un filtro RFI o otras medidas para mitigar el problema

Una solución que disminuiría considerablemente este problema es usar SSR (solid state relay) en lugar de los reles comunes que estas usando.
Un SSR con disparo x cruce por cero prácticamente no tiene generación de ruido eléctrico.

Entonces que me estas diciendo, que las medidas de seguridad que tiene un rele para que no se comunique con el circuito que lo acciona no sirven de nada, por que directamente al cambiar de estado genera una tension X en dicho circuito?

Un saludo

Es que el rele es un switch y el problema inductivo ocurre cuando lo energizas o desenergizas.

Pero no has visto tu mensajeria privada. Te he enviado un MP para intentar ver el problema.
Revisa por favor!!

jordibadiag:
Acabo de subir el código que me ha pasado Surbyte (muchas gracias) pero sin éxito.
Más datos: los relés están alimentados a 12V con un alimentador independiente. Arduino con otro a 6v por entrada Vin. Probé ayer de alimentar arduino desde una bateria (pila) de 9V para sacarlo de la linea de corriente pero sin éxito tampoco

Referente a los relés de estado sólido, ya lo probé pero me daban problemas similares. Os adjunto una imagen:

Os dejo un par de videos (muy cortos) hechos ahora para que veais lo que sucede y el montaje.

En el primero se ve como el relé cambia cuando la persiana llega al final, en el segundo se ve como cuandu una llega, la otra baja:

https://photos.app.goo.gl/0OjpdNSSeQWU7l6v1

Lo que me parece super raro segun se ve en el video es que cuando llega el final de carrera salta otro rele, pero no por un corto espacio de tiempo, sino que se ve claramente que salte un buen rato. Es decir, que el arduino lo esta controlando con alguno de los pines, dependiendo el rele que se active en ese momento.

Yo me pregunto una cosa. Has probado a poner un codigo simple mas corto controlado solamente por 1 switch a ver que pasa? De ser problema de hardware, ya sea de los reles, de la induccion o de lo que sea deberias de seguir teniendo el mismo problema. Por lo menos con un codigo mas corto que el que has pasado te aseguras 100% que no sea nada relacionado con el codigo.

Otra cosa que me extraña es que siendo un problema de induccion es que se supone que estas usando valores de LOW para activar la accion de subir o bajar persianas, en principio la induccion da ruido electrico, es decir valores por encima del 0.

Tambien otra cosa que probaria seria en vez de poner un pulsador, es decir un switch que simplemente le mande un LOW durante 1segundo o asi, pondria un interruptor, es decir, que siempre le este mandando el valor 0 cuando tenga que estar activado a ver si con eso consigues aclarar algo mas, ya que poniendo 1 interruptor y modificando la funcion de activacion, alguno de los reles activaria 1 de los motores pero siempre y cuando dure esa señal.

Tambien incluso podrias depurar un poco mas el codigo suponiendo que sea un problema de induccion como ha dicho otra gente, poniendo que te imprima por serial los valores de los pins, o cada vez que 1 pin cambia de valor para saber si efectivamente el fallo viene por tema inductivo.

No se, veo demasiadas formas de probar e indentificar por donde puede venir el fallo.

Un saludo

surbyte:
Es que el rele es un switch y el problema inductivo ocurre cuando lo energizas o desenergizas.

Pero no has visto tu mensajeria privada. Te he enviado un MP para intentar ver el problema.
Revisa por favor!!

Creo que conocemos la mecanica de un rele, mientras le metes energia, cierra un circuito como si fuera un interruptor y deja pasar la energia. Pero sigues diciendo que el problema pasa cuando cambia de estado. Es decir que la parte del circuito de 5v recibe ruido de dicho cambio de estado, cosa que incluso podria ser peligroso, ya que de que tension estariamos hablando cuando genera el ruido, y ademas teniendo diodos, como podria esto afectar al arduino?

Y lo que te he preguntado antes, entonces el sistema de proteccion de los reles no sirve de nada?

Es que tu lo ves desde el accionamiento del relé y yo te estoy hablando desde el contacto que activa o desactiva el MOTOR AC.

Por otro lado hemos tenido un contacto remoto con @jordibadiag para intentar reconocer si es un problema de hardware o de software y aunque aun no detecto el problema ya se por donde esta

Durante las pruebas agregué una serie de impresiones con Serial.print que dieron este resueltado para los interruptores que se usan para subir, bajar, parar las persionas 1 a 3.

Agregué esto al código

// PERSIANA 1 ACCIONS
  per1on    = digitalRead(30);
  per1off   = digitalRead(31);
  per1stop  = digitalRead(32);
  char buffer[50]; 
  if (per1on != per1onAnt){ 
      sprintf(buffer, "1 ON:%d OFF: %d STOP %d", per1on, per1off, per1stop);
      Serial.println(buffer);
      Serial.println("1 ON:"+PER1_on+" OFF:"+PER1_off+" STOP: "+ botoStop1+""); 
  }

para cada persiana, lo que permite ver en el monitor serie (comentamos todos los demas Serial.print presentes), los cambios ocurridos.

En un par de pruebas las ventanas trabajaron bien pero luego ocurrió esto

Comenzando
1 ON:1 OFF: 1 STOP 1
1 ON:off OFF:off STOP:
2 ON:1 OFF: 1 STOP 1
2 ON:off OFF:off STOP:
3 ON:1 OFF: 1 STOP 1
3 ON:off OFF:off STOP: <= hasta acá solo es el arranque
1 ON:0 OFF: 1 STOP 1
1 ON:off OFF:off STOP: on <= aca se ve como se acciona switch1 y lo hace bien
1 ON:1 OFF: 1 STOP 1
1 ON:on OFF:off STOP: off
1 ON:0 OFF: 1 STOP 1
1 ON:on OFF:off STOP: off
1 ON:1 OFF: 1 STOP 1
1 ON:on OFF:off STOP: off
2 ON:0 OFF: 1 STOP 1 <= aca se acciona switch 2 pasa a 0 y luego vuelve a 1. Son pull up
2 ON:off OFF:off STOP: on
2 ON:1 OFF: 1 STOP 1
2 ON:on OFF:off STOP: off <= aca termina la persiana 2 correctamente peroo....

1 ON:0 OFF: 1 STOP 0 <= se activa persiana 1 durante un lapso
1 ON:on OFF:off STOP: off
1 ON:1 OFF: 1 STOP 1
1 ON:off OFF:off STOP: on

Esto me hizo prestar atención a que hay dos sitios en el código donde se accionan los motores lo que da lugar a una posible ambigüedad.

Cuando recibe el comando via Web o cuando lo recibe via contacto fisico.

De modo que hay que unir ambos casos para que sea uno solo.
Acabo de modificarlo, y lo subo para que lo pruebes cuando te sea posible, la diferencia horaria ya no es buena para ti.

Persianas.ino (16.6 KB)

1 Like

A ver si hay suerte y al final se identifica el problema :smiley:

Acabo de subier el programa de nuevo que surbyte ha modificado. Ayer estuvo repasando desde la otra mitad del planeta y durante un buen rato (y desinteresadamente, ya no quedan personas así. Que pasión este hombre! :slight_smile: ) y tengo que decir que de momento FUNCIONA!!!

No quiero cantar victoria todavia hasta que pasen un par de dias subiendo y bajando persianas y vea que todo sigue bien pero hoy iré a trabajar bastante más tranquilo.

De momento agradeceros a todos vuestra implicación, especialmente a Surbyte y quedo a disposición por si a alguien le interesa el código entero (arduino + web).

Gracias Jordi por tus palabras.

Solo comentar que tras dos semanas todo va casi perfecto y no he tenido ningún problema más al menos con los relés, por lo que podriamos dar el hilo por cerrado.
Una vez mas mis agradecimientos.

Bueno por si no quedó claro, no era problema inductivo sino de programa.

El sistema web y el control con pulsadores conspiraban entre si. Al poner que ambos cambien flags y que solo una acción sea la efectiva desparecieron los fantasmas.

1 Like