Arduino y ethershield se cuelgan cuando recibe corriente. Ruido?

Hola. Os quería exponer mi problema con arduino.
He realizado un proyecto de subir y bajar persianas a través de pulsadores y a la vez con un servidor web.
Para mi proyecto he utilizado:

Os adjunto el fritzing y el código usado. Se trata de tres pulsadores que activan el motor, uno sube persiana, otro la baja y otro la para.
El tema es que funciona a la perfección. Los relés cambian tanto desde la página web cuando le envio señal hasta con los pulsadores.
Mediante servidor y cliente web guardo el estado de la persiana en un fichero xml en un servidor web local mediante un php que le especifica el estado de los tres pulsadores para posterior visualización en página web.

EL problema está en cuanto lo conecto al motor de la persiana. Este cuando recibe corriente para subir o bajar sube o baja correctamente (los relés hacen su trabajo) pero arduino deja de responder durante unos segundos y el ethershield tambien, perdiendo ping y teniendo que resetear. Aunque vuelve a funcionar con los pulsadores a los segundos, ethershield no lo hace.

El cable de red que utilizo es apantallado cat 5e y el arduino está conectado a la corriente mediante enchufe de movil de 5v y usb.

Alguien tiene idea de que puede ser?
Muchas gracias de antemano

intentXML1Persiana_hab.ino (5.8 KB)

Todo alimentado desde Arduino. Ese es el problema
Motores deben alimentarse por fuera de Arduino compartiendo GND claro pero por fuera, fuente aparte.
El ethernet shield exige mucho al arduino. En mi caso he visto que debo alimentarlo con fuente externa cosa que seguramente haces pero luego alimentas el motor y ya esta al límite.

Veras que si usas otra fuente para la persiana y tanto driver como motor son alimentados de ese modo, todo funcionará bien.

NOTA: lee las normas del foro, códigos e imágenes deben verse, no adjuntarse solamente. Usa el repositorio como herramienta para almacenar la imagen pero luego captura el enlace y usalo con la etiqueta como dicen las normas.

Muchas gracias Surbyte por tu respuesta. Disculpas por no poner el código en formato texto (mira que he leído las normas pero me pareció algo largo. En fin. Posteo el código más abajo.
He probado de alimentar el motor de la persiana por otro lado y los relés con un transformador de 5v compartiendo masas en arduino. He probado desde tres tomas de corriente diferente pero nada, sigue igual. Al meter corriente del motor de persiana se cuelga.
Os comparto vídeo para que veais la diferencia
Video sin corriente
Video con corriente

También he probado sin el ethershield para descartar pero nada.
Buscando por internet he visto un tema similar con un motor y no se si lo podria aplicar a mi proyecto.
Se trata de utilizar un diodo pero no se si serviria para este caso ni como tendria que ponerlo. El caso es que tiene pinta de lo que dice Surbyte en ese foro sobre FUERZA CONTRA ELECTROMOTRIZ.
Alguna idea?

Como decía ahí va elcódigo en texto. Muchas gracias de nuevo

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x2F, 0xE4 };
IPAddress ip(192,168,1,208); // ip in lan
IPAddress gateway(192,168,1,1); // internet access via router
IPAddress subnet(255,255,255,0); //subnet mask
IPAddress myserver(192,168,1,123); // zoomkat web page
EthernetServer server(80); //server port
EthernetClient client;
String readString;


String PER1_on = "off";
String PER1_off = "off";
String botoStop;


void setup(){
  // switches PERSIANA
    pinMode(3, INPUT_PULLUP);
    pinMode(2, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    // RELE PERSIANA 1
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite (6, HIGH); 
    digitalWrite (7, HIGH); 
 
  Ethernet.begin(mac, ip, subnet, gateway);
  server.begin();
  Serial.begin(9600);
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string
          readString += c;
         
        }

        //if HTTP request has ended
        if (c == '\n') {
          Serial.println(readString); //print to serial monitor for debuging
            //now output HTML data header
          if(readString.indexOf('?') >=0) { //don't send new page
            client.println("HTTP/1.1 204 192.168.1.123");
            client.println();
            client.println(); 
          }
          else {
            client.println("HTTP/1.1 200 OK"); //send new page
            client.println("Content-Type: text/html");
            client.println();

            client.println("<HTML>");
            client.println("<HEAD>");
            client.println("<TITLE>Persianes</TITLE>");
            client.println("</HEAD>");
            client.println("<BODY>");

            client.println("<H1>pujada i baixada de persianes</H1>");

            client.println("<a href=\"/?p2up\" target=\"inlineframe\">ON</a>");
            client.println("<a href=\"/?p2dw\" target=\"inlineframe\">OFF</a>");
            client.println("<a href=\"/?p2st\" target=\"inlineframe\">stop</a>");


            client.println("<IFRAME name=inlineframe style=\"display:none\" >");         
            client.println("</IFRAME>");

            client.println("</BODY>");
            client.println("</HTML>");
          }

          delay(1);
          //stopping client
          client.stop();

           // control PERSIANA 1
              if(readString.indexOf("p2up") >0)//checks for off
              {
                PER1_on = "on";  // save LED state
                PER1_off = "off";  // save LED state
                botoStop = "off"; 
                digitalWrite(6, HIGH);
                digitalWrite (7, LOW);    
                sendGET();
               }
             else  if(readString.indexOf("p2dw") >0)//checks for off
              {
                PER1_on = "off";  // save LED state
                PER1_off = "on";  // save LED state
                botoStop = "off"; 
                digitalWrite(7, HIGH);
                digitalWrite (6, LOW);
                sendGET();
               }
              else  if (readString.indexOf("p2st") >0)
               {
                PER1_on = "off";  // save LED state
                PER1_off = "off";  // save LED state
                 botoStop="on";
                digitalWrite(7, HIGH);
                digitalWrite (6, HIGH); 
                sendGET();
                } 
          //clearing string for next read
          readString="";

        }
      }
    }
  }

  // PERSIANA 1 ACCIONS
        if (digitalRead(3) == 0){ 
                 delay(20);
                PER1_on = "on";   
                PER1_off = "off";  // save LED state
                botoStop = "off"; 
                digitalWrite(6, HIGH);
                digitalWrite (7, LOW);
                sendGET();
            }
        else if (digitalRead(5) == 0){ 
          delay(20);
                PER1_on = "off";  
                PER1_off = "on"; 
                botoStop = "off"; 
                digitalWrite (6, LOW); 
                digitalWrite (7, HIGH); 
                sendGET();
            
          } 
         else if (digitalRead(2) == 0){ 
          delay(20);
                PER1_on  = "off";  
                PER1_off = "off";
                botoStop = "on"; 
                digitalWrite (6, HIGH); 
                digitalWrite (7, HIGH); 
                sendGET();
                }
                
}

//////////////////////////
void sendGET() //client function to send/receie GET request data.
{
  String code = "p2up=" + String(PER1_on) + "&p2dw=" + String(PER1_off) + "&p2st=" + String(botoStop);
  if (client.connect(myserver, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /xmlPersianes2.php?" + code + " HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("connection failed");
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //waits for data
  while (client.connected() || client.available()) { //connected or data available
    char c = client.read();
    Serial.print(c);
  }

  Serial.println();
  Serial.println("disconnecting.");
  Serial.println("==================");
  Serial.println();
  client.stop();

}

Es muy probable que los motores de la persiana metan algo de "ruido" en la red eléctrica y si el conjunto Arduino+shield+relé que acciona el motor consume "mucho", la alimentación del Arduino esté "al límite" y se vuelva más vulnerable a ese "ruido". Prueba a alimentar el módulo de los relé de forma independiente del Arduino, con otra fuente. Eso "liberará" un poco la fuente de alimentación del Arduino y la hará menos vulnerable al ruido.

Ten en cuenta que las masas del módulo de los relé y del Arduino se han de unir de alguna manera. Y no sé si has de configurar de alguna "forma especial" el módulo de los relé si los alimentas aparte.

Gracias de nuevo por tu respuesta pero como comentaba en el post anterior ya he probado alimentando el relé con un transformador de 5v aparte, y también alimentando los motores de persianas aparte

El motor de la persiana es de continua. Porque no agregas un diodo en anti paralelo. Puede ser un 1n4002 en adelante.

Mas allá que no estas usando PWM puede servir.

Ya he pedido los diodos y en cuanto lleguen los pruebo y os comento.
Entiendo que debo poner uno entre el vcc del rele y la alimentación del rele. Me lo confirmais por favor?
que es pwm?

Gracias

yo lo que veo es que la placa de reles está muy cerca del arduino (por experiencia propia). Lo que yo haria, aparte de lo que te han dicho de diodos y tal, es probar la placa reles junto al motor y el resto a unos 2 metros, así como el arduino con plias (por probar y adquirir experiencias) y las masas entonces sin estar unidas.
Otra opción sería, quizás, en vez de reles usar transistores. cuando conectas el motor es cuanda hace chispa el contacto del relé.

Ok, esta tarde tambien lo probaré y pondré los relés a dos metros.
Cuando dices que las masas no deben unirse como conecto los relés?
Tengo Vcc-jdvcc(jumper)-gnd y vcc-ch1-ch2-gnd
Ahora tengo transformador 5v conectado en vcc y gnd + gnd arduino

la placa de reles usa una masa para el control de la placa de reles, esta sí debes conectarla, yo me refiero a no unir las masas de alimentacion del motor y bobina del relé, no me expliqué bien.
en este link hay un esquema de una de estas placas de reles.

Bueno. Pues al final he hecho un poco de todo:
He separado los relés de arduino unos 2 metros, he puesto un diodo en la entrada de los 5v del relé siguiendo este post tal y como muestra esta imagen:


Parecía que todo iba perfecto hasta que enchufé el ethershield a la red y otra vez lo mismo. Lo solucioné soldando el cable de tierra que viene del par trenzado apantallado del cable de red con el conector rj45 (que es metálico).

Tras varias pruebas no perdia la señal y todo iba bien pero ayer por la noche, cuando procedí a cerrar en caja la placa de relés y volvió a fallar >:( .
He tocado un poco los cables del relé y vuelve a funcionar pero ahora lo tengo medio desmontado y me da miedo que cuando vuelva a meter los relés en caja vuelva a fallar.

Ahora estoy algo más perdido y mis posibilidades son más cortas. Tiene que ser algo de conexión de la placa de relés (que ya he cambiado tres veces).
Adjunto imagen de mi relé y conexiones:

Hola de nuevo.
Una par de preguntas, por probar:
1- Debería cambiar los relés que són de 5dcv a unos de mayor poténcia dado que los motores de las persianas van a 220 directamente conectados a red eléctrica?
2- Tenia pensado de poner un transistor para estabilizar la potencia de entrada y relés, pero no se como conectarlo
Alguien podría echarme una mano?
Gracias de nuevo

por probar....¿has puesto filtros de ferrita?

Mañana lo pruebo, donde los pondrías? uno en el cable de red pero y los demas?
Muchas gracias

en los cables de los motores y las señales. lo que no sé si afecta es que tengas los cables enrollados, estás hacendo una bobina con ellos al no estar apantallados. Si es posible, usa todos los cables apantallados y la malla (blindaje) conectado a tierra como has hecho con el otro, pero solo un extremo a tierra, el otro no.
¿qué alimentas con el cargador de movil? prueba con una pila u otra fuente que no sea un cargador.

Bueno, pues parece que una vez realizado el conjunto de cambios todo funciona correctamente :slight_smile: :

  • He puesto filtros de ferrita (sobretodo cerca del motor de persiana), en las entradas y salidas de corriente.
  • he eliminado el cable enrollado tal y como me indicó efect2000 y lo he cambiado todo por cable apantallado para evitar acoples eléctricos.

De momento todo está funcionando a la perfección. A ver si aguanta bien
Muchisimas gracias por todos los consejos. Espero que este post sirva de ayuda a los que se encuentren con los mismos problemas que yo.
Un saludo a todos

un dato para que tengas en cuenta con los relés mira las características del motor cuantos vatios consume y divídalos por el voltaje como resultado te dan los amperios esos relés soportan 10A a 110 si no me equivoco, como tu usas voltaje 220v la capacidad de los reles estarían rondando los 7A, es decir; ejemplo: si tu motor consume 1100W dividido 220 igual a 5Amperes de consumo si tu motor ya paso de los 7A es mejor que no uses estos relés o puedes usar un octoaoplador ltv817 que tiene un asilamiento 5000V y se activan con un pulso de solo 5v a 5mA con un triac 800B (soporta 800v a 12A) y se activa tansolo con 50 mA son muy económicos y no tienen desgastes por mili accionamiento a comparación de los relés, los puedes alimentar con una fuente muy pequeña y lo de los cables enrollados si producen ruido y mas si van a estar juntos con los relés dentro de una caja.

Guau! que pasada!
Me has dado una clase magistral en un solo post! muchísimas gracias por esta información

Me podrias dar mas detalles como solucionaste esto? Con fotos planos algo ... tengo el mismo problema que vos, pero no con unmotor con las luces de casa, uso un modulo de 16 reles pero tengo usando 5 y al prender y apagar las lucez se cuelga ...

Hola, finalmente puse diodos en antiparalelo en el 5v para evitar el rebote de corriente contra arduino y uno de los principales problemas eran los relés. Esos azules de los chinos solo aguantan 10 amperios y cascaban en seguida.
Se ve que al arrancar o parar el motor el amperaje sube y fundia los relés. Entonces en algunos casos puse relés de estado sólido y en otros relés de 30amperios. Aui lo cuentan:
http://domotica-arduino.es/foro/Thread-Reles-de-verdad-para-persianas?page=2

Aqui los reles de estado solido. En ebay hay bastantes. Son mas caros pero te ahorran problemas:
Modulo rele estado solido

Por ultimo limitar los cables a lo justo, que no quede exceso de cable y sobretodo bien soldado para minimizar al máximo los problemas. De momento todo bien