Micro contrôleurs AVR/Travail pratique/Timer et module ultra-son HC-SR04
Nous allons proposer dans ce TP un certain nombre d'exercices utilisant un module ultra-son pour mesurer une distance. Ce problème est extrêmement facile à résoudre si l’on se donne la possibilité d’utiliser du code Arduino. Dans le cas contraire cela nécessite une bonne compréhension de la notion de temps.
Le prix de ce module HC-SR04 varie en fonction des distributeurs et du temps. Nous l'avons déjà acheté pour 1 €50.
Utiliser un Arduino pour mesurer une distance
[modifier | modifier le wikicode]Il existe une librairie toute fait pour Arduino. Au bout de très peu de temps les étudiants l'utilisent sans difficulté.
Installer la librairie
[modifier | modifier le wikicode]Téléchargez ICI le fichier .zip. En dézipant vous obtenez un répertoire "Ultrasonic-HC-SR04-master" dans lequel figure un autre répertoire "Ultrasonic". Si vous copiez "Ultrasonic" dans le répertoire "libraries" de votre répertoire de sketch, votre nouvelle librairie sera disponible dès que vous redémarrez votre environnement Arduino.
Notez que les nouvelles versions de l'IDE Arduino permettent d'installer directement le fichier .zip
Exercice 1
[modifier | modifier le wikicode]Si votre librairie est correctement installée, cherchez un exemple associé, par exemple Serial. Essayez-le en réalisant la connexion entre l'Arduino et le module.
Utiliser l'environnement Arduino sans librairie
[modifier | modifier le wikicode]La première ligne du programme de l'exercice 1 était un "#include" indiquant l’utilisation d'une librairie extérieure à la librairie standard de l'Arduino. Nous allons retirer maintenant cette librairie.
Exercice 2
[modifier | modifier le wikicode]En retirant la librairie de l'exercice 1, on vous demande de faire fonctionner le programme en changeant le code correspondant. Vous avez la possibilité d’utiliser "pulsIn()" de la librairie standard Arduino.
long lecture_echo;
long cm;
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT); //Trig
digitalWrite(9,LOW);
pinMode(8,INPUT); // Echo
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
lecture_echo = 0;
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);
lecture_echo = pulseIn(8, HIGH);
cm = lecture_echo / 58;
Serial.print("Distance cm : ");
Serial.println(cm);
delay(1000);
}
Tout ceci montre que la librairie qui a été installée pour l'exercice précédent n’est pas du tout nécessaire.
Comment se passer de pulsIn ?
[modifier | modifier le wikicode]Par simple boucle d'attente qui incrémente une variable
[modifier | modifier le wikicode]Le plus simple est donc de réaliser une boucle d'attente : il s'agit d'attendre que le signal "echo" repasse à 0 tout en incrémentant une variable. Une telle façon de procéder nécessitera un calibrage.
Exercice 3
[modifier | modifier le wikicode]Réaliser un programme complet sans plulsIn() capable de mesurer le temps pendant lequel le signal echo reste à 1. Comme l'unité de mesure de ce temps est inconnu, il vous faudra calibrer la nouvelle conversion pour obtenir des centimètres.
long lecture_echo;
long cm;
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT); //Trig
digitalWrite(9,LOW);
pinMode(8,INPUT); // Echo
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
lecture_echo = 0;
while(digitalRead(8));// attente front descendant au cas où
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);
while(!digitalRead(8));// attente front montant
while(digitalRead(8)) lecture_echo++;// attente front descendant
//cm = lecture_echo / 58;
cm = lecture_echo / 10;
Serial.print("Distance cm : ");
Serial.println(cm);
delay(1000);
}
Vous pouvez noter que l'ancienne formule de conversion a été remplacée par une autre formule. Nous divisons par 10 pour obtenir de centimètres maintenant. Ceci est assez approximatif et mérite d’être améliorer. La division par 58 était liée au fait que 58 us correspond à 1 cm. Maintenant que l'on n'utilise pas de timer, il nous faudrait connaître la durée d'une boucle pour trouver la valeur théorique de correspondance entre le nombre de boucles que l'on compte et sa durée. On a préféré faire des essais expérimentaux qui nous ont donné la valeur approximative de 10.
Utilisation du timer 2
[modifier | modifier le wikicode]Nous allons mesurer la durée de l'impulsion à l'aide du timer 2. À partir de maintenant, nous allons travailler en C pur.
Comme nous ne chercherons pas à avoir une précision plus grande que le centimètre, nous allons régler le mode CTC du timer 2 pour qu'il déclenche une comparaison toutes les 58 us. Réaliser 58 us avec 16MHz nécessite une division par 16 x 58 = 928 qui nécessiterait 9 bits. On peut donc réaliser une prédivision par 8, ce qui nous laisse une comparaison à 116.
Et encore un Timer
[modifier | modifier le wikicode]Plutôt que d'afficher le résultat par la liaison série, nous allons maintenant utiliser un servomoteur pour cet affichage. Bien qu'il existe une librairie Arduino qui gère directement les servomoteurs, nous allons réaliser notre propre gestion à l'aide du Timer 1. Ce problème a déjà été abordé dans ce livre, dans le chapitre sur le timer 1. Ce que l'on cherche à faire maintenant est expliqué dans la vidéo :
Il s'agit donc de coupler le module Ultrason avec un servomoteur.