Dans ce TD, nous allons lire les valeurs provenant d'un capteur de distance HC-SR-04:
Lisez la documentation technique (datasheet) du HC-SR-04.
À quoi servent les broches trigger et echo ?
Quelle est la tension d'alimentation du capteur ?
Comment obtenir une distance à partir de ce capteur ?
Branchez votre capteur à votre carte Arduino. Appellez votre enseignant pour vérifier le branchement.
Ci-dessous, vous trouverez une trame de code à compléter.
main.c
#include "uart.h"
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
int echo() {
// TODO (1)
}
void trigger() {
// TODO (2)
}
int main() {
// TODO (3)
uart_init(115200);
// À lire et comprendre
TCCR1A = 0;
TCCR1B = (1 << CS11);
sei();
uart_send_string("HC-SR04\r\n");
_delay_ms(1);
while (1) {
int timeout = 0;
trigger();
TCNT1 = 0;
while (!echo() && TCNT1 < 50000)
;
TCNT1 = 0;
while (echo() && TCNT1 < 50000)
;
uint32_t time = TCNT1;
char buffer[64];
int distance_cm = 0; // TODO (4): convertir le temps en distance
sprintf(buffer, "Distance: %d cm\r\n", distance_cm);
uart_send_string(buffer);
_delay_ms(50);
}
}
TODO (1): Écrivez le code de la fonction echo(), qui teste le niveau de la broche echo.
TODO (2) Écrivez le code de la fonction trigger(), qui envoie une impulsion sur la broche trigger.
Aidez vous de la documentation, ainsi que de la fonction _delay_us pour paramétrer la durée de cette impulsion.
TODO (3) Au démarrage du main, ajoutez du code qui paramètre les broches trigger et echo.
Le timer 1 est initialisé à l'aide de la séquence suivante ci-dessus:
TCCR1A = 0;
TCCR1B = (1 << CS11);
À l'aide de la datasheet de l'Atmega328p: à quelle vitesse le timer correspondant (TCTN1) sera t-il incrémenté ?
TODO (4): Convertissez le temps mesuré en distance en centimètres, à l'aide de la documentation technique et de vos réponses aux questions précédentes.
Programmez votre cadre Arduino et testez le code.