Voilà qui est plus ardu. Sans toucher veut dire que l'on doit pouvoir détecter un obstacle à distance et évaluer à quelle distance on se trouve de l'obstacle. Nous avons deux sortes de capteurs qui peuvent répondre à nos besoins. Il fonctionnent sur le même principe : capter un écho.
-
Le premier est le capteur infrarouge, qui va capter la lumière infrarouge qui rebondit sur l'obstacle.
-
Le second est le capteur à ultrasons, qui va capter un son qui rebondit sur un obstacle.
Le capteur de distance à infrarouge
Nous avons vu dans le cours d'initiation comment utiliser une photodiode (ou diode réceptrice infrarouge), voyons maintenant comment l'utiliser comme capteur de distance.
Il nous faut réaliser un montage qui envoie de la lumière infrarouge et qui la capte, dans le même temps. Voici le schéma de principe :

L'idéal est de prévoir une petite séparation entre la diode émettrice et la réceptrice, pour éviter qu'elles ne se "voient" directement (entourer la photodiode d'un petite tube en plastique noir genre paille est largement suffisant).
Voici un capteur de distance infrarouge tout fait :

Plus l'obstacle va être proche, plus la quantité de lumière infrarouge renvoyée par l'obstacle va être importante, donc plus la tension captée et numérisée par le CAN A0 va avoir une valeur élevée. Pour résumer, plus la valeur captée par A0 est élevée, plus l'objet est proche. Il suffit donc ensuite de programmer le robot pour qu'il agisse en fonction de la distance de l'objet. Nous allons le voir un peu plus loin.
Ça marche sur toutes sortes d'obstacles ? Parce que je croyais que le noir absorbait les ondes lumineuses ?
(Ha sacré Cunégonde ! Vous ne lâchez rien hein ?)
Alors en effet, il y a deux principaux inconvénients avec ce capteur :
-
La distance mesurable reste faible (environ 10 cm si le capteur est bien conçu) ce qui limite la vitesse de votre robot. En effet s'il arrive trop vite sur l'obstacle et que le capteur n'a pas eu le temps d'analyser la distance, vous risquez le choc.
-
La couleur de l'obstacle agit sur la distance mesurable. En effet, un objet de couleur noire ne va quasiment rien réfléchir, donc ne sera pas détecté par votre capteur (Lukas, rassurez-vous, même si vous ne réfléchissez pas souvent, vous seriez vus par le capteur).
Le cône de réception (la zone de détection) fait que votre robot pourra capter la présence d'un objet légèrement au-dessus ou en-dessous du capteur. C'est donc un peu mieux qu'une moustache. Mais pour une détection optimale, il faudrait presque trois capteurs (devant, devant-droite et devant-gauche) donc trois pins analogiques utilisés...
Évidemment, pour trouver le placement le plus efficace pour votre capteur, il vous faudra faire plusieurs tests et ajustements.
Avant de voir le code type, passons au capteur à ultrasons.
Le capteur de distance à ultrasons
Nous avons abordé dans le cours d'initiation ce capteur (SRF05) et les calculs de distances qui y sont liés. C'est d'ailleurs la grande différence entre le capteur de distance à infrarouge (dont il est assez difficile de paramétrer une mesure de distance précise) et le capteur à ultrasons qui permet presque d'obtenir une mesure au centimètre (à condition que l'obstacle se situe entre 5cm et 150 cm, au-delà de ces limites la fiabilité diminue).
Le cône de détection est aussi plus important que le capteur infrarouge (entre 30 et 60° vers la zone concernée). Le robot détecte donc des objets plus haut, plus à droite, plus à gauche et plus bas.
Plusieurs méthodes de programmation sont possibles :
-
Soit on procède comme nous allons le voir ensuite, c'est-à-dire en réalisant une mesure régulière.
-
Soit on procède comme la chauve-souris (non Lukas, on ne dort pas la tête en bas) c'est-à-dire que plus on capte que l'objet se rapproche, plus on fait des mesures rapprochées dans le temps, et plus il s'éloigne, plus on espace les mesures. Cette méthode libère du temps processeur mais risque de ne pas détecter un objet qui surgirait dans le champs. Mais comme nos robots évoluent dans un milieu protégé...
Il est tout à fait possible de monter le capteur sur un servo-moteur, afin qu'il scanne de droite à gauche pendant qu'il roule en ligne droite. Ou bien, lors de l'approche d'un obstacle, plutôt que faire tourner le robot, on fait juste tourner la "tourelle" du capteur pour chercher le meilleur chemin.
Voyons maintenant le programme type permettant au robot d’éviter un obstacle, qu’il l’ait détecté à distance avec un capteur à infrarouge ou à ultrasons.
Programme d'évitement d'obstacle sans contact
La structure de ce programme est globalement la même pour le capteur infrarouge et pour le capteur à ultrasons. Voici le principe :
-
Je roule tout droit (en mesurant) tant que tout va bien.
-
Je détecte que je m'approche d'un obstacle.
-
Je ralentis (facultatif, mais permet d'observer si l'obstacle persiste ou s'il disparaît).
-
Je détecte que l'objet est trop près de moi, je m'arrête.
-
Je recule un peu (facultatif, mais permet de ne pas toucher pendant les rotations).
-
Je tourne sur moi-même (ou fais pivoter ma tourelle) à droite puis à gauche pour chercher un passage (mesure d'une distance assez grande).
-
Là, deux possibilités de programme : Soit je m'engage dans le passage dès que je le trouve, soit je m'engage dans le passage le "plus libre" (ce qui nécessite de stocker les mesures effectuées en fonction de la position, puis de s'orienter correctement).
-
Je reprends ma route.
Il vous faut donc créer des fonctions de mouvement (on peut ajouter une notion de vitesse en paramètre) comme pour les moustaches. Il est toujours préférable de créer une fonction de mesure de distance (qui renvoie soit une distance, soit un état, par exemple : ok, proche, stop).
Voici un exemple de code. Il utilise le capteur SRF05. J'ai ajouté la communication avec le moniteur série pour les tests, elle est bien sûr facultative (mais bien pratique pour tester son programme ) :
Ce code ne contient pas les commandes pour les moteurs, je vous laisse le faire .
J'attire tout de même votre attention sur le début du programme. Vous y trouvez la directive (car ce n'est pas une fonction) #define
. C'est une directive qui permet de fixer des noms de constantes. Il faut penser à bien écrire les constantes en majuscule pour un meilleur repérage dans le code. On l'utilise comme suit :
Lors de la compilation, à chaque fois que l'IDE trouvera NOMDECONSTANTE dans le code, il le remplacera par la valeur. Du coup, pas d'utilisation de mémoire dynamique ! Vous rencontrerez souvent cette directive dans les programmes (et ce, dans plusieurs langages !). N'hésitez pas à l'utiliser.
Bon, vous avez maintenant un robot qui évite les obstacles sans les toucher. Que pourrait-il faire d'autre ?