Je me suis basé sur un télémètre infra-rouge Sharp GP2Y0A02YK capable de mesurer les distances de 20 à 150cm. L’avantage de ce type de télémètre sur un sonar est son coût trois fois moindre. L’affichage se fait par trois LED (ou DEL en bon français) : une rouge, une jaune et une verte.
Tous les éléments se trouvent facilement sur le web :
- 1 Arduino Uno
- 3 DELs (rouge, jaune, verte)
- 3 résistances de 220 Ohms
- un « breadboard »
- un télémètre infra-rouge Sharp, à droite sur l’image
- des fils pour connecter le tout.
Point de vue montage, c’est on ne peut plus simple. Le télémètre est connecté à la masse et au +5V pour ses deux fils d’alimentation et au port Analog 1 pour son fil de signal. Les 3 DELs sont connectées à la masse et aux ports numériques 9, 10 et 11 avec une résistance 220 Ohms en série pour chacune.
Le fonctionnement de l’engin est le suivant : le capteur mesure la distance en continu. Si l’obstacle est à plus de 150cm, les diodes sont éteintes. De 150 à 110cm, la diode verte s’allume petit à petit pour être pleinement allumée à 110cm. De 110 à 65cm, c’est au tour de la diode jaune de subir le même sort, la diode verte restant allumée. Et de 65 à 20cm, c’est à la diode rouge de s’allumer progressivement, les deux diodes précédentes restant allumées.
Pour allumer les diodes de plus en plus fort à mesure que l’obstacle s’approche, le mappage (fonction map() ) est fait "à l’envers", c’est à dire que la valeur la plus petite est mappée sur la valeur de PWM la plus grande. A noter aussi que j’ai mis les bornes pour la PWM de 0 à 150 et non 255 car l’oeil ne fait pas tellement de différence entre 150 et "plein pot", on maximise ainsi l’effet d’allumage progressif.
Pour la mesure de distance avec ce capteur, j’ai utilisé les instructions très complètes de cette page, vous en retrouverez donc une partie du code dans le mien.
Voici le code avec les commentaires, en espérant que ça soit assez clair!
const int IRpin = A1; // pin du télémètre IR
const int led1 = 9; // leds indicatrices
const int led2 = 10;
const int led3 = 11;
const int borne[] = {20, 65, 110, 150}; // on définit les distances d'activation des leds
const int lim_pwm = 150; // reglage de la plage PWM pour les leds
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
Serial.begin(9600); // démarrage port série
}
void loop() {
int distance=calculDistance(); // mesure de distance
if (distance > borne[0] and distance <= borne[1] ) { // de borne[0] à borne[1] : diode rouge en PWM, diodes supérieurs allumées
int distMap = map(distance,borne[0],borne[1],lim_pwm,0); // on mappe la distance sur la sortie PWM;
analogWrite(led1, distMap);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
}
if (distance > borne[1] and distance <= borne[2] ) { // de borne[1] à borne[2] : diode rouge éteinte, jaune en PWM, diodes supérieurs allumées
int distMap = map(distance,borne[1],borne[2],lim_pwm,0); // on mappe la distance sur la sortie PWM;
digitalWrite(led1, LOW);
analogWrite(led2, distMap);
digitalWrite(led3, HIGH);
}
if (distance > borne[2] and distance < borne[3]) { // de borne[2] à borne[3] : diode rouge et jaune éteinte, verte en PWM
int distMap = map(distance,borne[2],borne[3],lim_pwm,0); // on mappe la distance sur la sortie PWM;
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
analogWrite(led3, distMap);
}
if (distance >= borne[3]) { // plus de borne[3] : on éteint tout
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
// Serial.println(distance); // affichage de la distance
// delay(100); // temporisation
}
int calculDistance() { //on fait la moyenne de 10 mesures pour lisser les pics
float distance = 0;
for (int i = 0; i < 10; i++) {
float volts = analogRead(IRpin)*0.0048828125; // valeur du télémètre * (5/1024) - si alimentaiton en 3.3.volts changer 5 en 3.3
distance = distance + 65*pow(volts, -1.10);
}
distance = distance/10;
if (distance >150 or distance < 20) { // si hors limites on met à 150
distance = 150;
}
return(distance);
}
Et une petite vidéo de l’engin en action :
Comme on le voit, ça marche relativement bien. Le boîtier noir que je tiens à gauche des DELs est juste là pour qu’on les voie mieux, il ne sert à rien autrement :)
Deux défauts ont été notés :
- le capteur est fortement perturbé par toute surface réfléchissante même très éloignée (une casserole située à 7-8m lui a fait dire n’importe quoi)
- le champ de mesure du capteur est très étroit, un peu comme un laser, contrairement aux sonars qui « voient large ». On peut donc passer à côté d’un poteau si celui-ci n’est pas pile en face.
On retrouvera des éléments de ce bricolage dans mon prochain projet, mais pour l’instant c’est un secret :)
