Go Down

Topic: Mi arduino se sale del Loop (Aparentemente) (Read 8799 times) previous topic - next topic

AlexLPD

Hola, @surbyte, efectivamente ayer que me contaste los del debounce,me puse a buscar y me baje una libreria;

https://www.pjrc.com/teensy/td_libs_Bounce.html

De hecho es oficial de arduino, despues de algunos errores, por que siempre  hay ejemplos poco claros, logre que el prorgrama compilara sin errores, lo cargue y lo probe en la proto, y aparentemente funciona.

Por cierto que alguien habia mencionado que el serial podia estar comiendose la memoria, y es cierto en una de las pruebas por error se quedo un }, que cerraba el loop antes del serial.flush() y efectivamente podias ver la memoria descender con cada iteracion.

Bueno agregado el debounce, te dejo el codigo, para que me digas que opinas;

Code: [Select]

//TODAS LAS SALIDAS ESTAN INVERIDAS PARA PODER OPERAR LA TABLILLA DE RELAYS
//EJEMPLO, SI NECESITO ENCENDER UN FOCO EN LUGAR DE
// digitalWrite(focoDes, HIGH);
//ESCRIBIMOS;
//digitalWrite(focoDes, LOW);
//DEBIDO A COMO OPERAN LOS RELEVADORES.

//DECLARACION DE LIBRERIAS
#include <MemoryFree.h>
#include <Bounce2.h>

// DECLARACION DE PINES A SER USADOS EN EL PROGRAMA
int sol = 13;                 // pin para el control de la solenoide
int comp =12;                 // Pin para control del compresor
int motores[4] = {8,9,10,11}; //Pines controlar motores del difusor 
int focoRef= 5 ;              //Pin para encender el foco de la refrigeracion
int focoDes= 6 ;              //Pin para encender el foco deshielo
int Term = 4;                 //Pin para leer el estado del termostato
int SW2 = 3;                  //pin para leer el switch principal
int SW1 = 2;                  //pin para leer el switch principal


//DECLARACION DE PINES QUE NO SERAN USADOS
int pinesNoUsados[6] ={A0, A1, A2, A3, A4, A5};

//DECLARACION DE VARIABLES GLOBALES
int Switch = 0;               //variable para almacenar el estado del switch
                              //int EdoSW1 = 0;
                              //int EdoSW2 = 0;
//int EdoTerm = 0;             //para alamcenear el estado del termostato
int caso = 1;                //variable de 1 a 4 para alternar los motores difussor
boolean Encendido = false;   //Variable para comparar si se ha encendio o apagado el termostato

Bounce EdoSW2 = Bounce();
Bounce EdoSW1 = Bounce();
Bounce EdoTerm = Bounce();

//            fila / columna                 
int ArrayMotores[6][4] ={{HIGH, HIGH, HIGH,  HIGH  } , //Primer arreglo de encendio de motores
                         {LOW,  HIGH, HIGH,  HIGH  } ,// Segundo... cada 1 y 0 corresponden a un motor
                         {HIGH, LOW , HIGH,  HIGH  } , //encendido o apagado.
                         {HIGH, HIGH, LOW ,  HIGH  } ,
                         {HIGH, HIGH, HIGH,   LOW } ,
                         {LOW,  LOW,  LOW,   LOW } , 
                          };

void setup(){
  delay(800);                      //Delay para prevenir ruido al arranque del arduino
  Serial.begin(9600);
  pinMode(comp, OUTPUT);
  pinMode(sol, OUTPUT);
  pinMode(focoRef, OUTPUT);
  pinMode(focoDes, OUTPUT);
  delay(250);
  for(int b; b<4; b++){            //inicia contador de 1 a 4
    pinMode(motores[b], OUTPUT);   //declara cada motor como pin de salida
    delay(500);
    digitalWrite(motores[b], HIGH); //Apaga cada motor
   }
 for(int z; z<5; z++){
   pinMode(pinesNoUsados[z], OUTPUT); //declara cada pin sin usar como salida
   pinMode(pinesNoUsados[z], HIGH);   //pone cada pin no usado a 5V
   }
  pinMode(SW1, INPUT);                //declara el pin como entrada
    EdoSW1. attach(SW1);              //lo agrega a la instancia bounce llamada SW1
    EdoSW1. interval(150);            //da el intervalo del bounce 150ms
 
  pinMode(SW2, INPUT); 
    EdoSW2. attach(SW2);
    EdoSW2. interval(150);

  pinMode(Term, INPUT);
    EdoTerm. attach(Term);
    EdoTerm. interval(150);
 
 
 delay(500);
}

void loop(){
  Serial.print("freeMemory()=");
  Serial.println(freeMemory());
  delay(50);
  Serial.println("Inicia Lectura de SW");
  EdoSW1.update();
         int ValSW1 = EdoSW1.read();
  EdoSW2.update();
         int ValSW2 = EdoSW2.read();


  Serial.print("ValSW1 = ");
  Serial.println(ValSW1);
  Serial.print("ValSW2 = ");
  Serial.println(ValSW2);

         
  if(ValSW1 ==HIGH && ValSW2 ==LOW){
    Switch=1;
     }
     else if (ValSW1 ==LOW && ValSW2 ==HIGH){
        Switch=2;
      }
     else if (ValSW1 ==LOW && ValSW2 ==LOW){
        Switch =0;
        }
     
  Serial.println("Termina lectura de SW");
  delay(100);

  switch(Switch){
  case 0:
    Serial.println("SW apagado");
    delay(100); //remover en la verson final
    digitalWrite(focoRef, HIGH);
    digitalWrite(focoDes, HIGH);
    AllOff();
    break;

  case 1:
    Serial.println("SW en refrigeracion");
    delay(100); //remover en la version final
    digitalWrite(focoRef, HIGH);
    digitalWrite(focoDes, LOW);
    refrigeracion();
    break;
   
  case 2:
    Serial.println("SW en deshielo");   
    delay(100);// remover en la version final
    digitalWrite(focoRef, LOW);
    digitalWrite(focoDes, HIGH);
    deshielo(); 
    break;
  }
  delay(150);
  Serial.flush();
}

// subrutina de deshielo, deja encendido solo los motores del evaporador.
void deshielo(){
  digitalWrite(sol,LOW);  //enciende la solenoide
  delay(1000); //remover en version final);
  digitalWrite(comp, HIGH); //apaga el compresor
  delay(1000); //remover en version final

  for(int a; a<4 ; a++){
    digitalWrite(motores[a], ArrayMotores[5][a]);
    delay(1000);
  }
}


// subrutina para apagar todo; compresor, solenoide, evaporador.
void AllOff(){
  digitalWrite(sol,HIGH);  //Apaga  la solenoide
  delay(500);           //remover en version final);
  digitalWrite(comp, HIGH); //apaga el compresor
  delay(200); //remover en version final
  for(int u; u<4; u++){
    digitalWrite(motores[u], ArrayMotores[0][u]);
  } 
}

//subrutina que encendera la refrigeracion y alternara los motores del
//difusor.

void refrigeracion(){
  EdoTerm.update();
   int  ValEdoTerm =EdoTerm.read();
       
            if(caso >= 5){
            caso=1;}       
 
        if(ValEdoTerm == HIGH){
           digitalWrite(sol, HIGH);   //Apaga la solenoide, deja pasar liquido
           for(int d; d<4; d++){
              digitalWrite(motores[d], ArrayMotores[5][d]);
              delay(1000);
              }
              delay(1000);               //retraso en la entrada del compresor
              digitalWrite(comp, LOW);  //enciende el compresor
              Serial.print("Termostato encendido  "); Serial.println(caso);
              Encendido = true;
              }
           
      if(ValEdoTerm == LOW){
             if(Encendido == true){
             caso++;}
             Serial.print("Termostato apagado ");
             Serial.print("Comienza subrutina "); Serial.println(caso);
             digitalWrite(sol, LOW);  //Enciende solenoide, no pasa liquido
             delay(1000);              //retraso en la entrada del compresor
             digitalWrite(comp, HIGH);  //Apaga el compresor
             for(int e; e<4; e++){
             digitalWrite(motores[e], ArrayMotores[caso][e]);
            }     
            Encendido = false;
            }
}


Hoy cambiare el alambre que tenia en las tablillas, por cable que da mejor soldabilidad, y agregare
un capacitor de 470uF al positivo de la placa, para mejorar un poco la resistencia a pequeños espacios sin energía.

Pienso que me da tiempo instalarla hoy mismo y probarla realmente, regresare con fotos y observaciones, muchas gracias por tu ayuda.

En la tarde me bajo tu libreria a ver si es mas intuitiva que la que tengo.

Saludos!!!!

surbyte

#16
Nov 24, 2014, 08:05 pm Last Edit: Nov 24, 2014, 09:55 pm by surbyte
Espera dame unos minutos que te subo el programa modificado con la libreria que te sugerí.
Bueno incluye la librería sino no funciona.
Si miras la definición de la librería permite cualquier configuración para los switches.



Code: [Select]
// TODAS LAS SALIDAS ESTAN INVERIDAS PARA PODER OPERAR LA TABLILLA DE RELAYS
// EJEMPLO, SI NECESITO ENCENDER UN FOCO EN LUGAR DE
// digitalWrite(focoDes, HIGH);
// ESCRIBIMOS;
// digitalWrite(focoDes, LOW);
// DEBIDO A COMO OPERAN LOS RELEVADORES.

#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

//DECLARACION DE LIBRERIAS
#include <MemoryFree.h>
#include "Switch.h"

// DECLARACION DE PINES A SER USADOS EN EL PROGRAMA

const byte SW1 = 2; //pin para leer el switch principal
const byte SW2 = 3; //pin para leer el switch principal
const byte Term = 4; //Pin para leer el estado del termostato

const byte focoRef = 5 ; //Pin para encender el foco de la refrigeracion
const byte focoDes = 6 ; //Pin para encender el foco deshielo

const byte motores[4] = {8,9,10,11}; //Pines controlar motores del difusor 

const byte sol = 12; // pin para el control de la solenoide
const byte comp =13; // Pin para control del compresor




//DECLARACION DE PINES QUE NO SERAN USADOS
const byte pinesNoUsados[6] ={A0, A1, A2, A3, A4, A5};

//DECLARACION DE VARIABLES GLOBALES
int SWitches = 0;               //variable para almacenar el estado del switch
int caso = 1;                //variable de 1 a 4 para alternar los motores difussor
boolean Encendido = false;   //Variable para comparar si se ha encendio o apagado el termostato


//            fila / columna                 
int ArrayMotores[6][4] ={{HIGH, HIGH, HIGH,  HIGH  } , //Primer arreglo de encendio de motores
                         {LOW,  HIGH, HIGH,  HIGH  } ,// Segundo... cada 1 y 0 corresponden a un motor
                         {HIGH, LOW , HIGH,  HIGH  } , //encendido o apagado.
                         {HIGH, HIGH, LOW ,  HIGH  } ,
                         {HIGH, HIGH, HIGH,   LOW } ,
                         {LOW,  LOW,  LOW,   LOW } , 
                          };

Switch EdoSW1 = Switch(SW1, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity, 100mseg debounce
Switch EdoSW2 = Switch(SW2, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
Switch EdoTerm = Switch(Term, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
boolean Status1 = false;
boolean Status2 = false;

void setup(){

  Serial.begin(9600);
  pinMode(comp, OUTPUT);
  pinMode(sol, OUTPUT);
  pinMode(focoRef, OUTPUT);
  pinMode(focoDes, OUTPUT);

  for(int b; b<4; b++){            //inicia contador de 1 a 4
    pinMode(motores[b], OUTPUT);   //declara cada motor como pin de salida
    digitalWrite(motores[b], HIGH); //Apaga cada motor
   }
 for(int z; z<5; z++){
   pinMode(pinesNoUsados[z], OUTPUT); //declara cada pin sin usar como salida
   pinMode(pinesNoUsados[z], HIGH);   //pone cada pin no usado a 5V
   }
 delay(500);
}

void loop() {

  //Serial.print("freeMemory()=");
  //Serial.println(freeMemory());

  //Serial.println("Leo SW");

  EdoSW1.poll();
  if (EdoSW1.on())
      Status1 = 1;
  else
      Status1 = 0;

  Serial.print("\nSw1 =");
  Serial.print(Status1);

  EdoSW2.poll();
  if (EdoSW2.on())
     Status2 = 1;
  else
     Status2 = 0;
   
  Serial.print(" Sw2 =");
  Serial.print(Status2);    
  SWitches = Status1 + (Status2 << 1);

  Serial.print("\n Switch =");
  Serial.println(SWitches);    
 
  //Serial.flush();

  switch (SWitches) {
  case 0:
Serial.println("SW apagado");
digitalWrite(focoRef, HIGH);
digitalWrite(focoDes, HIGH);
AllOff();
break;

  case 1:
Serial.println("SW en refrigeracion");
digitalWrite(focoRef, HIGH);
digitalWrite(focoDes, LOW);
refrigeracion();
break;
  case 2:
Serial.println("SW en deshielo");   
digitalWrite(focoRef, LOW);
digitalWrite(focoDes, HIGH);
deshielo(); 
break;
  }
  delay(150);
}

// subrutina de deshielo, deja encendido solo los motores del evaporador.
void deshielo(){
  digitalWrite(sol,LOW);  //enciende la solenoide
  delay(1000); //remover en version final);
  digitalWrite(comp, HIGH); //apaga el compresor
  delay(1000); //remover en version final

  for (int a; a<4 ; a++) {
      digitalWrite(motores[a], ArrayMotores[5][a]);
      delay(1000);
  }
  Serial.println("Salgo de deshielo");
}


// subrutina para apagar todo; compresor, solenoide, evaporador.
void AllOff(){
  digitalWrite(sol,HIGH);  //Apaga  la solenoide
  delay(500);           //remover en version final
  digitalWrite(comp, HIGH); //apaga el compresor
  delay(200); //remover en version final
  for (int u; u<4; u++){
      digitalWrite(motores[u], ArrayMotores[0][u]);
  } 
  Serial.println("Salgo de AllOFF");
}

//subrutina que encendera la refrigeracion y alternara los motores del difusor.

void refrigeracion(){
 
  //EdoTerm = digitalRead(Term);
  EdoTerm.poll();
 
       
  if (caso >= 5){
     caso=1;
  }       
 
  if (EdoTerm.pushed()) {
     digitalWrite(sol, HIGH);   //Apaga la solenoide, deja pasar liquido
     for (int d; d<4; d++) {
         digitalWrite(motores[d], ArrayMotores[5][d]);
         delay(1000);
     }
     delay(1000);               //retraso en la entrada del compresor
     digitalWrite(comp, LOW);  //enciende el compresor
     Serial.print("Termostato encendido  "); Serial.println(caso);
     Encendido = true;
  }
           
  if (!EdoTerm.pushed()) {
     if (Encendido)
    caso++;

     Serial.print("Termostato apagado ");
     Serial.print("Comienza subrutina ");
Serial.println(caso);
     digitalWrite(sol, LOW);  //Enciende solenoide, no pasa liquido
     delay(1000);              //retraso en la entrada del compresor
     digitalWrite(comp, HIGH);  //Apaga el compresor
     for (int e; e<4; e++){
digitalWrite(motores[e], ArrayMotores[caso][e]);
     }     
     Encendido = false;
  }
  Serial.println("Salgo de refrigeracion");
}


Un par de comentarios para comprender que hice.
La librería maneja pulsadores e interruptores (tu caso) hay un set de comandos para uno y otro.
Para tu caso esta la funcion objeto.on() que te dice esi esta en 1 o no.

Siempre siempre hay que poner objeto.poll() para que haga lo que antes serìa Status = digitalRead(pin);
pero luego esta hecho internamente el debounce que es 100mseg en este caso.
Lo ves en la definición como esta

Code: [Select]
Switch EdoSW1 = Switch(SW1, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity, 100mseg debounce

Ademas simplifiqué todo tus if en una suma de los estados de SW1 y SW2 desplazado a izq 1 posición. O sea que SW2 toma valores 2 o 0 que sumado a SW1 nos da 0,1,2,3

Yo cambiaría una cosa mas... los delay()
Los delay interrumpen el programa gastando tiempo y NO ATENDIENDO LOS SWITCHES.
Te lo pongo en mayúsculas porque es electrónicamente incorrecto usar eso en una instalación industrial.
No se que tan crítico es tu sistema, pero si reemplazas los delays por millis() el programa estará ejecutándose mas libremente, con la opción de poder tomar acciones intermedias si hicieran falta. Considéralo.

Ahora lo mas importante. Si todo funciona correctamente hasta acá quiero saber si has eliminado tu problema o no. Me refiero a los comportamientos erráticos que inidicaste al comienzo.
El funcionamiento de arduino en ambiente industrial es mi preocupación Nro 1, justamente por extraer experiencias que ayuden a mi conocimiento.


AlexLPD

Bueno, pues le instale y despues de resolver algunos increibles problemas con el hardawe que tenia instalado, parece que se ha quedado funcionando, ahora bien he notado que si uno deja las pastillas de los contactores del compresor y los difusores encendidas durante el set-up del arduino;

Se encienden y apagan y luego se vuelven a encender, es como si se creara un ruido en los pines de lectura o algo similar, y tengo que apagarlo  del general para no dañar partes importantes de la instalación.

Creo que es debido a esta parte del codigo;
Code: [Select]

for(int b; b<4; b++){            //inicia contador de 1 a 4
    pinMode(motores[b], OUTPUT);   //declara cada motor como pin de salida
    delay(500);
    digitalWrite(motores[b], HIGH); //Apaga cada motor
   }
 for(int z; z<5; z++){
   pinMode(pinesNoUsados[z], OUTPUT); //declara cada pin sin usar como salida
   pinMode(pinesNoUsados[z], HIGH);   //pone cada pin no usado a 5V
   }


Lo que voy a hacer es quitar la parte donde se apaga cada elemento, ya que debido
a que estamos trabajando con la tablilla de relays, parece ser que se crea un circulo
vicioso en cuanto a ruido, o bajas de voltaje repentinas, simplemente esperaremos a que
la subrutina adecuada haga lo suyo.

Bueno, sin mas por el momento, espero a mañana para decirles como fue.

Gracias.

AlexLPD

Espera dame unos minutos que te subo el programa modificado con la libreria que te sugerí.
Bueno incluye la librería sino no funciona.
Si miras la definición de la librería permite cualquier configuración para los switches.
Hola disculpame, no vi tu post me sali temprano y hasta ahora lo leo, es muy interesante el codigo que pones, y entiendo lo de los delays... No es mucho problema 3 o 4 segundos de retraso, mientras el programa efectue el enfriamiento, en ese tiempo la carne no alcanza a ganar ni 0.2°C, por lo tanto no es tan critico...

Ahora me leo tu codigo, y disculpa si hago algunas preguntas obvias, pero en realidad soy nuevo en esto de la programacion, todo lo que se lo he aprendido de internet, y a veces no muy bien aprendido como habras visto, bueno comenzare;


Code: [Select]

#if ARDUINO >= 100   // No entiendo esta seccion, pense que el # era para definir constantes
  #include "Arduino.h" // No sabia que se podian usar funciones .. que hace la libreria Arduino.h
#else
  #include "WProgram.h" //Que es Wprogram.h???
#endif



Usas bytes para que el programa sea mas liviano, me imagino?

Code: [Select]

// DECLARACION DE PINES A SER USADOS EN EL PROGRAMA

const byte SW1 = 2; //pin para leer el switch principal  //
const byte SW2 = 3; //pin para leer el switch principal  //
const byte Term = 4; //Pin para leer el estado del termostato


Esta parte es similar al bounce de la otra libreria, señalamos un pin, declaramos si es INPUT o OUTPUT, y damos un tiempo para el debounce,  Pero por que tienes solo dos booleanas para revisar el debounce, no faltaria una tercera para el tercer pin de entrada?

Code: [Select]

Switch EdoSW1 = Switch(SW1, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity, 100mseg debounce
Switch EdoSW2 = Switch(SW2, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
Switch EdoTerm = Switch(Term, INPUT, HIGH, 100); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
boolean Status1 = false;
boolean Status2 = false;



Code: [Select]

void setup(){

  Serial.begin(9600);
  pinMode(comp, OUTPUT);
  pinMode(sol, OUTPUT);
  pinMode(focoRef, OUTPUT);
  pinMode(focoDes, OUTPUT);

  for(int b; b<4; b++){            //inicia contador de 1 a 4
    pinMode(motores[b], OUTPUT);   //declara cada motor como pin de salida
    digitalWrite(motores[b], HIGH); //Esta parte ya la removi por lo extraño que funciona.


Quote
Ahora lo mas importante. Si todo funciona correctamente hasta acá quiero saber si has eliminado tu problema o no. Me refiero a los comportamientos erráticos que inidicaste al comienzo.
El funcionamiento de arduino en ambiente industrial es mi preocupación Nro 1, justamente por extraer experiencias que ayuden a mi conocimiento.
Efectivamente el conocimiento de que es lo que esta pasando en este caso en particular es oro puro, para futuras experiencias de control industrial.

Por ahora me pasa de que esta funcionando la tablilla, espero que el debounce haga su trabajo correctamente, mañana de cualquier modo pinso ir a primera hora a ver como resulto todo, quiero retirar como ya te comente el HIGH de los relevadores que solo hace ruido. Sobre todo al reinicio ya que como ya te comente, cuando vi que comenzaba a encender y apagar erraticamente todo, pense de inmediato -Ahi esta el ruido- es por eso que por ahora pienso dejar los delay()... ya que si enciendo algo de potencia, como el compresor y sus 4HP, hay una variacion en el voltaje, y necesito que el arduino no este leyendo en ese momento sus pines.

Si todo va bien con esto, tengo planeado agregar 3 deshielos diarios, y una subrutina para que los ventiladores paren totalmente durante la noche, y una vez cada 15 min, alguno de ellos encienda por
digamos 5 min, solo para mantener actualizado el termostato.

La razon de hacer todo esto es evitar la oxidación de la carne por exceso de viento en la camara.

Bueno, desde ya comienzo a trabajar en esa subrutina y te la muestro, para que me digas que opinas.

Muchas gracias por tu colaboracion.  :)

Si el problema se resuelve cuenta con una explicacion mas detallada de cada uno de los sitemas y subsistemas, creo que es algo bastante  interesante.  8)





surbyte

larga respuesta.

No voy a copiar los comentarios anteriores porque quedaría un post muy grande, asi que espero me sigas. Yo iré punto a punto.

1)
Quote
#if ARDUINO >= 100   // No entiendo esta seccion, pense que el # era para definir constantes
  #include "Arduino.h" // No sabia que se podian usar funciones .. que hace la libreria Arduino.h
#else
  #include "WProgram.h" //Que es Wprogram.h???
#endif
Olvidate de esto pero si no lo usamos no funciona bien la librería. ya lo intenté y no hay caso.
Es como una forma de hacer compatibles librerías viejas.

2) Byte lo useo siempre para definir pines de entrada o salida. No hay mas de 0 a 255 valores de piens asi que suficiente con byte.

3)
Quote
Pero por que tienes solo dos booleanas para revisar el debounce, no faltaria una tercera para el tercer pin de entrada?
Las dos booleanes las uso para establecer el valor de Switch que era tu variable con la que luego decides que hacer.
mira que yo sumo lo que leo de SW1 y SW2 y obtengo Switches (tuve que llamarla asi) porque generaba problema el nombre con la librería.

Por lo visto hasta ahi responde mas o menos tus consultas.
Lo que queda y me preocupa es la fuente del arduino.
La fuente del arduino debe tener filtros RFI a la entrada 220VAC y si es posible un nucleo de ferrite con el cable 220 dando vuelta por dentro. Núcleo cilíndrico y hueco por dentro.
si encuentro foto te la incluyo. Sino se compran tambien. Puede ser que para probar encuentres algun filtro en alguna fuente AT o ATX vieja o en deshuso. Sirven como para probar.

Si la fuente de alimentación la armaste tu, entonces un agregado importante es poner en el puente de diodos del secundario capacitores de 0.1 uF en paralelo con los diodos del puente.
Eso genera un camino para los transitorios directamente a tierra.
Son detalles improtantes y hay que evitar que lleguen al arduino.
Mira el post del PLC arduino que esta en Proyectos. Ahi postee una imagen de lo que te estoy comentando.
Servirá a tus necesidades.
NO OLVIDES LA PUESTA A TIERRA EXCLUSIVA para tu ARDUINO. NO agregues nada del sistema eléctrico a esta TIERRA, okay?
Motores su tierra.
Circuito electrico su tierra
Electrónica su tierra.

En un trabajo de un equipo de inspección de ensayo no destructivo tuve una debate con un ingeniero por este tema. El sostenía que una buena tierra para todo era suficiente.
Yo le hice ver el ruido eléctrico que generaban los motores y cuando pusimos tierras individuales desapareció todo. Debate ganado, pero mas importante fue la experiencia cuando vi una pureza en la Computadora cuando tomaba los datos. Fue algo maravilloso.
Entonces recuerda al menos una puesta a tierra de uso exclusivo para tu electronica y nada de compartir con el resto de la parte eléctrica. Soy reiterativo pero es fundamental.


maxid

No se sale del loop, se resetea por RUIDO, y lo digo asi porque es mucho.
Tu fuente no es la mejor, debes agregar muchos filtros antes de alimentar, capacitores grandes y varios de 100nf, 10nf, 1nf.
Las entradas y salidas protegerlas con optos y lo que comande el contator de potencia debe tener varistores y filtros RC para absorver los picos de sobretension originados en las bobinas.


Como prueba rapida coloca un varistor de 30v entre los terminales de las bobinas del contactor (suponiendo se alimentan a 24vca o de 250 si se alimentan a 220vca)
Veras que con eso te llaman cada 8hs y no 4hs
El que pregunta aprende, el que responde aprende a responder.

surbyte

#21
Nov 25, 2014, 07:20 pm Last Edit: Nov 25, 2014, 07:21 pm by surbyte
Es lo que le puse antes

Quote
Re: Mi arduino se sale del Loop (Aparentemente)
#7
Nov 23, 2014, 05:36 am
Tienes ruido, ruido y mas ruido.
Comiena mostrando como son las conexiones al Arduino de todas las entradas digitales.
Contactores EL PEOR DOLOR DE CABEZA.

Todas las consideraciones en la fuente, osciloscopio mirando la tensión de alimentación al arduino.
preparado para one shoot en caso de que haya un transitorio por encima de la tensión que ingresa x el conector VIN o el conector externo.

AlexLPD

No se sale del loop, se resetea por RUIDO, y lo digo así porque es mucho.
Tu fuente no es la mejor, debes agregar muchos filtros antes de alimentar, capacitores grandes y varios de 100nf, 10nf, 1nf.

Las entradas y salidas protegerlas con optos y lo que comande el contactor de potencia debe tener varistores y filtros RC para absorver los picos de sobretension originados en las bobinas.


Como prueba rapida coloca un varistor de 30v entre los terminales de las bobinas del contactor (suponiendo se alimentan a 24vca o de 250 si se alimentan a 220vca)
Veras que con eso te llaman cada 8hs y no 4hs
Debo admitir que el ruido en efecto es de lo mas preocupante, esta instalación tiene motores en una fase, compresores en otra, vitrinas, lamparas led, focos, etc, etc.

Ahora bien, entiendo lo de los capacitores, ahora la fuente es 5V, estariamos pensando en capacitores electroliticos o ceramicos?
sobre la linea del VCC? o sobre VCC y GND? algo recuerdo de haberlo visto en diseño de fuentes, pero no recuerdo bien, tienes algún esquema o algo en lo que me pueda guiar para poder hacer este filtro de fuente.

Lo de los varistores me suena interesante, la bobina de contactores es a 220V... supongo que uno a 250V ira bien, pero... entre los A1 y A2 de la bobina? o entre una fase y tierra?

Muchas gracias por la información.

Yo también pensaría que se resetea el caso es que no se continua el programa.

Por su puesto, los filtros son necesarios, algunos links que me puedas compartir???

Muchas gracias.
-Alejandro Santiago.



AlexLPD

@surbyte, @maxid.

Bueno, el tablero se quedo trabajando ya hace dos dias, y todo perfecto, aunque estoy consciente de que debo agregar un varistor a cada relevador de la tablilla y uno a cada contactor.
Ya me estuve leeyendo ese rollo de los picos de voltaje, y en estos dias pido una caja de varias capacidades, para tener de respuesto, y para futuros tableros.

Muchas gracias por su cooperacion.

Mañana o pasado les posteo un video del tablero en operacion.
 :smiley-grin:

surbyte

Mira a esto me refería con los capacitores en paralelo con los diodos del puente rectificador, que termina alimentando al arduino.
No se con que tensión lo alimentas pero hay que poner un poco de atención a esto.


También debes pensar en usar cables con malla, y la malla unirla a la caja metálica donde esta el arduino, y todo a una tierra exclusiva para la electrónica de control.

Ya te lo comenté antes pero te dije, lo dejamos como último recurso. Se que ahora funciona aparentemente bien, pero yo con tiempo iría haciendo estos cambios, o al menos, el de la puesta a tierra.


maxid

#25
Dec 01, 2014, 02:17 pm Last Edit: Jan 18, 2019, 11:01 pm by surbyte Reason: Visualizacion de imagen
Una buena fuente deberia tener filtro de linea, capacitores en el puente, capacitores electroliticos, grandes y ceramicos e inductancias.
si usas una fuente switching estas traen filtro de entrada, con lo que quedaria por agregar los filtros en la salida.

Aca te dejo 2 ejemplos de lo que te explico.




El que pregunta aprende, el que responde aprende a responder.

surbyte

Usa la fuente de MaxId (fuente multiple 3-3v.jpg ) que esta mejor diseñada, la mia fue de una busqueda rapida.

AlexLPD

Efectivamente aparentemente ya no falla, pero si tiene sus detalles.

Y estando ahí un rato se ven claramente como se "dan el bajón" las luces.

Me imagino que es el ruido ya que no existe otro efecto que pueda afectar asi
al programa.

Por el momento no tengo un osciloscopio para verlo efectivamente, pero
en efecto la fuente switchada no tiene filtros, y al haber una interrupción se puede generar
un corte en el programa.

Fabricare los filtros para usar la misma fuente que tengo, y veremos como se comporta.

Bueno, lo prometido es deuda;

Aqui esta un video cuando el tablero alcanza su temperatura e inicia el subrutina de frio.

https://vimeo.com/113360978


Bueno, pues muchas gracias por los aportes, seguire posteando el progreso con este tablero, hasta que tengamos algo 100% funcional.

-Alex



maxid

Una fuente para estos casos donde al arrancar un motor genera una buena caida de tension es donde debe tener unos 2200uf a 4700uf parece mucho pero eso hace que tenga buen tiempo para recuperarse de una caida incluso de unos segundos.
El que pregunta aprende, el que responde aprende a responder.

AlexLPD

Eso pense yo, una pregunta;
Si a la fuente de poder se le montaran unos ultracapacitores... digamos 4.7F es lo que puedo conseguir de importación... sería suficiente con este filtrado?

Me imagino que los capacitores pequeños estan, para absorber pequeñas variaciones en el voltaje... y por tanto tienen que seguir estando ahi.

Ahora bien... la datasheet del arduino dice que se le alimente de 9-12V DC yo lo estoy haciendo con 5.4V

Puede esto estar generando alguno de los fallos? al bajar el voltaje de linea, bajarian los 5V del estado logico... pero no se... al alimentarlo con 9V... no se calentaria el regulador de voltaje que tiene?

Go Up