rastrear objeto

Hola a todos, me gustaría diseñar un sistema para detectar en tiempo real donde se encuentra mi mascota dentro de la casa (específicamente la sala).

Como es un entorno pequeño (5m x 5m) la precisión de un gps no es suficiente quisiera que fuera del orden de cm, pensaba en hacer una especie de gps pequeño en casa colocando tres parlantes ultrasonicos y sujeto a la mascota un microfono con el procesamiento (detección de tiempos de arribo similar a como se detectan los epicentros de sismos), sin embargo, creo que conseguir parlantes por encima de las frecuencias que escucha un perro estaría complicado, también he pensado en algo similar pero con ondas electromagnéticas y detectando niveles de potencia en vez de tiempo de arribo, otra opción seria usar un acelerometro en la mascota he intentar ir llevando la posición integrando dos veces las señales del acelerometro con algún tipo de puesta a 0 en su nido por si la integral se desvía mucho.

quisiera saber que opinan cual opción es mas viable, o si de pronto se les ocurre algún otro método.

Gracias.

Si lo consigues avisame!! Se entiende la ironía no?
Lei algo de un sistema hecho con BT actuando como beacom o faros, pero nada que pueda hacerse DoItYourself (nada fácil).

Si tengo a mano el link te lo paso.

Yo tengo a medias un proyecto semejante, aunque no para una mascota si no para poder situar pequeños robots en un espacio confinado, incluso desarrollé las bases matemáticas para calcular la posición por el denominado "sistema de enrejado hiperbólico", basado en la diferencia de tiempos de recepción de señales sincronizadas.

Partí de la idea del antiguo Loran C, un sistema de posición por radio de onda larga que en el Mediterráneo funcionó hasta mediados de los 90, y que aún tuve ocasión de utilizar brevemente por esta época...

La emisora master, la que establecía el inicio de la cadencia de señales era la de Sellia Marina, al sur de Italia, y las esclavas que tras un tiempo determinado emitían en secuencia, eran Estartit, en España, En la isla italiana de Lampedusa, cercana a Túnez, y la estación turca de Kargaburun...

Las señales LORAN C tenían la siguiente secuencia...

...Aunque en mi caso, de estos datos sólo tomé la idea general. La delimitación del área de cobertura no se trataría de una figura irregular, como era la cadena de Loran C del Mediterráneo, si no de un cuadrado, con un mínimo de tres emisores (porque necesitamos al menos 2 diferencias de tiempo), aunque serían mejor cuatro, que permitiría un sistema de compensación de ciertas desviaciones provocadas por cambios en la velocidad de las señales.

...Para distancias tan pequeñas (yo lo calculé para un cuadrado de 4x4 metros), es naturalmente mucho mejor utilizar ultrasonidos, porque señales de radio obligarían a una gran velocidad de conteo y circuitos de muy alta velocidad de respuesta, con un hardware sólo al alcance de técnicos expertos en radar, y muy difícil de poner a punto. Para discriminar 1 cm. con señales de radio sería necesaria una resolución de 3,3 x10^-11, si no me equivoco, 33 pSeg (picosegundos). Con ultrasonidos en cambio es de 29,1 uSeg (878.000 veces menos) , con lo cual entramos en el margen de señales que puede crear y manejar directamente un Arduino UNO.

La frecuencia también está clara, 40 Khz, donde podremos usar los transductores de los típicos módulos de proximidad HC-SR04, aunque naturalmente será necesario estudiar antes el tema de la direccionalidad para adaptarla a nuestras necesidades... para ello comencé algunas pruebas...

Con este simple montaje comprobé los lóbulos de emisión y recepción de los transductores, así como la transmisión y amortiguamiento de los ultrasonidos...

Con el receptor fijo y el emisor móvil, variando el ángulo entre ambos, obtuve la siguiente curva basada en la señal de escala lineal medida en el osciloscopio...

Continuará...

Llorens

Mi primer planteamiento utilizaba sólo 3 emisores, formando un triangulo equilátero. Lo llamé UPP (Ultrasonic Pulse Position), con emisores de ultrasonidos E1, E2 y E3 en los vértices. Los pulsos estarían formados por frames de 5 ciclos de 40 Khz y la cobertura teórica mínima sería el círculo que engloba dicho triángulo...

El proceso sería el siguiente:
1 ) El emisor E1 emite un frame de 5 ciclos de 40 Khz, con una duración de 125 uS.
2 ) Pausa de separación de 10 mS
3 ) El emisor E2 emite el mismo frame
4 ) Pausa de separación de 10 mS
5 ) El emisor E3 emite el frame
6 ) Pausa de separación de 10 mS
7 ) El emisor E1 vuelve a emitir el frame
8 ) Pausa de sincronismo de 32,7 mS
9 ) Se repite todo el ciclo

Toda esta secuencia cíclica estará generada por un único Arduino utilizando el Timer1, sin ninguna instrucción en el "loop()"

El receptor, equipado con otro Arduino, y situado en cualquier punto dentro del círculo que engloba los emisores recibirá los frames en secuencia E1, E2, E3 y E1, sin que por tiempo de transmisión nunca puedan cambiarse el orden o solaparse. El receptor deberá guardar el valor de tiempo absoluto en microsegundos del flanco del primer ciclo de cada frame.

La secuencia de captura también estará controlada por Timers, pero una vez obtenidos los tiempos desconectará la recepción y en el "loop()" calculará las diferencias E2-E1, E3-E2, E1-E3, datos que mediante cálculos de curvas hiperbólicas deberían permitir al receptor calcular sus coordenadas relativas a cualquiera de los emisores.

Continuará...

Saludos

Anilandro:
Mi primer planteamiento utilizaba sólo 3 emisores, formando un triangulo equilátero. Lo llamé UPP (Ultrasonic Pulse Position), con emisores de ultrasonidos E1, E2 y E3 en los vértices. Los pulsos estarían formados por frames de 5 ciclos de 40 Khz y la cobertura teórica mínima sería el círculo que engloba dicho triángulo...

Muy interesante post. Solo una sugerencia de carácter practico. Si solo quieres localizar un objeto (o unos pocos) seria mas practico que sea el objeto el que emita el pulso, a diferencia de sistema Lorean en este caso es factible alambrar los receptores a un arduino maestro que, mediante interrupciones, tome el tiempo de repuesta de los diferentes receptores "tontos" que emitan un pulso cuando le llega la señal del objeto, no seria necesario coordinar los diferentes arduinos.

En el Loran C los transmisores eran en efecto individuales, ya que estaban separados miles de kilómetros entre ellos, pero en el sistema que he pensado no hay diferentes arduinos para cada emisor, sólo hay uno "master" con los tres o cuatro transductores alambrados y fijos, y naturalmente otro arduino en el receptor móvil. Además, la ventaja de que el móvil sea el receptor es que él directamente calculará y conocerá su posición, lo cual es fundamental para que un robot u objeto móvil pueda guiarse. En caso de que el emisor sea móvil y el receptor fijo, una vez calculadas las coordenadas deberían transmitirse al móvil...

En estos sistemas hay un detalle fundamental que utilizaban tanto el Loran como otro sistema de cobertura mundial que se llamaba Omega, que no puede haber un solo impulso emisor porque en distancias sensiblemente iguales a los emisores o receptores existiría superposición, hecho agravado porque los impulsos han de tener una cierta anchura, contener unos ciclos mínimos que permitan tanto su reconocimiento frente a otras señales, como una vez rectificados y filtrados conseguir una señal de amplitud mínima para ser utilizada, eso sin contar que en caso de utilizar filtros LC, estos han de "arrancar" con los primeros ciclos venciendo su propia amortiguación...

Saludos

Llorens

En mi primera aproximación al tema con un "campo" en forma de triángulo equilátero, puse en marcha una versión del programa de generación de trenes de impulsos ultrasónicos El programa es simple y funciona con el Timer-1 del Arduino, controlando 3 transductores que emiten en secuencia 4 trenes de pulsos de 40 Khz...

...Enlace a la imagen a tamaño visible...

La secuencia ISR es: el Emisor1 emite un frame de 5 ciclos a 40Khz, luego espera 10 mS. Luego el Emisor2 emite otro frame igual y espera 10 mS, el Emisor3 emite su frame y espera 10 mS, y finalmente el Emisor1 vuelve a emitir un frame y se espera 32 mS, reiniciando el ciclo...

Esta ISR no es demasiado compleja y la parte que tiene que ir rápida (cada 12,5 uS) tiene solamente tres instrucciones, así que cumple con el principio de brevedad. El resto va a 10 y 32,7 mS, y también le sobra tiempo para operar...

Continuará...

Saludos

La puesta a punto de este programa hubiera sido muy difícil sin disponer de un analizador lógico Saleae, (en realidad un clónico del Saleae que se vende por 8 €) porque al principio ha costado que las señales salieran bien. En la imagen se ven los 5 ciclos de de 40 Khz de un "frame" ampliado, en concreto en el Emisor1...

En esta otra imagen se ve la secuencia: Emisor1-10mS-Emisor2-10mS-Emisor3-10mS- otra vez el Emisor1-32 mS-, y reinicio de ciclo. Los pines de salida son E1 (Pin8), E2 (Pin9) y E3(Pin10). Los tiempos de 10 mS son para que las señales emitidas no se puedan solapar, y los 32 mS son para indicar al receptor que comienza un nuevo ciclo...

En la siguiente imagen editada he añadido los tiempos de separación entre los frames...

Saludos

Llorens

Hola Anilandro, primero que todo, muchas gracias por tus respuestas. Ya lo llevas mucho mas trabajado, me alegra.

Ahora con respecto a tus post quisiera hacer varias apreciaciones para enriquecer mas el tema.

Anilandro:
...Para distancias tan pequeñas (yo lo calculé para un cuadrado de 4x4 metros), es naturalmente mucho mejor utilizar ultrasonidos, porque señales de radio obligarían a una gran velocidad de conteo y circuitos de muy alta velocidad de respuesta, con un hardware sólo al alcance de técnicos expertos en radar, y muy difícil de poner a punto. Para discriminar 1 cm. con señales de radio sería necesaria una resolución de 3,3 x10^-11, si no me equivoco, 33 pSeg (picosegundos). Con ultrasonidos en cambio es de 29,1 uSeg (878.000 veces menos) , con lo cual entramos en el margen de señales que puede crear y manejar directamente un Arduino UNO.

Si, usar ondas electromagnéticas y el principio de tiempos de arribo sería un problema por las resoluciones temporales que se requieren, por eso en el enfoque de ondas electromagnéticas mencione mas bien detectar la potencia recibida la cual disminuye por la separación entre fuente y emisor (entre otros factores).

Anilandro:
La frecuencia también está clara, 40 Khz, donde podremos usar los transductores de los típicos módulos de proximidad HC-SR04, aunque naturalmente será necesario estudiar antes el tema de la direccionalidad para adaptarla a nuestras necesidades... para ello comencé algunas pruebas...

También pensé en los HC-SR04 los cuales para tu aplicación viene bien pues es un robot, sin embargo, para lo que yo quisiera el sistema (rastrear mascotas) la frecuencia de 40kHz aun entra dentro del rango de audición de los perros (20Hz-65kHz aunque son mas sensibles de 50Hz a 16kHz), así que, no es que me guste de a mucho.

No entiendo muy bien por que pusiste tanta atencion en estudiar la direccionalidad de los emisores.

Yo prefiero el enfoque de @PeterKantTropus, de usar solo un emisor en el dipositivo movil y así ahorrarnos problemas de sincronia porque en la propuesta que haces activando emisores uno por uno funciona bien cuando el robot esta inmovil pero una vez se empiece a mover vamos a tener una limitante en la velocidad máxima si queremos lograr una cierta precisión. Entiendo que habra un costo extra porque tendremos que emitir la pocision al dispositvo movil pero en mi opinion personal lo preferiría.

Veo que estas haciendo la activacion de los emisores con el arduino, ¿Como tienes planeado hacer la parte de recepcion? ¿Haras los circuitos (filtro, amplificador)? Yo habia pensado para evitar hacer estas cosas mas bien usar el hardware propio del HCSR04 y de esta forma tambien sus librerias. Y asi mas bien solo sincronizar las señales de trigger.

Pues el hardware receptor se puede hacer con un simple operacional como filtro pasa-banda y como tu también pensé en utilizar parte del circuito del HC-SR04, de hecho hice algunas medidas sobre su propio amplificador de recepción, basado en el LM324...

...No tengo el esquema, así que fui probando hasta encontrar puntos en que la señal salía considerablemente amplificada, incluso con los cabezales emisor y el receptor apuntando en direcciones opuestas...

Sobre el resto de temas, varias consideraciones. Para estas distancias las ondas de radio no te van a funcionar, el "tiempo de vuelo" es demasiado breve, y ni por asomo conseguirás resoluciones de 1 cm. El sistema de la atenuación con la distancia, con independencia de que sean ondas de radio o ultrasonidos, no tendrá fiabilidad, porque la señal que llegará a los receptores no sólo variará por dicha distancia, si no también por la atenuación y las reflexiones de cualquier objeto cercano. No podrás evitar que se cree un entramado de ondas estacionarias con máximos y mínimos que no serán proporcionales a las distancias si no a la suma vectorial de fases en cada punto...

El desplazar las señales emitidas tiene la intención de que con independencia de la posición del receptor nunca se solapen y siempre lleguen en el mismo orden en que se emitieron. Como el foro reduce las imágenes, las cifras no se leen, pero la separación entre los "burst" de 5 ciclos de 40 Khz es de 10 milisegundos, así que no creo que la velocidad que puede moverse un robot o una mascota en un espacio cerrado le afecte demasiado. Otra consecuencia de emitir las señales desfasadas es dar tiempo a que cualquier reflexión espúrea se atenúe antes de emitir la siguiente...

En relación al ángulo de apertura de los transductores ultrasónicos, tomando más o menos los valores sobre 3 db (el 60 y tantos por %), es de aproximadamente 40 grados, insuficiente para mi idea, pero colocando el transductor en posición vertical con un simple reflector convexo, se puede modificar el haz con facilidad...

...Pese a que el reflector es totalmente improvisado, el haz se abre de forma considerable, observar la curva azul en relación a la curva roja inicial sin reflector.

...Pienso que trabajando un poco la forma se debería poder abrir el haz 180º en los emisores, en cuanto al receptor, necesita 360º, y estaba pensando en un espejo sonoro en forma de cono invertido, que incluso podría fabricar con la impresora 3D...

En fin, por desgracia nada es tan fácil como parece en un principio...

Saludos

Me puse a leer sobre los sistemas de aero navegación por radiofrecuencias y encontré que las mayoría se originaron durante la segunda guerra mundial, entre ellos el precursor del Loran. Pude descubrir que durante la segunda guerra ya había sido implementado algo parecido a mi propuesta. en el sistema OBOE (para afirmar que ya todo esta inventado) y era mucho mas preciso que los antecesores del Loran .
El sistema era muy simple, contaba con dos estaciones de radio en distintas frecuencias que emitían cada tanto un pulso. En el avión había un transpondedor que le contestaba inmediatamente a esas dos frecuencias. Una de las estaciones se utilizaba para guiar al avión sobre un arco, mediante mensajes en código morse, y la otra era utilizada para determinar el punto exacto donde había que dejar caer las bombas. Es obvio que el sistema solo servia para guiar a un avión, y este quedaba expuesto al emitir un mensaje de radio ,por eso se utilizaban aviones de posta, si el primero era derribado. Después de la guerra el sistema no tenia utilidad civil, porque la localización se realizaba en tierra.
Sin embargo parece una buena solución para este caso. Solo se necesitaría dos Arduino, uno con dos emisores-receptores separados por una distancia conocida y el otro como transpondedor que solo contesta. Una estación podría emitir un pulso y la segunda dos, de esa manera se evita utilizar dos frecuencias diferentes. y con el tiempo de repuesta de cada tren de pulso se puede localizar el transpondedor por triangulación.

En realidad no hace falta emitir dos trenes de pulsos por que el arduino puede alternar entre las dos estaciones emisoras-receptoras

Ya esta todo inventado.

Fantastic Voyage, año 1966

Sí, el Loran-A apareció durante la Segunda Guerra Mundial para guiar a los buques de los convoyes que cruzaban desde Estados Unidos a Inglaterra. También hubo otros sistemas como los ingleses Gee y Decca, y el X-Gërat y el Consol alemán. El Loran-C es posterior y daba más precisión porque no solamente tenía en cuenta las diferencias de tiempo al recibir las señales, si no también su fase. También hubo un sistema de cobertura mundial anglo-estadounidense que utilizaba ondas extralargas denominado Omega, que dejó de funcionar en 1997.

...En el Mediterráneo la cadena Loran-C funcióno más o menos hasta 1995, aunque los americanos ya la habían abandonado porque disponían del GPS, ofreciendo a los países que disponían de estaciones que asumieran su mantenimiento. En un principio España e Italia lo hicieron, pero en Turquía la antena había caído a causa de una tormenta, y en el verano de 1994 ya no funcionaba, limitándose la cobertura Loran de la cadena mediterránea sólo a la parte occidental.

El Oboe inglés fue distinto porque como bien dices utilizaba un transpondedor, aunque también se basaba en el sistema de "enrejado hiperbólico", en cambio el sistema Knickebein alemán era radial y se basaba en dos haces muy direccionales y ligeramente desviados uno con respecto al otro. Un haz emitía el tono de un punto de Morse, y el otro la raya complementaria, de manera que cuando se volaba en la línea central entre haces se escuchaba una señal continua, en cambio si el avión se desviaba hacia uno u otro lado iba apareciendo el punto o la raya, con lo cual los pilotos podían rectificar. Los alemanes utilizaban normalmente dos de estos haces dobles, funcionando a distintas frecuencias, para que coincidieran sobre una determinada ciudad inglesa, que a buen seguro en breve recibiría un devastador bombardeo, como le pasó a Coventry. También hubo un sistema alemán que con un simple receptor de radio y un reloj se podía identificar el radial concreto de los 360º sobre el que se encontraba el receptor, idea que luego se automatizó con el VOR de navegación aérea...

En resumen, sistemas hubo muchos, cada uno con sus particularidades y sin duda algunos permiten versiones a pequeña escala para ser útiles en montajes de Arduino. Estaría bien comprobar los pros y contras de cada uno. Yo por mi parte seguiré explicando lo que he hecho hasta ahora, y especialmente la solución matemática que desarrollé para hallar los puntos de coincidencia de dos curvas hiperbólicas determinadas, cálculo fundamental para cualquier sistema que se base en diferencias de tiempo.

Saludos

Discúlpame, creo que me malinterpretaste. No estoy haciendo una critica a tu trabajo ni intentando que lo cambies, simplemente estoy dando ideas para desarrollar a Firius2010 , autor original del post.

También pensé en los HC-SR04 los cuales para tu aplicación viene bien pues es un robot, sin embargo, para lo que yo quisiera el sistema (rastrear mascotas) la frecuencia de 40kHz aun entra dentro del rango de audición de los perros (20Hz-65kHz aunque son mas sensibles de 50Hz a 16kHz), así que, no es que me guste de a mucho.

Yo no me preocuparía por esto, estamos hablando de pulsos muy rápidos y espaciados, el nivel de potencia acústica (volumen) sera muy pequeño.

Voy a aportar el esquema de HC-SR04 para que @Anilandro continúe con su idea que es francamente muy buena.

No, no, PeterKantTropus, ninguna crítica, cada uno aporta sus ideas, lo cual es perfecto. Yo he imaginado este sistema a imitación del Loran, pero para usos concretos los puede haber mejores o más sencillos. Habría que probarlo. Por cierto no le respondí a Firius2010 sobre su comentario de posibles molestias a los perros, pero veo que tu si lo has hecho. Pienso lo mismo, los impulsos son tremendamente breves, muy separados y de baja potencia. Tal vez los oigan como un brevísimo "tic", pero no creo que les molesten demasiado...

Gracias por el esquema del HC-SR04, Surbyte, siempre ayuda a no ir a ciegas y se ahorra tiempo...

Mientras sigo trabajando con el hardware no debo descuidar el software. Para desarrollar el programa receptor de los frames necesitaré un generador de los mismos, lo cual puede hacerse a partir de una ligera modificación en el programa emisor...

La versión de "test" del emisor deberá olvidarse de la "capa física" de la comunicación por ultrasonidos y centrarse en la secuencia de señales digitales que le llegarían a través del transductor al Arduino receptor. La secuencia sería de cuatro señales de 125 uS separadas 10 mS entre ellas, y tras la última un tiempo de espera de 32,76 mS que actúa de indicador de sincronismo. Los tiempos de 10 mS han de poder variarse para simular distintas ubicaciones físicas del receptor con respecto a los emisores...

El montaje de prueba es muy sencillo. Un Arduino como emisor de señales (el de la derecha), conectado directamente a otro Arduino (de la izquierda) como receptor. Aquí, como digo, prescindo de la capa física de transmisión por ultrasonidos, y las señales pasan directamente sin "portadora" de 40 Khz del pin-8 de salida del emisor al pin-2 de entrada del receptor...

El programa emisor modificado para que la secuencia de los cuatro impulsos salga por el mismo pin:

// UPP_T_TEST_003. Llorens Mercadal, 28_agosto_2019. VERSIÓN OPERATIVA 
// Emisor de pulsos de prueba del sistema de Situación por Enrejado Hiperbólico 
//*************************************************************************
volatile byte Cont = 0;              // Contador de ciclos de 40Khz
volatile unsigned int T1 = 12000;    // Tiempo T1
volatile unsigned int T2 = 14000;    // Tiempo T2
volatile unsigned int T3 = 16000;    // Tiempo T3
volatile unsigned int T4 = 18000;    // Tiempo T4
//*************************************************************************
void setup(){
 pinMode(8, OUTPUT);             // Configura Pin 8 como salida de señal
 noInterrupts();                 // Configurar Timer1, desactivamos interrupciones
 TCCR1A = 0;                     // Registro de control A a 0
 TCNT1 = 0;                      // Registro contador a 0
 TCCR1B = 10;                    // Habilitamos CTC y Prescaler 8 (8+2)
 TIMSK1 = 2;                     // Timer/Counter Interrupt Mask Register
 OCR1A = 1;                      // Tiempo a 0,5 uS
 interrupts();                   // Activamos interrupciones nuevamente
 }
//**************************************************************************
ISR(TIMER1_COMPA_vect){           // Código generador de 4 señales ultrasónicas en triángulo
 Cont++;  
 switch (Cont){
   case 1:
     digitalWrite(8, HIGH);      // Pin-8 a HIGH, marca 1
     OCR1A = 250;                // Tiempo 125 uS    
   break;
   case 2:
     digitalWrite(8, LOW);       // Pin-8 a LOW, espacio 1
     OCR1A = T1;                 // Tiempo T1 (10 mS)      
   break;
   case 3:
     digitalWrite(8, HIGH);      // Pin-8 a HIGH, marca 2
     OCR1A = 250;                // Tiempo 125 uS    
   break;
   case 4:
     digitalWrite(8, LOW);       // Pin-8 a LOW, espacio 2
     OCR1A = T2;                 // Tiempo T2 (10 mS)      
   break;
   case 5:
     digitalWrite(8, HIGH);      // Pin-8 a HIGH, marca 3
     OCR1A = 250;                // Tiempo 125 uS    
   break;
   case 6:
     digitalWrite(8, LOW);       // Pin-8 a LOW, espacio 3
     OCR1A = T3;                 // Tiempo T3 (10 mS)          
   break;
   case 7:
     digitalWrite(8, HIGH);      // Pin-8 a HIGH, marca 4
     OCR1A = 250;                // Tiempo 125 uS    
   break;
   case 8:
   digitalWrite(8, LOW);         // Pin-8 a LOW, espacio 4
     OCR1A = T4;                 // Tiempo T4 (10 mS)          
   break;
   case 9:
     digitalWrite(8, HIGH);      // Pin-8 a HIGH, marca 5
     OCR1A = 250;                // Tiempo 125 uS    
   break;    
   case 10:
     digitalWrite(8, LOW);       // Pin-8 a LOW, espacio 5
     Cont = 0;                   // Resetea Contador
     OCR1A = 65535;              // Espacio de sincronismo (32,76 mS)          
   break;
   }
 }
//************************************************************************
void loop()
 {}

En la siguiente imagen se ve la secuencia de salida resultante en el pin-8 del emisor, con los impulsos separados 10 mS (en teoría, como las tres separaciones son iguales y los 10 mS son en realidad un "pedestal" añadido para que las señales nunca puedan solaparse, en una situación real el receptor estaría situado en el centro geométrico del triángulo de emisores)...

...Enlace a la imagen de tamaño real...

Continuará...

Saludos

El programa del Arduino receptor que nos decodifique los tiempos de intervalo entre impulsos es el siguiente...

//  UPP_R_TEST_003, PRE_003 Receptor de pulsos de ultrasonidos para sistema de Situación por Enrejado Hiperbólico
//  Llorens Mercadal, 1_septiembre_2019
//  NO PROBADO
//
// - El Timer1, con prescaler 8 resolución 0,4998 uS, total 32,76 mS, cod 2+8
// 
//***** Variables globales *********************************************************

volatile unsigned int Tiempo[4];    // Guarda tiempo entre Frames 
volatile byte Cont = 0;             // Contador de Frames
volatile bool P_Soft = false;       // Flag de permiso de lectura de Frames desde el software en loop()
volatile bool P_Tot = false;        // Flag de permiso de lectura de Frames principal
volatile bool Datos = false;        // Flag que indica la validez de los datos

//**********************************************************************************

void setup()
  {
  Serial.begin(9600);             // Activar comunicación serie con el PC
  //pinMode(2,INPUT);               // entrada de señales a pin de interrupcción externa
  pinMode(13,OUTPUT);
  
  Tiempo[0]=0;
  Tiempo[1]=0;
  Tiempo[2]=0;
  Tiempo[3]=0;      
//  }


  attachInterrupt(digitalPinToInterrupt(2),Frame,RISING); // habilita interrupción en pin 2 y modo RISING
  // Configuración del Timer1 
  noInterrupts();                 // Desactivamos interrupciones
  TCCR1A = 0;                     // Registro de control A a 0
  TCNT1 = 0;                      // Registro contador a 0
  TCCR1B = 10;                    // Habilitamos CTC y Prescaler 8 (8+2)
  TIMSK1 = 2;                     // Timer/Counter Interrupt Mask Register
  OCR1A = 50011;                  // Valor de comparador para disparo a 25 mS
  interrupts();                   // Activamos interrupciones nuevamente
  }

//**********************************************************************************

void Frame()                      // Rutina ISR de interrupción por entrada de Framesen en Pin-2  
  {                      
  if (P_Tot==true)                // Si hay permiso Total de lectura de Frames
    {                             
    Tiempo[Cont] = TCNT1;         // Guarda el tiempo desde el último reset
    Cont++;                       // Aumenta 1 valor de contador de Frames
    if (Cont == 4)                // Si contador de Frames llega a 4 (todos los Frames ya leídos)
      {           
      Cont = 0;                   // Resetea contador de Frames
      P_Tot = false;              // Detiene permiso de lectura Total
      P_Soft = false;             // Detiene permiso de lectura desde el Software del "loop()"
      Datos = true;               // Indica que se ha leído correctamente la secuencia de Frames
      }
    }
  TCNT1 = 1;                      // Resetea contador de Timer1 a 1 (tal vez puede ser 0)
  }                               // Final de rutina ISR

//**********************************************************************************

ISR(TIMER1_COMPA_vect)            // Rutina ISR por desborde de Timer1 (más de 25 mS sin Frames)
  {
  if (P_Soft==true) P_Tot=true;   // Si además lo autoriza el "loop()", otorga permiso total 
  TCNT1 = 1;                      // Resetea contador de Timer1 a 1 (tal vez puede ser 0)
  }
//*/

//**********************************************************************************
void loop()
  {
  // Al haber leído los datos y necesitar más: actualizar P_Soft=true; Datos=false;
  Serial.print("T1 ");
  Serial.println(Tiempo[0]);
  Serial.print("T2 ");
  Serial.println(Tiempo[1]);
  Serial.print("T3 ");
  Serial.println(Tiempo[2]);  
  Serial.print("T4 ");
  Serial.println(Tiempo[3]);  
  Serial.println();
  
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);

  P_Soft=true; Datos=false;   // Reactivar lectura de datos
  }

...Y el resultado es el siguiente:

La primera lectura T1 no significa nada, siendo en realidad un conteo interno del programa. Los verdaderos datos son los T2, T3 y T4, Observo que las medidas oscilan entre 19999 y 20001, es decir, el valor central 20000 +/-1, lo cual arroja el insignificante error de lectura del 0,005%. Sin duda un buen sincronismo entre el programa codificador de señales de diferencia de tiempo y el decodificador...

Aunque debo aclarar que el valor 20000 son pasos del contador del Timer1, que con el prescaler 8 equivalen a un tiempo real de 10,0001 mS ...por lo tanto el sistema, a nivel de software, parece que funciona y, aunque no lo he cuantificado, a una resolución sensiblemente mayor del "centímetro" que tengo como meta...

Saludos

...Y ahora llegamos a la parte compleja de la cuestión. ¿Como pasamos de diferencias de tiempo a coordenadas ortogonales X-Y? Pues el hecho que los sistemas de situación por radio basados en este mismo principio eran llamados de "Enrejado Hiperbólico", nos da una pista. Sin duda las hipérbolas tendrán algo que ver...

Una hipérbola es una curva que tiene dos focos, y la característica que la diferencia de las distancia de cada uno de sus puntos a ambos focos es la misma, Es decir, es exactamente el dato que nos suministra el programa. En concreto, la diferencia entre E1 y E2 es de 20.000. así como la de E2 y E3, y la de E3 con E4. Recordemos que las diferencias son las mismas porque así lo hemos configurado en el programa emisor para una situación del receptor justo en el centro geométrico del triángulo que forman los emisores... Pero además, también tenemos que recordar que esta diferencia corresponde en realidad al "retraso" de 10 mS que introducimos entre los impulsos de los emisores para evitar cualquier posible solapamiento... Es decir, que para obtener las dirferencias reales deberemos restarle 20.000 a dicho dato, dando el resultado de E1 - E2 = 0, E2 - E3 = 0 y E3 - E4 = 0...

....Estas diferencias corresponderían a tres hipérbolas que al ser 0, se confunden con una recta perpenticular y en el punto medio de la línea base entre dos emisores...

Esta disposición sin duda funcionaría con una cobertura comprendida más o menos en el interior del círculo gris, pero estoy viendo tres problemas, como que la posición central del triángulo es el punto más alejado de las líneas base de los emisores, con lo cual, por la propia forma de la hipérbola será el punto de menor precisión, cuando opino que debería ser lo contrario. El segundo, que excepto en la línea base de los emisores E3-E4, las coordenadas que nos dieran no corresponderían a ejes ortogonales X, Y, y sería necesario realizar conversiones mediante trigonometría, senos, cosenos, etc, que son funciones relativamente lentas en C. Y el tercero que al utilizar tres hipérbolas, cuyos datos nunca coincidirán exactamente en un solo punto, me complicaría mucho la resolución matemática de la posición ...Por este motivo he cambiado mi idea inicial del triángulo a una disposición de 4 emisores que formarán dos líneas base, E1-E2 y E3-E4, es decir, en vez de tres hipérbolas habrá dos, pero con un mejor ángulo de corte en la zona central del cuadrado previsto de cobertura, de 4x4 metros, no serán necesarios cálculos trigonométricos y sólo habrá un punto de cruce común...

En esta disposición las coordenadas X,Y obtenidas a través de los emisores E3-E4 coincidirán con las X,Y del eje de coordenadas general, y las obtenidas de los emisores E1-E2 bastará con intercambiarlas, X por Y y viceversa, para obtener las generales. Naturalmente, para una diferencia E1-E2 determinada obtendremos una hipérbola, y de E3-E4 otra, con lo cual el receptor estará situado en el punto de cruce de ambas.

Continuará...

Saludos

Llorens