Mas información sobre mis pruebas con el SRF04.
Como le decía en privado al amigo Radón, cojo una calculadora y me vuelvo loco.
![Demonio Demonio]()
Hay una línea en el programa que imaginaba iba a desatar todos los demonios de
preguntas sobre su exacto significado:
Codigo:
#define CALC_DISTANCE(t) (t / 58) // Convierte de Ticks a distancia
Y sin embargo nadie me ha aturrullado a preguntas con ella ...
pero no os váis a a librar tan facilmente de que hable de ella ...

¿De donde sale ese número 58? ¿por qué 58 y no 85 por ejemplo?
Pues si tomamos la calculadora y hacemos unas pequeñas operaciones con ella
podemos ver como llegamanos a ese número.
Nuestro PIC decíamos que tiene un cuarzo de 4 Mhz y como el TIMER1 lo hemos
configurado para un Preescaler de 1:1 tenemos que cada incremento, Tick, del
mismo dura 1 uS (un microsegundo).
Con él medimos el ancho de pulso del eco del ultrasónico aparato, así que dicho
ancho de pulso nos viene dado en microsegundos (1/1000000 de segundo).
Como la velocidad del sonido decíamos que era de unos 347 metros/segundo y
como un metro tiene 100 centimetros y un segundo tiene 1000000 (un millón) de
microsegundos podemos multiplicar 347 por 100 y dividirlo por 1000000 para
pasarlo a cm/uS con lo que nos queda 0,0347
Y como decíamos que el sonido tenía que ir y volver y solo nos interesa uno de los
sentidos de su viaje, tenemos que dividir esto por 2 por lo que tenemos 0,01735.
Y por fín solo nos queda ver que este desplazamiento es la inversa del tiempo
empleado luego 1/0.01735 = 57,63688 que es el número que buscamos.
Como estamos ajustado a un entero (centimetros) lo redondeamos a 58 y aquí
paz y allí gloria.
Conclusión: Cojemos los Ticks de Timer1, que hemos contado entre los flancos de
subida y bajada del eco, y lo dividimos por 58 para tener los centimetros a que se
encuentra el obstáculo.

Corolario: ¿Y por qué un entero? Si cambiamos el cálculo y le dejamos los
decimales, y si cambiamos el tipo de la variable donde recogemos la distancia
de entero de 16 bits a float de 32 bits, y si cambiamos el printf para mostrar un
float con un decimal nos aparece:

¡¡¡ Y funciona con la presición de 1 milimetro !!!
¡¡¡ Comprobado con una regla graduada (doble decímetro para los ingenieros) !!!

(Nota: yo he puesto exactamente 58.823 para ajustarlo exactamente a la temperatura
ambiente de mi habitación)