14/09/2019

La Barrière LEGO avec telecommande - Arduino

Cet article fait suite à l'article La Barrière LEGO

Car c'est bien beau d'avoir une barrière LEGO qui se lève à l'approche d'un véhicule, seulement le problème, c'est une fois que l'on est passé, comment on fait pour revenir, car il n'y a pas de capteur de l'autre côté de la barrière...

La solution est d'utiliser une télécommande, sur laquelle nous utiliserons deux boutons... un pour lever la barrière et l'autre pour la baisser !

<video>

Prenez maintenant la télécommande et son capteur fournis dans le kit (voir  l'article La Barrière LEGO pour vous procurer le kit )


Sur la plaque du capteur infrarouge, repérez les broches S et -

PINDescriptionCouleur du câbleConnexion vers la carte ARDUINO
SSortie des donnéesmarronD11
3.3 - 5Vrouge VCC  / 5V
-0Vnoir GND

--> Utilisez les câbles fournis avec la télécommande et reliez
la pin S du capteur à la pin D11 de la carte Arduino
la pin du milieu du capteur à la pin 5V / VCC de la carte Arduino
la pin - du capteur

<troisphotos branchements>



Installez la librairie IRremote et ouvrez l'exemple IRrecvDemo
<trois photos install>

Nous n'allons pas nous servir du code hexadécimal de la touche, mais son code décimal. Pour ce faire, ajoutez la ligne
 Serial.println(results.value);

comme indiqué dans le code ci-dessous :

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
Serial.println(results.value);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Enregistrez ce code sous le nom de "Test_Telecommande" et téléverser-le sur la carte.


Ouvrez le moniteur série (dans le menu Outils) et appuyez alternativement sur les touches "Fleche Haut" et "Fleche Bas" de la télécommande.
Attention, si vous appuyez trop longtemps sur une touche, il peut arriver que les codes parasites "FFFFFFFF" et "4294967295", mais nous allons les gérer


<photo codes>

A chaque appui de touche, vous devriez voir apparaître un code correspondant à la touche appuyée . Moi j'ai pour :

Flèche HAUTFlèche BAS
code hexadécimalFF18E7FF4AB5
code décimal1671805516730805

Notez les codes que vous affiche le moniteur, ils peuvent être différents des miens !


Modifiez maintenant le code de la manière suivante pour détecter l'appui sur les deux flèches "HAUT" et "BAS".





#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    // Serial.println(results.value, HEX);
    // Serial.println(results.value);
    if (results.value == 16718055) {
      Serial.println("HAUT");
    } else if  (results.value == 16730805) {
      Serial.println("BAS");
    } else {
      Serial.println(results.value);
    }
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Enregistrez votre programme (que l'on appelle également Sketch chez Arduino), et téléversez-le sur la carte. Ouvrez-le moniteur série et appuyez successivement sur les touches "HAUT" et "BAS". Ces deux mots devraient maintenant s'afficher dans le moniteur :

<photo moniteur haut bas>

On va maintenant utiliser deux fonctions leve_barriere() et baisse_barriere() dans lesquelles ont ajoutera le code contrôlant le servomoteur...

Modifiez maintenant le code comme suit :

00);


#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    // Serial.println(results.value, HEX);
    // Serial.println(results.value);
    if (results.value == 16718055) {
      leve_barriere();
    } else if  (results.value == 16730805) {
      baisse_barriere();
    } else {
      Serial.println(results.value);
    }
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

void leve_barriere(){
  Serial.println("HAUT dans la fonction");
}

void baisse_barriere(){
  Serial.println("BAS dans la fonction");
}


<photo leve barriere fonction>


Bien bien bien, pas mal jusque là... Il ne nous reste plus qu'à brancher le servomoteur comme dans l'article précédent  sur la PIN D9 et à ajouter le code qui gère ce moteur :

Comme on n'a pas utilisé les lignes "bleus et rouges" pour le 5V et le GRND, on va juxtaposer les câbles d'alimentation du moteur à ceux du capteur infra rouge .

<photos branchement moteur>

Un petit peu de copier/coller  depuis le code produit dans l'article précédent, et votre code pourrait ressembler à ceci :




#include <IRremote.h>
#include <Servo.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

/* Creation d'un objet Servo pour contrôler le servomoteur */
Servo mon_servo;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
  mon_servo.attach(9);
  mon_servo.write(180);
}

void loop() {
  if (irrecv.decode(&results)) {
    // Serial.println(results.value, HEX);
    // Serial.println(results.value);
    if (results.value == 16718055) {
      leve_barriere();
    } else if  (results.value == 16730805) {
      baisse_barriere();
    } else {
      Serial.println(results.value);
    }
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

void leve_barriere() {
  Serial.println("HAUT dans la fonction");
  mon_servo.write(90);
}

void baisse_barriere() {
  Serial.println("BAS dans la fonction");
  mon_servo.write(180);
}





ET voilà, notre Barrière LEGO télécommandée  !!!!!

<video >

Ajouter des leds pour indiquer si l'on peut avancer ou pas ???

Inspirez-vous de ce code  : un mix des exemples  Blink  et Fade  présents dans Fichier / Exmples / 01.Basic ou sur le site Arduino  --> vous aurez aussi des indications sur la manière de brancher vos leds si vous avez des doutes


Connectez vos led sur les pin 5 et 7 de l'Arduino
Sans oublier de les protéger par des resistances de 220 ohms ! 


int led_rouge = 5;
int led_verte = 7; 
void setup() {
  // initialize digital pin as an output.
  pinMode(led_rouge, OUTPUT);
  pinMode(led_vertee, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(led_rouge, HIGH);   
  digitalWrite(led_verte, LOW);  
  delay(1000);                      
  digitalWrite(led_rouge, LOW);   
  digitalWrite(led_verte, HIGH); 
  delay(1000);                      
}