Arduino Uno + Placa Reles 12vdc - 220Vac + C#, rompe la comunicación serial

Hola,

Bueno en principio no se solucionó el problema del todo, lo voy a explicar. Lo primero que hice fue conectar los varistores y medio blindé la parte de media tensión con la de baja tensión como me indicó el amigo Maxid, el resultado fue bueno pero no perfecto. Ya no se perdía la comunicación por serie pero el ruido en algún momento dado modificaba el valor de los sensores y estos llegaban con un formato incorrecto a mi aplicación C#.

Lo que hice y recomiendo fue como me dijo el buen amigo Maxid, separar completamente la parte de media tensión y baja tensión, no he posteado antes por eso porque me costo lo suyo separar el arduino de la placa de relés. Lo separé todo en dos cajas y hecho de momento llevo 72 horas sin interrupción por lo que el problema parece estar solucionado y si no lo esta del todo y dentro de unos días me falla de nuevo será porque sigue llegando demasiado ruido y puedo asegurar que el problema es ese porque jamas había durado tanto tiempo sin fallar.

He aprendido una buena lección, doy las gracias y reconozco que la distribución de mi proyecto era una gran chapuza, ahora esta limpio, bien cableado y bien separado y el resultado se ha notado enseguida.

No pongo el título como solucionado todavía porque prefiero esperar una semana entera en funcionamiento y asegurar que el problema está 100% resuelto.

Muchas Gracias.
Saludos.

Ahora yo iría por el lado del PC, no se como tenes configurado tu programa para que lea el puerto, pero aveces parece que está colgado, pero es un problema de sincronismo, cuando se lee permanentemente el puerto si perdes un bit , se queda esperando el stop y ya no recibis nada.
Te comento como solucioné este inconveniente, primero tu pc deberia enviar un caracter llamemoslo 'a' para solicitar datos al arduino. Si arduino recibe 'a', envía la trama de datos, digo trama porque debes tener un encabezado + bloque de datos + checksum, si los datos recibidos tienen el checksum correcto lo tomas sino vuelves a pedir los datos.
A todo esto lo debes hacer cada cierta cantidad de segundos, si en ese periodo no llegan los datos, o no terminan de llegar la cantidad de bytes esperados, descartas el paquete o reinicias la librería de comunicaciones. Es como un watchdog del lado del pc. Ten cuidado de solapar llamadas, no pidas un nuevo dato si no terminó de llegar el anterior, eso puede ocasionar tu falta de recepcion.
En muchas oportunidades según el método de conexión al puerto es necesario hacer flush para limpiar el buffer y no quede basura.

Bueno, espero no te asuste todo lo que te menciono. jijijiji

Hola,

No gracias esta es la parte que mas controlo, como decía soy mas bien programador y de electrónica... pues 0,1 por no decir 0 aunque ya le voy pillando un poco la idea.

Tengo un objeto (clase, método... como queráis llamarle) que comprueba cada uno de los valores que recibo si no recibo bien, hago un serial flush, espero un segundo y vuelvo a pedir los datos de momento llevo 80 y pico horas si un solo error ni en datos de sensores ni en la comunicación serial, ni tampoco con el encendido o apagado de hardware (a traves de los reles)

Pero igualmente me ha gustado tu planteamiento y voy a modificar mi validador para basarlo en el checksum de cada sensor.

Es importante validar el formato de los datos que recibimos del sensor porque a veces el cheksum devuelve correcto pero por ejemplo el DHT11 se descalibra fácil y da valores desorbitados como p.e 235% de humedad... y eso puede joderlo todo....

muchas de nuevo Maxid
Saludos.

no quiero ser pesado, te doy otro consejo.
Usa valores puros, no los calcules en el arduino, envia directamente lo que te da el conversor y juegas en la pc con la resolucion. Tambien puedes enviar valores decimales como enteros, esto te ayuda al envio de datos, por ejemplo enviar 154,34 lo pasas como 15434 y lo divides en 100 en la pc.
Ahorras byte un entero son pueden ser 2 bytes y un float entre 4 y 6.
Y usa velocidades bajas si son pocos datos con 9600 baudios sobra.

Hola,
pues justamente eso hago, envío el numero sin decimal y en mi programa del pc lo divido, también utilizo ese rate de baudios porque he probado con mas velocidades pero como mas fino va es con 9600

por cierto si esto es ser pesado... sigue siendo todo lo pesado que quieras jaja

A ver si pulo todo y os muestro el proyecto entero porque esta bastante chulo la verdad, lo controlo todo desde una aplicación de escritorio con c# como ya sabéis, por interfaz web todo hecho con php, ajax y jquery, y desde smartphone (con app nativa en java)
Tanto para leer los datos de los sensores, como para interactuar con los reles.

así que a ver si voy puliendo y en breve os enseño en el foro adecuado mi proyecto.

Gracias de nuevo Maxid.
Saludos.

Hola, bueno pues sigo igual con el mismo problema, me he decidido a hacerle el circuito RC a cada relé y ya tengo todo, porque con los varistores y separando la baja tensión de la red conseguí alargar el error.

Lo único que no entiendo muy bien es en el esquema que me has pasado Maxid, veo que la resistencia esta en serie con el capacitador y el varistor ¿es correcto? ¿o debería ir en paralelo?, una patilla de la resistencia a la entrada de tensión antes del relé y otra a la salida de tensión después del relé?

Muchas Gracias.
Saludos.

es un circuito RC serie. sirve para absorber energia. No es un filtro paso bajo-alto.

Van en paralelo a los contactos del rele, te hago un dibujo.
Puedes tener ruido en la fuente de alimentación, arduino tiene filtros minimos, deberias poner un capacitor de 1000uf en la fuente y de desacople de 100nf. Esto puede traerte falso reset, y el micro no se inicializa correctamente.
Pero creo que el problema ya no viene por los reles, se me hace que es de soft, porque si no tenes demasiadas repeticiones no deberia colgarse. Fijate los bucles, y que no pidas memoria que no tenes.
Yo pondria un led testigo para saber si realmente esta colgado, en cada bucle activas y desactivas el led. Porque aveces parece estar colgado pero no lo es.
Tu soft sigue pidiendo datos y los leds de la cumincacion parpadea almenos la recepcion? en el uno la comunicacion la lleva otro micro.

filtrorele.png

Hola,
los únicos datos que arduino me da son los datos de 9 sensores (2356~2020~3000~2300~800~400~200~820~960~) cada 15 segundos... luego lo único que hago es enviar caracteres sueltos, "b" enciende rele1 "c" apaga rele1
y es todo programable por minutos, osea que no se hacen muchos envíos de datos a arduino. Envío carácter a arduino como unas 3 o 4 veces por hora.

ademas lo he comprobado sin conectar la tensión de red a los relés y funcionó durante 5 días sin ningún problema.

No había hecho el circuito RC solo había probado con los varistores en paralelo y separando arduino y la placa de relés en dos cajas.

He probado con fuentes diferentes y pasa lo mismo.

Mira este es el cricuito rc que he hecho a ver si te parece correcto, por detrás el circuito es exactamente igual al esquema.

PD: el tornillo del medio del conector es nulo.
PD2: Los leds dejan de parpadear cuando se cuelga y solo lo salva desconectar y conectar el usb, si reinicio desde el botón sigue la comunicación serial caída.

Gracias.
Saludos.

mmm, proque no evitas el usb? usa un adaptador usb-ttl y usas los pines tx rx del arduino, y salteas el traspaso de micro a micro.
el filtro está bien.

ejemplo del aparatito. http://www.ebay.com/itm/USB-2-0-to-TTL-UART-6PIN-Module-Serial-Converter-CP2102-/290803061413?pt=US_Drive_Cables_dapters&hash=item43b53692a5

Si no te molesta postea el codigo y vemos entre todos que puede tener el codigo. Puede estar colgada la comunicacion y no el micro. Por eso te digo de poner un led dentro del loop()

Otro problema puede ser que el pc ahorre energia en el puerto, puedes deshabilitar el ahorro de energia en los puertos.
No alimentes el sistema desde el usb.

Hola,

Mira he visto este adaptado USB to TTL cp2102 bastante mas barato:

http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=121109966311#ht_4168wt_1388

¿Es lo mismo no?

¿La fuente de alimentación si utilizo una de Pc? ¿se supone que son muy buenas no?

Es muy posible que el micro no se cuelgue y solo la comunicación serial porque, solo con desconectar el usb y reconectarlo es suficiente, no me hace falta ni reiniciar el arduino ni desconectarlo de la fuente externa ni nada.

De hecho ni eso simplemente me meto en el administrador de dispositivos, deshabilito arduino y lo vuelvo a habilitar (que es lo equivalente a desconectar y conectar el usb físicamente)

Pero me hace dudar que sea por tema de programación porque como te dije solo pasa cuando hay tensión 220V en los contactos de los relés si no hay tensión en los reles no se cuelga.

Yo creo que es por el ruido que genera la red a 220v. No he podido probarlo todavía con el circuito rc, pero yo creo que lo suyo sería probar este fin de semana con los circuitos rc conectados a cada relé y a ver que pasa.

Cuando llegue el adaptador usb to ttl lo cambiaré directamente.

Ahora mismo estan los reles y los enchufes a 220v separados en una caja distribuidora, y el arduino con los sensores en otra caja. Las dos cajas están conectadas entre si por los cables que activan los relés desde arduino.
¿
Esto ya no debería dejar pasar ruido? ¿o puede seguir colándose?

lo reconozco soy muy chapuzas, mas que nada porque no conozco ni el 50% de las posibilidades que hay en electrónica, entonces esto reduce la optimización de mis análisis electrónicos.
a ver si me da tiempo hoy a hacer todos los circuitos rc bien hechos.

Maxid, lo de siempre... muchas gracias.
Saludos.

espadarrota:
Hola,

Mira he visto este adaptado USB to TTL cp2102 bastante mas barato:

http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=121109966311#ht_4168wt_1388

¿Es lo mismo no?

Claro, es de ejemplo, compra cualquiera que te de señales TTL 5v.

espadarrota:
¿La fuente de alimentación si utilizo una de Pc? ¿se supone que son muy buenas no?

Si son buenas, no deberias tener problemas por este lado

espadarrota:
Es muy posible que el micro no se cuelgue y solo la comunicación serial porque, solo con desconectar el usb y reconectarlo es suficiente, no me hace falta ni reiniciar el arduino ni desconectarlo de la fuente externa ni nada.

De hecho ni eso simplemente me meto en el administrador de dispositivos, deshabilito arduino y lo vuelvo a habilitar (que es lo equivalente a desconectar y conectar el usb físicamente)

Eso me hace pensar que es del lado del pc con los puertos.

espadarrota:
Pero me hace dudar que sea por tema de programación porque como te dije solo pasa cuando hay tensión 220V en los contactos de los relés si no hay tensión en los reles no se cuelga.

Yo creo que es por el ruido que genera la red a 220v. No he podido probarlo todavía con el circuito rc, pero yo creo que lo suyo sería probar este fin de semana con los circuitos rc conectados a cada relé y a ver que pasa.

Cuando llegue el adaptador usb to ttl lo cambiaré directamente.

Ahora mismo estan los reles y los enchufes a 220v separados en una caja distribuidora, y el arduino con los sensores en otra caja. Las dos cajas están conectadas entre si por los cables que activan los relés desde arduino.
¿
Esto ya no debería dejar pasar ruido? ¿o puede seguir colándose?

lo reconozco soy muy chapuzas, mas que nada porque no conozco ni el 50% de las posibilidades que hay en electrónica, entonces esto reduce la optimización de mis análisis electrónicos.
a ver si me da tiempo hoy a hacer todos los circuitos rc bien hechos.

Maxid, lo de siempre... muchas gracias.
Saludos.

Mira el ruido electrico en bastante problematico, pero con estas medidas deberia mejorar, y lo ha hecho hasta ahora. las fuentes de pc traen filtro de linea, por lo que la alimentacion está libre de ruido.
Lo que me confunde es que tenes problemas cuando está conectado a la red. como si tuviera induccion.
Prueba de invertir los cables de la red y toca con un buscapolo en las placas para ver que no sea que se está filtrando algo.

Este buen artículo habla de los ruidos.

Hola,

Gracias voy a leérmelo.

Bueno he montado todos los filtros en cada relé y es curioso en uno me quema la resistencia (47ohm), la reemplazo y la vuelve a quemar.
Quizás un fallo de la placa... no lo se...

Lo mas raro es que ahora en los contactos NA siempre tengo entre 0 y 1 V como es posible? el ventilador mas potente no lo activa pero la bomba de agua si que se enciende y el ventilador pequeño también se mantiene en marcha bajando mucho su potencia pero siempre se quedan en marcha.

¿a que puede ser debido?

Muchas Gracias.
Saludos.

Prueba con un capacitor de .047 x 600 y 47r

Quizas este thread te ayude. Se hablo de algo parecido hace algun tiempo:

http://forum.arduino.cc/index.php?topic=101214.msg759449#msg759449

Pues efectivamente ha de ser eso porque tengo un ventilador extractor de cocina cerca y cuando lo pongo todo alejado funciona sin cortarse aunque tenga red en los contactos del relé.

a ver si para este fin de semana puedo hacer pruebas de nuevo he cambiado varias cosas y a ver si puedo probar con arduino lejos de los componentes.

Saludos.