Sincronizacion de nodos TCP

Hola a todos! Soy nuevo en el uso de Arduino (vengo de Microchips) y debuto con un proyecto no muy complicado pero con varios detalles técnicos a tener en cuenta.

Estoy construyendo una red de nodos conectados a un servidor por Ethernet para la lectura de sensores de forma remota. Para los nodos monte un Arduino UNO más Ethernet Shield más un sensor (MPU-6050 midiendo inclinación, aunque la idea es que envíe todo tipo de datos). El server es Windows 7 + labview configurado en Cliente(Arduino)/Servidor(PC). Gracias a los ejemplos de este sitio todo funciono de maravilla. La conexión TCP/IP es hermosa y los datos del sensor llegan intactos. El problema es el típico (luego de leer mucho me entere que es “típico”) en redes de nodos remotos, la sincronización de los datos recibidos. La red TCP es de latencia variable por lo que los datos de los distintos nodos no llegan al mismo tiempo, llegan desincronizados entre sí y para sensores tipo acelerómetro o sonido esto es un problema. Le sume a la trama de datos un TimeStamp basado en el reloj interno del arduino (millis()) y mejoro la sincronización a corto plazo, pero los relojes oscilan distinto y al tiempo obtengo deriva.

Pregunta, alguien conoce algo del tema? Sabe alguien que puedo implementar para que sincronizar los relojes internos de los Arduinos y así que los datos recibidos tengan la misma base de tiempo?

Muchas gracias a todos y saludos..

Si miras lo que hace National Instrument para sincronizar sus dispositivos de hardware comprenderás que estas en una meta no se si imposible pero casi.

Se que NI lo hace usando un pulso de sincronismo entre sus dispositivos pero aca no tienen enlace físico asi que que te queda? Tormenta de ideas: 1. sincronizar por NTP? servirá no se.. es aleatorio por mas que le pidas que lo haga con regularidad. 2. usar el timestamp de un gps (entiendase reloj atomico del satelite gps). tampoco se si será viable o práctico ademas de agregar costo a tu nodo.

Que precisión requieres?

Estoy midiendo inclinaciones con periodos de 2 o 3 segundos. Si utilizo una red propia con un solo switch y le sumas retardos de la PC, el resultado es mas que aceptable. El problema es si me sumo a una red publica y si, para colmo, usas algún bridge Wifi estas muerto. Las latencias alcanzan los 200ms y el problema es que al machear los datos se pierde precisión. Desincronizaciones menores de 100ms ya dan resultados aceptables. La idea seria intentar alcanzar la sincronización perfecta para que sea apto de usar en cualquier tipo de red y hacer más útil y flexible el sistema, de ultima si no lo alcanzo, mejoro la red y las latencia y santo remedio. Red publica=barato, red privada=tirar cable, switch=costoso.

Muchos problemas tengo con equipos NI USB baratos que no tienen sincro. jaja, en general sincronizo por soft con el Labview, pero siempre con señales cíclicas, es imposible con otro tipo de señales.

Pense experimentar con NTP. El problema que tengo es que la Lib de Ethernet + Lib MPU6050 = 90% de flash del arduino uno ocupado.. mmmm poco puedo hacer.. igual voy a probar a ver que sale. GPS. Imposible, no tengo cielo abierto, tendría que usar antena externa y son 8 nodos. Voy a ver de pasar el tiempo por la red a ver que pasa. Intentare sino sincronizar por software de algún modo que se me ocurra.

Que te parece?

Y que tal un sincronismo por RF, enviar un pulso de sincronismo digamos, a la cuenta de 3 2 1 MARCA y todos sincronizados? Sigo tirando ideas. La viabilidad de cada uno es discutible.

Cuando hablaba de NI no hablaba de los baratos sino de los compaqRIO o signleRio pero ya sabes es National Instrument y son palabras mayores. Yo creo que una sincronización via RF podria darte esa marca en la que todos queden mejor que 100mseg. La idea es que ese pulso de RF sea realmente un burst codificado que ayude al decodificarlo descartar interferencias.

Que opinas? Idem si tienes visión optica podria ser un enlace IR con repetidores si hicieran falta para alcanzar habitaciones que no tengan un camino óptico recto.

También podria ser con nRF24L01 y ya tienes mas rango.

Buscando en Internet encontré este post

La mejor idea me pareció esta reloj con DCF77

Estos son los relojes que se ponen en hora con el reloj atómico aleman. Lo que no se, si esta disponible en cualquier parte del mundo o en tu ciudad. Bueno que mejor que responder a la pregunta que uno mismo se hace. Son ondas largas de radio a 25 mts de modo que esta disponible en todo el mundo.

Aca un buen tutorial DCF77

Lo del DCF77 lo vi y me gusto, voy a investigar.. Por RF creo que es mas fácil de sincronizar, vi varios proyectos de nodos con sistemas de sincronización ingeniosos, igual me gustaría indagar más en algún tipo de protocolo por Ethernet, ya sea NTP o algún otro que encuentre. El poder depender solo de la red Ethernet haría que el sistema funcionase en cualquier lado y bajo cualquier condición lo cual es la meta. Seguire investigando por estas líneas y veré a donde llego.. te mantendré al tanto..

Saludos! PD:En la segunda parte del proyecto conectare cuatro chasis CompactDAQ también vía Ethernet, pero ya no necesito tanta sincronización, igual confío que los CompacDAQ no me den muchos problemas.. pero esto va otro foro, no? jaja

Si.. eso si o si va en national instrument o labview forum. Cierto es que uno busca una solución de aplicación simple, pero a veces no es posible. Sinceramente no se que sincronización puedes lograr po NTP pero sería la solución de mas fácil implementación. Yo dedicaría un tiempo a probar su eficacia a ver si te pone dentro de los 100 mseg deseados. Sino por orden seguiría por DCF77 o bien por RF.

Hombre no se si es lo que necesitas pero otra opcion es montar un RTC un reloj del alta precision, no me refiero al tipico ds1307 que se desvia mucho, me refiero a este: http://www.maximintegrated.com/en/products/digital/real-time-clocks/DS3231.html Al DS3231 en cuyo datasheet se describe asi: DS3231 Extremely Accurate I²C-Integrated RTC/TCXO/Crystal O sea reloj extremadamente preciso La precision es de:

Accuracy ±2ppm from 0°C to +40°C -- version comercial - se podria desviar como maximo 2 segundos cada 11 dias y medio

Accuracy ±3.5ppm from -40°C to +85°C -- version industrial - se podria desviar como maximo 3,5 segundos cada 11 dias y medio

O algun reloj incluso mas preciso, esta claro que cuanto mas tiempo pase mas se desviarian, peeero usar los RTC y sincronizarlos dos veces al dia por NTP te daria la precision que necesitas.

Es decir ese RTC se desvia 100ms cada 13,5 horas(2ppm) con que sincronices por NTP cada 12 horas (2 veces al dia) te mantienes siempre por debajo de una desviacion de 100ms. Y te ahorras tener que sincronizar por NTP para cada medida, que ademas fallaria casi seguro, asi solo necesitas sincronizar por NTP 2 veces al dia algo que si es facil.

Espero que te sirva

Una lastima, cuando hice la lista de compras para este proyecto compre cuatro DS1307 "por las duda", en ese momento era el único que tenía el proveedor. Ahora mi el sitio y tienen el DS3231 casi al mismo precio. Lo agendo para la próxima compra.

Voy a ver si puedo funcionar sincronizando por software, sino, hare lo que hacen las grandes empresas del rubro, sincro por cable.. Muchas gracias!