Réaliser un phare IR

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 (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