Go Down

Topic: Se pierde la conexion con arduino (Read 2397 times) previous topic - next topic

marce_au

Mar 02, 2017, 08:20 pm Last Edit: Mar 21, 2017, 03:26 pm by surbyte
Hola

Hice un proyecto con Arduino UNO, el cual recibe unos pulsos por los puertos analogicos A0 y A1, el cual cuando se reciben, dependiendo de que puerto lo recibe, envio una señal a la PC.

En la PC, hice una aplicacion con Delphi, la cual al recibir la señal del Arduino genera una etiqueta y guardo unos datos.

El problema es que despues de estar trabajando mas de 3 o 5 horas, pierde la comucicacion con el Arduino, y la unica forma de volver a establecer la comunicacion es, cerrando la aplicacion y desconectar el USB del arduino y conectarlo nuevamente. Despues de esto sigue funcionando normalmente.

Cualquier consego o comentario Gracias.

surbyte

#1
Mar 03, 2017, 12:07 am Last Edit: Mar 03, 2017, 12:08 am by surbyte
Hola marce_au, bienvenido al foro Arduino.

No has puesto el código y eso me hace pensar que tampoco has leído las normas. Si lo hubieras hecho verías lo importante que es en este caso.
Mi primera suposición es que te estas quedando sin memoria.
La segunda es que por alguna razón tu arduino se tilda, producto de algun problema en la linea electrica.

Veamos cuando pongas el código si estas consumiendo o no mucha RAM. Si no lo estas haciendo deberemos descartar este problema.

Una posible solucion sería agregar un watchdog. El watchdog o perro guardián vigila que arduino funcione, si no lo hace lo reinicia solo.
Eso no resuelve la causa pero te permite seguir trabajando.

Investiga en google : Arduino watchdog como este link: Cómo utilizar Watchdog con Arduino


Podrias agregar unas líneas en el setup que enviaran algo a tu aplicación Dephi para monitorear las veces que se reinicia. Y ver que tan frecuente es el problema y estar atento a que ocurre en tu entorno también.

marce_au

Muchas gracias surbyte, intentare ser claro.

este es el código de Arduino:


Code: [Select]



String inputString;
const float maximo = 4.5;
int sensor0 = 0;
int sensor2 = 0;
int sensor4 = 0;
int inicio = 0;
float voltaje0 = 0.0;
float voltaje2 = 0.0;
float voltaje4 = 0.0;
int reset2 = 0;
int imprimio = 0;


void setup() {
  Serial.begin(9600);
}


void loop() {

  sensor0 = analogRead(A0);
  sensor2 = analogRead(A2);
  sensor4 = analogRead(A4);
 
  // Convierto la lectura analogica (la cual va desde 0 - 1023) hacia un voltaje (0 - 5V):
  float voltaje0 = sensor0 * (5.0 / 1023.0);
  float voltaje2 = sensor2 * (5.0 / 1023.0);
  float voltaje4 = sensor4 * (5.0 / 1023.0);

  if (voltaje0 > 3.5 ){
    Serial.print("1");
    inicio = 1;
    delay(100);
  }
  if (voltaje2 > 3.5 && inicio == 1){    /*Entra a Impresion*/
       Serial.print("2");
       inicio = 0;
       delay(2000);
  }

 
  if (voltaje4 > 3.5 && inicio == 1){
        Serial.print("3");
        inicio = 0;
       delay(2000);
  }
 
 
  delay(10);



y asi es como recibo la señal en Delphi


Code: [Select]

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  numero : integer;
  recibido : string;
  DatoRecibido : string;
begin

  {===============  Recibe Datos de la Tarjeta Arduino ================}

  numero := comport1.InputCount;
  comport1.ReadStr(recibido,numero);      {Recibe la señal de Arduino}
  memo1.Text:= memo1.Text + recibido;     {La Transfiere a un Campo Memo}

end;



La señal que envia el Arduino solamente es un  "1" o un  "2" o un "3", los cuales son solamente banderas para generar una etiqueta cuando pasa la prueba o guardar el dato de rechazado.

Muchas gracias por tu ayuda

marce_au

Hola

Omiti comentar que la comparacion que los pulsos que recibe son de 5V. Y por problemas con el ruido,
es por eso que hago la condicion " if (volPuerta > 4.5) ".

surbyte

Es un codigo chico. La unica observación que te hago es esta
Code: [Select]
String inputString;

no usas inputString asi que tienes dos caminos o lo inicializas asi
Code: [Select]
String inputString = "";
o lo comentas

Code: [Select]
// String inputString;

marce_au

#5
Mar 21, 2017, 04:10 am Last Edit: Mar 21, 2017, 03:27 pm by surbyte
Primeramente disculpa todo este tiempo que no di rastros de vida.

Espere para saver que resultados me daba con las recomendaciones que me diste, pero se sigue prensentando el error. De hecho se presentan diferentes errores. Pero el ultimo que se esta presentando es el sigueinte:

"Error al configurar los parametros del puerto serial: 9,600 N 8 1"

Tambien estoy llegando a pensar que el problema es que puede haber mucha electrostatica o Ruido, ya que se encontraba en una caja donde habia algunos relays.

ya lo saque y fue que me di cuenta que esta mandando ese mensaje. Lo mas curiso es que uno de los equipos que estan instalados de la misma manera, no genera este error y en dos semanas de prueba solamente se ha presentado el problema dos veces.

los equipos que estan recibiendo las seales que envia el arduino son Dell Optilex 780 Core 2 Duo con 2 Gb RAM y 160 HDD.

Nota: no he utilizado el Watchdog, porque normalmente se hace una prueba cada 30 0 45 seg. pero en ocaciones tardan hasta 5  minutos, por lo tanto se estaria reiniciando varias veces antes de mandarle una seal.




surbyte

#6
Mar 21, 2017, 03:57 pm Last Edit: Mar 21, 2017, 04:00 pm by surbyte
Bien, tenemos problemas de ruido. Que hacer entonces?

En la fuente de tu arduino puedes hacer varias cosas que mejorarán el comportamiento.
Si tienes una PC vieja de las que estaban bien armadas puedes conseguir ahi o bien lo compras un FILTRO RFI o filtro EMI.
Asi lucen en aliexpress




Es una combinación de capacitores e inductores formando un filtro que rechaza todo lo que no este a la frecuencia de trabajo de tu red.

Otra cosa sería poner en el puente de diodos de la fuente (esto ya requiere que desarmes la fuente) un capacitor de 0.1uF 50V con cada diodo del puente. Ahora si el puente es integrado, será dificil. Es fácil cuando ves los 4 diodos 1n400X

Coloca tmb el arduino si te es posible en una caja metalica mallada.

marce_au

#7
Mar 21, 2017, 11:03 pm Last Edit: Mar 24, 2017, 03:32 am by surbyte
Muchas gracias.

Veamos, El arduino envia la señal a la pece por medio del cable USB y de ahi recibe la energia con la que trabaja, pero recibe las señales desde unos relays, entonces yo hice esto para poder hacer mi proyecto.

te envio una foto.

la placa que hice es para poder poner unos reguladores y no me quemaran mi arduino, porque al principio me mandaban mas de los 5 volts que yo les pedi, y tiene unos leds para verificar que lleguen las señales, con sus respectivos resistencias.

Pero el filtro lo voy a poner en la fuente de poder de la PC?

Disculpa mi ignarancia, lo poco que se de electronica lo he aprendido en google y preguntando.


marce_au

#8
Mar 23, 2017, 05:39 pm Last Edit: Mar 24, 2017, 03:42 am by surbyte
Veamos, El arduino envia la señal a la pece por medio del cable USB y de ahi recibe la energia con la que trabaja, pero recibe las señales desde unos relays, entonces yo hice esto para poder hacer mi proyecto.

te envio una foto.


la placa que hice es para poder poner unos reguladores y no me quemaran mi arduino, porque al principio me mandaban mas de los 5 volts que yo les pedí, y tiene unos leds para verificar que lleguen las señales, con sus respectivos resistencias.

Pero el filtro lo voy a poner en la fuente de poder de la PC?

Disculpa mi ignorancia, lo poco que se de electrónica lo he aprendido en google y preguntando.

surbyte

Bueno necesito que te pongas a dibujar como puedas como estan conectadas las cosas para poder entender mejor todo.
Si no te mal entiendo, usas algun regulador de 5V para leer tensiones mayores que provienen de los reles.

Lo que no se es si lo que esta registrando el arduino son tensiones de los reles que se estan activando por otra maquina que tu debes monitorear Si es asi, tendriamos que cambiar esas interfaces.

Solo especulo porque no tengo claro tus conexiones.

Go Up