Infrarouge IR : Commande de sens de rotation d’un moteur à CC avec Arduino

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (2)

Objectifs

  • Savoir lire les touches d’une télécommande avec Arduino
  • Savoir utiliser le récepteur IR avec Arduino
  • Initier à la commande infrarouge : Exemple changer le sens de rotation d’un moteur à CC
  • Savoir différencier entre les types des télécommandes IR
  • Savoir comment ajouter une nouvelle librairie avec Arduino
  • Etc.

Fonctionnement 

L’objectif du projet  est le changement de sens de rotation d’un moteur à courant continu en utilisant la commande IR. On dispose d’une télécommande IR pour l’envoi de la commande, un récepteur IR et une carte Arduino pour l’acquisition et le traitement de la commande. Nous utiliserons ici deux LEDs qui indiquent le sens actif du moteur à CC (Sens 1 ou Sens 2). Le mini-projet est le début d’une série des projets à base de la technique IR.

Récepteur IR

récepteur IR

Le composant AX-1838HS est un récepteur IR miniaturisé. Il est composé d’une diode IR réceptrice et un préamplificateur (amplificateur, filtre, démodulateur, comparateur  et un étage de puissance) dans un seul circuit intégré. Il est caractérisé par son faible et cout et efficacité pour les applications faibles débit de données. Ci-dessous les caractéristiques du capteur :

  • Tension d’alimentation: 2.1-5.5 V

  • Courant: 1.5 mA

  • Distance de réception: 17 m (0 degré), 8 m  (45 degré)

  • Fréquence de la porteuse: 38 KHz

  • Longueur d’onde: 940 nm

  • Demi-largeur d’impulsion: 400-800 µS

  • Tension de sortie (niveau haut): 4.5 V

  • Tension de sortie (niveau bas): 0.5 V

  • Autres: Voir le datasheet

En résumé, le composant AX-1838HS est un détecteur IR : Il détecte la présence (sortie =4.5 V) ou l’absence (sortie 0.5 V) d’un rayonnement infrarouge (IR). Le signal émis doit avoir une fréquence centrale égale à 38 KHz.

schéma bloc du capteur

Télécommande IR

télécommande IR

Une télécommande IR est un émetteur IR menu d’un système électronique d’émission. En effet, contrairement au récepteur IR (détecteur IR), la télécommande émise un code de plusieurs caractères ASCII standardisés. La taille du code (nombre d’octets) dépend de nombre des touches et de la porteuse (fréquence d’émission).  Ci-dessous un tableau de codes d’une télécommande constituée de 20 et 21 touches successivement.

  • Télécommande 21 touches : 6 octets (2 octets poids forts sont à « FF »)
  • Télécommande 20 touches : 4 octets

Codes télécommande

 

Note: Les boutons “1” et “2” ‘une télécommande de 21 touches seront utilisés pour la commande du sens de rotation du moteur (allumage des LEDs).

Comment envoyer un code avec la télécommande ? 

Il suffit d’appuyer sur un bouton, le code sera automatiquement envoyé par la télécommande!

Comment tester le bon fonctionnement de la télécommande ?

Il est impératif de vérifier le bon fonctionnement de la télécommande avant son utilisation. L’utilisation d’une télécommande défectueuse (pile faible, défaut diode émettrice, etc.) peut entraîner une perte du temps au moment du test du programme et au diagnostic du défaut. Vous pouvez utiliser la caméra de votre téléphone portable pour savoir si la télécommande émit un signal IR au moment d’appui sur une touche ou non. Le signal IR sera lisible pour la caméra. L’absence d’un spot au moment d’appui indique un mauvais fonctionnement de la télécommande.

Comment lire le code envoyé avec Arduino ? 

La librairie « IRremote » sera utilisée pour la lecture du code reçu par le récepteur et émis par la télécommande. Elle permet de renvoyer directement le code sur 6 octets de la touche actionnée : Ex : « FF30 CF »: touche ‘1’, « FF18E7 » touche  ‘2’ (voir le tableau ci-dessus). Voir le programme principale pour plus des détails. 

Fonctionnement des LEDs 

Les LEDs rouge et vert seront commandées en fonction de la touche actionnée :

  • Touche « 1 » : allumé la LED 1 pendant 2 secondes : Sens 1= « 1 », Sens 2= « 0 »
  • Touche « 2 » : allumé la LED 2 pendant 2 secondes : Sens 1= « 0 », Sens 2= « 1 »
  • Autres touches : Sens 1= « 0 », Sens 2= « 0 ». Ci-dessous la syntaxe et la déclaration de la fonction MotorMode() qui sert à contrôler l’allumage des LEDs.
Syntaxe: void MotorMode(long int res_val) 
void MotorMode(long int res_val) 
{
  switch(res_val)
  {
    // Mode 1: Sens 1 
    case 0xFF30CF: // Code '1'   

      // Rotation Sens 1
      digitalWrite(Sens1, HIGH);
      digitalWrite(Sens2, LOW); 
      delay(2000); 

      // Init 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW); 
      
      break;
  
    // Mode 2: Sens 2 
    case 0xFF18E7: // Code '2'    
      
      // Rotation Sens 2 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, HIGH); 
      delay(2000); 

      // Init 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW); 
      break;
      
    // Autres 
    default: 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW);
  }
}

Programme principale 

#include "IRremote.h"

long int res_val;

// Numéro du pin sortie du récepteur 
const int receiver = 11; 

// Sortie Activation du sens de rotation du moteur 
const int Sens1 = 2;
const int Sens2 = 3; 

// Déclation d'un objet IRrecv
IRrecv irrecv(receiver);           
decode_results results;            

void setup()  
{
  // Init du récepteur 
  irrecv.enableIRIn();
  
  // Pins sens 1 & 2 
  pinMode(Sens1, OUTPUT);
  pinMode(Sens2, OUTPUT);
  
  // Initialisation 
  digitalWrite(Sens1, LOW);
  digitalWrite(Sens2, LOW);
}

void loop()  
{
  // Lecture de la télécommande 
  if (irrecv.decode(&results))
  {
    // Récupération du code   
    res_val = results.value;
    
    // Application d'un mode de démarrage du moteur
    MotorMode(res_val);
     
    // Réception de la nouvelle valeur
    irrecv.resume();
  }  
}

void MotorMode(long int res_val) 
{
  switch(res_val)
  {
    // Mode 1: Sens 1 
    case 0xFF30CF: // Code '1'   

      // Rotation Sens 1
      digitalWrite(Sens1, HIGH);
      digitalWrite(Sens2, LOW); 
      delay(2000); 

      // Init 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW); 
      
      break;
  
    // Mode 2: Sens 2 
    case 0xFF18E7: // Code '2'    
      
      // Rotation Sens 2 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, HIGH); 
      delay(2000); 

      // Init 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW); 
      break;
      
    // Autres 
    default: 
      digitalWrite(Sens1, LOW);
      digitalWrite(Sens2, LOW);
  }
}

Photos du projet 

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (1)

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (3)

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (4)

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (5)

Photos COMMANDE DE SENS DE ROTATION D’UN MOTEUR À CC AVEC ARDUINO (6)

Téléchargement 

Tout les projets microcontrôleur