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

Principe_PhareIRLe 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

LED_IRUne 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

Rectpt_IRModè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

Piece_detecteur_IR_vue3Piece_detecteur_IR_vue2Piece_detecteur_IR_vue1Afin 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).

Piece_detecteurIRModèles 3D (Solidworks et STL) du boitier du détecteur : DetecteurIR

 

 

 

Programmation

Solution PWM

Le phare

SalveDu 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

Salve_reponseDu 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 …

https://www.arduino.cc/en/Reference/Tone

https://www.arduino.cc/en/Reference/PulseIn

Vous aimerez aussi...

7 réponses

  1. Coulebeau dit :

    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

    • cfaury dit :

      Bonjour
      Je veux bien vous aider si vous me donnez quelques info sur ce qui ne fonctionne pas …
      Cédrick

      • Coulebeau dit :

        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.

        • cfaury dit :

          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

  2. coulebeau dit :

    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);
    }

  3. Daniel dit :

    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.

    • cfaury dit :

      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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *