Finalizamos esta serie con un ejemplo muy interesante para calcular tiempos que en este caso utilizaremos para medir el tiempo que tarda en llegarnos un ECO de un sonar, en este caso el HC-SR04, como se ve en el ejemplo sonar.rs que es el que explicamos su funcionamiento.
En este caso configuraremos un TimerCount que realizara la cuenta de lo que tarda en llegar una señal a un pin, ejemplo del Echo de un sonar, al igual que con la generación de PWM lo primero es saber que prescales que utilizaremos, interesándonos del tiempo de cada Tick que junto al contador nos permitirá conocer el tiempo y claro esta el máximo tiempo posible
Tiempo trascurrido = Ticks*tiempo
En este caso solo definimos el prescaler (64 en nuestro caso) y no definiremos el registro WGM1 pues no tenemos que definir ninguna onda solo contar Ticks.
let timer1 = dp.TC1;
timer1.tccr1b.write(|w| w.cs1().prescale_64());
Deberemos conocer las características del dispositivo sonar que vamos a utilizar para medir distancia, en nuestro caso el sonar HC-SR04 con las características:
- Medición entre 2cm y 400cm.
- Precisión de 3mm
- Mantener el triger en alto durante 10μ para el lanzamiento de la onda.
Y utilizaremos la siguiente formula «Distancia = Tiempo_llegada * velocidad del sonido (340m/s) /2 » podemos ver que dividimos entre dos ya que el tiempo sera el de ida y el de vuelta una vez rebota con el objeto, aunque en realizada utilizaremos la siguiente formula que nos dará la distancia en centímetros.
Distancia = Tiempo de llegada / 58
Con el contador definido, con su prescaler y sabiendo lo que tenemos que medir solo nos queda iniciar el contador a 0, lanzar el ECHO y esperar para una vez que nos llegue leer el número de Ticks y calcular el tiempo y por lo tanto la distancia.
timer1.tcnt1.write(|w| w.bits(0)); // Iniciamos el contador a 0
// Se multiplica por 4 convirtiéndolo en us si usamos un prescaler de 64
let contador = timer1.tcnt1.read().bits().saturating_mul(4);
let distancia = contador / 58; // Calculo de la distancia con los Ticks obtenidos en la espera.
// Forma de realizar una pausa con el contador sin utilizar el dalay
timer1.tcnt1.write(|w| w.bits(0));
while timer1.tcnt1.read().bits() < 25000 {}
Hasta aquí los 7 temas tratados
- Introducción
- E/S Digitales
- Entradas analógicas
- PWM
- Interrupciones externas
- Servomotor (Generación de Onda)
- HC-SRC04 (Contador de tiempo)
Y con esto terminamos con la programación Rust-Arduino, aunque seguro que trataremos algún tema más, decir que el programar el Arduino en Rust me ha servido para conocer más el funcionamiento del micro AVR utilizado por Arduino y depurar y mejorar algún que otro programa del cajón y que seguramente expondremos en estas páginas.