Phare Infrarouge
Problème : permettre à un véhicule (robot, …) de s’orienter dans l’espace.
Idée : utiliser un phare (comme pour les bateaux)
Principe
Le phare : un émetteur infrarouge
Il devra émettre un signal lumineux :
- Visible par le détecteur : angle d’émission suffisamment large, portée suffisante, …
- Reconnaissable par le détecteur : fréquence porteuse compatible, …
De plus, s’il doit y avoir plusieurs phares, les détecteurs doivent pouvoir les distinguer : le signal doit donc être codé.
Le détecteur : récepteur IR
Il devra permettre au système qui l’emploi d’identifier la direction dans laquelle se trouve le phare.
Il devra donc :
- avoir un angle de détection adapté au besoin : sensibilité/précision de la mesure d’angle, …
- pouvoir distinguer différents phare : codage des signaux émis par les phares, …
Réalisation
Le phare
Une ou plusieurs LED IR (selon l’intensité et l’angle d’émission souhaités) feront l’affaire. Pour le câblage, voir l’article « Les LED« .
Pour le codage du signal lumineux, deux possibilités sont envisageables :
- Variation d’une largeur d’impulsion (PWM) : c’est la largeur d’une impulsion qui fait le code
- Codage de télécommande (bibliothèque IR) : code plus complexe, utilisé par les télécommandes d’appareils audio/vidéo/…
Remarque : dans une pièce, le rayonnement infrarouges émit par la LED est réfléchi par de nombreux obstacles (murs, meubles, …). Il est donc nécessaire de diminuer l’intensité de la LED (par rapport aux préconisations de l’article « Les LED« ). Une résistance de 1kΩ peut faire l’affaire.
Le détecteur
Modèle utilisé : IR38DM
Il s’agit d’un démodulateur IR, dont les caractéristiques sont les suivantes :
- sortie : actif bas
- tension d’alimentation : 4.5V ~5.5V
- longueur d’onde : 940nm
- fréquence porteuse : 38kHz
- portée du signal : max. 10m
Afin de limiter l’angle de « vision » du détecteur, on le place au fond d’un « tube » étroit, dont on tapisse l’intérieur avec un matériau qui absorbe bien la lumière (ici un tissus noir).
Modèles 3D (Solidworks et STL) du boitier du détecteur : DetecteurIR
Programmation
Solution PWM
Le phare
Du coté phare, il faut émettre des signaux de fréquence porteuse compatible avec le récepteur IR (ici 38 kHz).
Pour cela, on utilise la fonction tone(port, f) pour générer un signal carré de fréquence f (en Hz) .
Et la fonction noTone(port) permet de stopper le signal.
En utilisant ces deux fonctions en alternance, on peut générer des salves.
Le programme suivant génère des salves de 10ms toutes les 100ms.
/* Phare Infrarouge : émetteur */ const byte portLED = 9; void setup() { pinMode(portLED, OUTPUT); } void loop() { tone(portLED, 38000); delay(10); noTone(portLED); delay(90); }
Avis : si quelqu’un sait pourquoi le code tone(portLED, 38000, 10) produit une impulsion de 1.5 ms, alors qu’on lui en demande 10… merci de laisser un commentaire.
Le détecteur
Du coté détecteur, il faut détecter ces salves et en mesurer la longueur (durée). Le démodulateur choisi est de type « actif bas », c’est à dire qu’en l’absence de signal reçu, son état est « haut » (HIGH ). Il faut donc détecter des impulsions de type « bas » (LOW ).
Pour cela, on utilise la fonction pulseIn(port, t, timeout) pour mesurer la durée de la prochaine impulsion de type t (HIGH ou LOW). timeout (en s) permet de pas attendre éternellement…
Ce qui nous donne le programme suivant (la LED intégrée -13- s’allume quand le phare est dans l’axe) :
/* Phare Infrarouge : récepteur */ const byte portCAP = 9; void setup() { pinMode(portCAP, INPUT); pinMode(13, OUTPUT); } void loop() { unsigned long d = pulseIn(portCAP, LOW, 100000); if ((d < 11000) && (d > 9000)) digitalWrite(13, HIGH); else digitalWrite(13, LOW); delay(200); }
Remarque : s’il y a plusieurs phares, avec des pulsations de durées proches, il est possible de réduire l’intervalle de détection (ici 9ms < d < 11 ms).
Application
Voici un petit exemple d’application : un robot équipé d’un détecteur, suit le signal d’un unique phare.
Réalisé dans le cadre des projets des 2nde10 du lycée Blaise Pascal de Clermont Ferrand (2016)
Le programme associé :
#include <Servo.h> // Deux servomoteurs à rotation continue Servo Sright; // Droite Servo Sleft; // Gauche const byte portCAP = 9; int y = 0; void setup() { pinMode(portCAP, INPUT); Sleft.attach(13); Sright.attach(12); Sleft.writeMicroseconds(1500); Sright.writeMicroseconds(1500); } void loop() { Sleft.writeMicroseconds(1800); Sright.writeMicroseconds(1200+y); unsigned long d = pulseIn(portCAP, LOW, 100000); if ((d < 11000) && (d > 9000)) y = 300; else y = 0; delay(20); }
Pour en savoir plus …
Bonjour,
j’enseigne la technologie au collège, dans le cadre d’un club avec quelques élèves nous essayons de reproduire ce système de phare IR mais nous sommes bloqués pour une raison qui m’échappe, puis-je solliciter votre aide?
Cordialement,
S.Coulebeau
Bonjour
Je veux bien vous aider si vous me donnez quelques info sur ce qui ne fonctionne pas …
Cédrick
bonjour,
désolé de ne reprendre que le fil de la conversation que maintenant, j’ai été quelque peu empêché.
J’ai commandé comme récepteur des TSOP34838, nous les avons testé avec diverses télécommandes (vidéo projecteurs, TV..) et nous recevons le signal ce qui nous permet par exemple de piloter une LED.
Pour reproduire votre système nous utilisons vos codes, les TSOP34838 et les LED que nous avons récupéré sur diverses télécommandes (côté recyclage du projet) et cela ne marche pas. Je soupçonne que cela vient de la partie émetteur, mais je n’arrive pas à mettre le doigt dessus, le montage peut-être?
merci par avance.
Bonjour
Pour tester si vos LED fonctionnent, je vous conseille d’utiliser un appareil photo de téléphone portable : ils sont sensibles aux IR et vous devriez les voir clignoter à travers l’écran du téléphone. D’autre part, il faut se méfier de la fonction tone(), je lui ai parfois trouvé un comportement bizarre …
N’hésitez pas à utiliser un oscilloscope, ça aide bien à trouver ce qui cloche.
CF
Merci pour votre aide, ça y est ça marche. Nous avons réussi à programmer l’émetteur de manière suivante :
void setup()
{
}
void loop()
{
tone(8, 38000, 10);
}
Bonjour
Je me permets de vous contacter via ce sujet car je n’ai pas trouvé un autre moyen de vous contacter et vous poser une question… 🙂
Mon problème à moi, c’est que je voudrai réaliser un capteur d’obstacle ou un éméteur/récepteur, alimenté par piles, petit et d’une très longue portée!! Et c’est là que ça se complique. J’ai besoin d’une portée de 200 Mètres !!!
Pensez vous que c’est réalisable?? Quel capteur utiliseriez vous, sachant que l’idée est de créer un « nuage conique » d’une portée de 200 m!! Et qu’une lampe led, s’allume dés qu’un objet entre dans ce « nuage ».
J’ai l’impression qu’il n’y a rien de bien compliqué là dedans, mais je ne trouve aucun capteur qu’il soit IR, ultrason, laser ou
ou radio fréquence.
Bonjour
Un détecteur de type reflex, même avec un laser IR, à 200m, ça me parait difficile, sauf peut-être si l’objet est doté d’un catadioptre … et encore.
Mais en fait, tout dépend de la puissance du laser … et là, les prix risquent de grimper vite !
CF