vendredi 22 juillet 2011

Des yeux pour Arduino Car

Introduction
Jusqu'a maintenant, je me suis focalisé sur la propulsion d'Arduino Car.
Si cela en fait un véhicule capable de se déplacer seul, il est aussi terriblement stupide dans ce sens ou il ira se jeter sur le premier obstacle sans même s'en rendre compte.

Voila pourquoi je vais équiper Arduino Car de senseur.
Mon dévolu se porte sur les capteurs infrarouge gp2y0a21 de Sharp.


Capteur infrarouge Sharp gp2y0a21
J'ai justement eu l'occasion d'en acheter 4 chez Antratek.
J'ai d'ailleurs écris l'article "Detecteur de proximité infrarouge - Sharp gp2y0a21" sur Arduino Notepad, un occasion unique pour se faire la main dessus.
L'article précité indique d'ailleurs ou se fournir ce type de capteur.


Montage des capteurs
Je vais commencer par monter deux capteurs sur l'avant de la voiture histoire de détecter les obstacles frontaux.
Une bonne partie de l'article sera consacré à ce montage et aux tests des capteurs.

D'autres capteurs seront nécessaires

Par contre, je sais déjà qu'il me faudra envisager deux autres capteurs, ce que viendra confirmer les premiers tests.
Ces capteurs serviront:
  • Détecter les obstacles en hauteur (pour éviter à la voiture de se jeter sous les meubles bas ou les voitures).
  • Un détecteur de profondeur (orienté vers le sol) pour détecter les trous ou simplement les bordures de trottoir en oblique (45°).
  • Si le détecteur de profondeur est placé au centre de pare-chocs, cela permettra aussi de détecter des objets tels que des pieds de chaises ayant échappé aux deux premiers détecteurs.
Truc et astuces
Pour faciliter le montage, je vous suggère de préparer:
  1. L'utilisation de tout petits colsons (exemple ici) pour faciliter le montage. 
  2. Un fer à souder pour marquer les emplacements des trous à forer pour placer les senseurs infrarouges.
  3. Une mèche pour faire les trous en vue de laisser passer les colsons.
  4. Du fil et des pins headers pour le raccordement sur les entrées A0 et A1 d'Arduino.
Le montage en images
Eléments du montage

Percage des trous de fixation

Fixation à l'aide de Colsons

Autre vue de la fixation

Raccordement électrique

Détail du raccordement

Placement sur la voiture

Raccordement Arduino
  • Entrée Analogique A0 : Senseur Gauche (fil brun)
  • Entrée Analogique A1 : Senseur Droit (fil orange)
  • Sortie 3.3V raccordée sur entrée AREF.
    Comme les capteurs infrarouges ne retournent pas une tension supérieure à 3.3V, cet important raccordement permet d'augmenter la précision des lectures analogiques.
Schéma de raccordement des détecteurs
Test de la détection
Pour faire les tests de détections, j'ai créé un petit logiciel spécifique lit les valeurs analogiques sur A0 et A1 et envoi l'information sur le port série (qu'il est possible de visualiser avec le moniteur d'Arduino IDE).
L'information est lue toutes les secondes et envoyées sur le port série comme suit:
----------------------------
GAUCHE 478, volt=1.54, prox=24
DROITE 71, volt=0.23, prox=255
-----------------------------
GAUCHE 470, volt=1.51, prox=24
DROITE 232, volt=0.75, prox=255

A savoir:
  • Détecteur de Gauche
    • Valeur lue sur le port analogique (0 à 1024)
    • Conversion en volts (sur base de la tension de référence de 3.3v)
    • Un indice de proximité (voir documentation plus loin).
  • Détecteur Droit
    Idem
Indice de proximité
Sur base du graphique suivant disponible dans la datasheet (accessible depuis cet article) et sachant que la dite "distance de jugement" est de ~24cm, j'ai écris un bout de code évaluant grossièrement la proximité d'un objet (l'indice de proximité).
Source: datasheet
Ce bout de code retourne les valeurs suivantes:
  • 255: hors du champs de proximité. Pas d'évaluation plus précise.
  • 24: distance de jugement atteinte. Soit 24 cm ou moins.
  • 15: distance proche atteinte. Soit 15cm ou moins (il est grand temps d'agir!).
Code source
Source: Infrared_Sensor_Test.pde
/*
    ArduinoCar - http://arduinocar103.blogspot.com
    Test des detecteurs Infra-rouge Avant  d'ArduinoCar
    
    Date: 21 juillet 2011
      
    Description:
      Ce programme affiche les valeurs detectées par les deux 
      détecteurs IR placé à l'avant de la voiture (branchés 
      sur A0 et A1).
      
      Les valeurs sont écrites sur le port série
    
    Montage:
      ARef = 3.3 volts
      Infrared left=pin A0
      Infrared right=Pin A1
 */
 
 int pinIrGauche = 0; // détecteur Infrarouge a Gauche
 int pinIrDroite = 1; // détecteur Infrarouge a Droite
 
 void setup(){
     analogReference( EXTERNAL );
     Serial.begin( 9600 );
 }
 
 void loop(){
   // Capture de la valeur
   int valeurIrGauche = analogRead( pinIrGauche );
   int valeurIrDroite = analogRead( pinIrDroite );
   
   // Transformation en volts (référence=3.3v)
   float voltIrGauche = ((float)valeurIrGauche)*3.3/1024;
   float voltIrDroite = ((float)valeurIrDroite)*3.3/1024;
   
   // Evaluation de la proximité (par ordre de grandeur en CM)
   // Les valeurs possibles sont:
   //  * 255 = valeur maximale, hors du champs de la perception
   //  * 24  = objet à la distance de jugement (24 cm ou moins)
   //  * 15  = objet très proche (15 cm ou moins)
   // 
   byte proximiteGauche = 255; // distance > 24 cm
   if( voltIrGauche > 1.6 ) 
     proximiteGauche = 15; // distance < 15 cm
   else
     if( voltIrGauche > 1.1 ) // distance de jugement +/- 24 cm
       proximiteGauche = 24;

   byte proximiteDroite = 255; // distance > 24 cm
   if( voltIrDroite > 1.6 ) 
     proximiteDroite = 15; // distance < 15 cm
   else
     if( voltIrDroite > 1.1 ) // distance de jugement +/- 24 cm
       proximiteDroite = 24;
   
   // Affichage des valeurs
   Serial.print( "GAUCHE " );
   Serial.print( valeurIrGauche ); Serial.print( ", volt=" ); 
   Serial.print( voltIrGauche ); Serial.print( ", prox=" ); Serial.println( (int)proximiteGauche );

   Serial.print( "DROITE " );
   Serial.print( valeurIrDroite ); Serial.print( ", volt=" ); 
   Serial.print( voltIrDroite ); Serial.print( ", prox=" ); Serial.println( (int)proximiteDroite );
   
   // Affichage d'un séparateur
   Serial.println( "-----------------------------" );
   
   delay( 1000 ); // attendre 1 seconde avant lecture suivante.
 }

Conclusions
Premièrement: la fonction de proximité
Le code de détection de proximité va grandement facilité la détection d'objet.
Il faudra donc en faire une fonction.

Deuxièmement: les défauts de détections
Il existe des situations dans lesquelles la détection de proximité est peu inefficace, voire pas du tout.
Certaines imperfections peuvent être palliées par une action logicielle... d'autres nécessiterons des capteurs complémentaires.

La bordure de trottoir en biais:
Dans ce cas, la détection des 24 cm n'intervient que très tard... très vite suivie par la détection des 15 cm (pour une avancée du véhicule d'un cm seulement).
ArduinoCar détecte pas rapidement les bordures en biais.

Dans ce cas, la détection est tellement tardive que le véhicule ira se jeter dans la bordure rien qu'avec son inertie.
Il faudra donc prévoir un système de freinage pour que le véhicule (une impulsion en marche arrière par exemple :-) ).

Les objets au dessus des détecteurs:
C'est le cas des dessous d'armoire, ou de voiture.
Si les senseurs passent, ce n'est pas forcement la cas du restant du véhicule exemple.
Arduino Car ne détecte pas les objets en hauteur
Il est possible de résoudre cet inconvénient en plaçant un senseur en hauteur.
 
Les objects sous les détecteur:
Voici un cas pratique
Arduino Car ne détecte pas les objets au ras du sol
Ce cas de figure (tout comme la bordure de trottoir en biais) peu être contourné en plaçant un détecteur infrarouge pointant vers le bas.

Le pied de chaise:
Encore un autre cas pratique...
La pied de chaise n'est pas détecté!
Ce problème, tout comme celui des objets au dessus des détecteurs peuvent être résolu à l'aide d'un senseur infrarouge en hauteur (et orientable).


... il ne reste plus qu'a passer à la suite

Aucun commentaire:

Enregistrer un commentaire