Total-Informatique

Le blog de sablier94

Assistant de parcage sonore

août 12th, 2012

J’ai récemment acheté le capteur de distance à ultrasons HC-SR04. Sur le papier il détecte correctement des distances allant de 2cm à 5m, mais en réalité c’est plutôt de 3cm à 3m. Pour le prix, c’est assez bien et ça permet de faire pas mal de choses. J’ai choisi de commencer par faire un assistant sonore pour vous aider à parquer votre voiture en reculant.

J’ai fait une petite vidéo pour vous montrer comment ça marche:


Son fonctionnement et son code sont assez simple, il envoie des ultrasons d’un côté du capteur et s’il y a un objet en face, les ondes rebondiront jusqu’à l’autre côté du capteur. Un petit calcul avec le temps qui est passé entre l’émission et la réception va déterminer la distance parcourue par les ondes.

Pour faire en sorte que les beeps sonnent de plus en plus vite quand la distance diminue, j’ai choisi de faire une pause de LaDistanceEnCM * 15 millisecondes entre chaque beep. Du coup quand la distance sera de 5 centimètres, il y aura un beep toutes les 75 millisecondes. Et quand il y aura une distance de 70 cm, les sons seront espacés de 1,125 secondes. Bien entendu toutes les échelles peuvent être modifiées en fonction de vos besoin (pour une voiture par exemple, ce sera légèrement plus grand).

Il y a également une LED rouge qui va s’allumer quand la distance est plus petite que 10 centimètres.

Le capteur n’est pas toujours fiable et peu parfois afficher une distance de plus de 3000cm (cela veut dire que la réception des ultrasons ne s’est pas déroulée correctement). Ce problème ne peut pas vraiment être résolu mais on peut faire en sorte d’éviter les beeps et allumer la LED rouge pour dire qu’il y a un problème.

Si vous désirez faire sonner votre piezo buzzer à un autre fréquence, il faudra remplacer le 3000 par le nombre de Hertz sur cette ligne :

tone(bytPinPiezo, 3000, 20);

Passons au montage, voilà le schéma (à télécharger ici) :

Schéma du montage

Et pour finir, le code (pour l’écran LCD c’est le même câblage et code que sur l’article avec le DHT11. N’oubliez pas de remplacer les numéros de pins si ce ne sont pas les mêmes) :

#include <LiquidCrystal.h> //Librairie pour l'écran LCD

LiquidCrystal lcd(12, 11, 4, 3, 2, 1); //Initialisation de l'écran LCD avec les numéros des pins utilisés

long lngDistanceObstacle; //Distance contre l'obstacle en face en centimètre

const byte bytPinTP = 6; //Pin Trig du capteur de distance
const byte bytPinTE = 7; //Pin Echo du capteur de distance
const byte bytPinLED = 9; //Pin de la LED rouge
const byte bytPinPiezo = 8; //Pin du piezo-buzzer
const int intMinDistanceDanger = 10; //Distance minimum où la LED rouge s'allume
const int intMaxDistanceDetection = 125; //Distance maximum pour faire des sons

void setup()
{
  lcd.begin(16, 2); //On indique le nombre de colonnes et de lignes de l'écran
  lcd.clear(); //On efface tout ce qui se trouve sur l'écran
  pinMode(bytPinTP, OUTPUT); //Initialisation du pin de l'émetteur d'ultrasons
  pinMode(bytPinTE, INPUT); //Initialisation du pin du recepteur d'ultrasons
  pinMode(bytPinLED, OUTPUT); //Initialisation du pin de la LED rouge
}

void loop()
{
  lngDistanceObstacle = Ranging(); //Récupération de la distance par le capteur
  lcd.clear(); //On efface tout ce qui se trouve sur l'écran
  lcd.setCursor(0, 0); //Positionnement du curseur au début de l'écran
  lcd.print(lngDistanceObstacle); //Affichage de la distance
  lcd.setCursor(3, 0); //Positionnement du curseur
  lcd.print(" cm"); //En centimètres
  if(lngDistanceObstacle < intMaxDistanceDetection) //Si la distance est plus petite que 125cm :
  {
    tone(bytPinPiezo, 3000, 20); //On joue un beep de 3000 Hz pendant 20 millisecondes
    delay(lngDistanceObstacle * 15); //On fait une pause proportionelle à la distance calculée
  }
  else //Si la distance est plus grande que intMaxDistanceDetection
  {
    delay(50); //On attend 50 millisecondes avant la prochaine mesure
  }
  if(lngDistanceObstacle < 300 && lngDistanceObstacle > intMinDistanceDanger) //Normalement, pas d'erreur
  {
     digitalWrite(bytPinLED, LOW); //On éteind la LED rouge
  }
  else if(lngDistanceObstacle > 300) //Il peut y avoir une erreur
  {
    digitalWrite(bytPinLED, HIGH); //On allume la LED rouge
  }
  if(lngDistanceObstacle < intMinDistanceDanger) //Si la distance est trop proche :
  {
    digitalWrite(bytPinLED, HIGH); //On allume la LED rouge
  }
  else if(lngDistanceObstacle >= intMinDistanceDanger && lngDistanceObstacle < 300) //Si la distance n'est pas trop proche :
  {
    digitalWrite(bytPinLED, LOW); //On éteind la LED rouge
  }
}

long Timing() //Fonction pour détécter la distance avec le temps :
{
  digitalWrite(bytPinTP, LOW);
  delayMicroseconds(2);
  digitalWrite(bytPinTP, HIGH);
  delayMicroseconds(10);
  digitalWrite(bytPinTP, LOW);
  long lngDuration = pulseIn(bytPinTE, HIGH);
  return lngDuration;
}

long Ranging() //Fonction pour retourner la distance en cm :
{
  long lngDuration = Timing();
  long Distance_CM = lngDuration /29 / 2 ; //Calcul pour avoir la distance en cm
  return Distance_CM;
}

Comments

One Coment

RSS
  • Batchapp says on: 18 août 2012 at 10:14

     

    Bonsoir très intéressant non seulement Arduino est un circuit imprimé programmable et open source mais ça popularité le rend asse accessible et programmable avec plusieurs langages a savoir
    + Game Maker
    + Instant Reality (X3D)
    + Isadora
    + Java
    + JSON
    + Liberlab (measurement and experimentation software)
    + Linux TTY
    + Mathematica
    + Matlab
    + MaxMSP
    + misc generic (1)
    + misc generic (2) – Any SW via files
    Arduino + Mono
    Arduino + OSC (via Processing)
    + Pd (Pure data)
    + PERL
    + Processing
    + Python
    + Ruby
    + Second Life
    + Scratch
    + Squeak
    + SuperCollider
    + Visual Basic .NET
    + V V V V
    + Xterm
    + Reaper et autre ………………….

Your email address will not be published. Required fields are marked *

*

Total-Informatique

Le blog de sablier94