Passer au contenu principal Passer à la recherche Passer à la navigation principale
Menu

Utiliser une télécommande infrarouge avec Arduino


Dans ce tutoriel, nous vous montrons comment utiliser une télécommande infrarouge avec récepteur sur une carte compatible Arduino UNO.

Vue d'ensemble

Les télécommandes infrarouges émettent des impulsions binaires sous forme de signaux dans la plage infrarouge invisible. Pour éviter les signaux parasites provenant d'autres sources, les signaux sont pré-modulés puis émis à une fréquence spécifique à l'aide d'une LED IR.

Le récepteur IR possède généralement une photodiode IR qui reçoit les signaux à une fréquence spécifique et filtre les perturbations provenant d'autres sources lumineuses. Derrière la photodiode IR se trouve généralement un amplificateur de signal et un démodulateur pour permettre le traitement ultérieur du signal.

Composants nécessaires

  • Carte compatible Arduino UNO R3
  • Plaque d'essai
  • 11 câbles de connexion
  • 1 télécommande IR
  • 1 récepteur IR
  • 6 résistances de 220 Ohm
  • 6 LED
  • Fernbedienung.ino

Ignorer la galerie de produits
20
yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino – Image 2

Note moyenne de 5 sur 5 étoiles

(6)
yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino
RBS14165

Disponible immédiatement

Prix de vente : A partir de 10,12 € Prix régulier : 12,65 €
MB102 carte breadboard 830 contacts MB102 carte breadboard 830 contacts – Image 2

Note moyenne de 4.9 sur 5 étoiles

(20)
MB102 carte breadboard 830 contacts
RBS10155

Disponible immédiatement

Prix régulier : A partir de 1,09 €
Kit de 65 câbles jumper

Note moyenne de 4.9 sur 5 étoiles

(5)
Kit de 65 câbles jumper
RBS10023

Disponible immédiatement

Prix régulier : A partir de 1,59 €
Kit infrarouge télécommande récepteur Kit infrarouge télécommande récepteur – Image 2

Note moyenne de 5 sur 5 étoiles

(1)
Kit infrarouge télécommande récepteur
RBS10374

Disponible immédiatement

Prix régulier : A partir de 2,05 €
Résistance à couche métallique 1% 1/4W 10M Ohm Résistance à couche métallique 1% 1/4W 10M Ohm – Image 2

Note moyenne de 0 sur 5 étoiles

Résistance à couche métallique 1% 1/4W 220Ω
RBS13971

Disponible immédiatement

Prix régulier : A partir de 0,01 €
100 x LED 5 mm - triées blanc, rouge, jaune, bleu, vert 100 x LED 5 mm - triées blanc, rouge, jaune, bleu, vert – Image 2

Note moyenne de 5 sur 5 étoiles

(8)
100 x LED 5 mm - triées blanc, rouge, jaune, bleu, vert
RBS11692

Disponible immédiatement

Prix régulier : A partir de 1,59 €
Kit de démarrage pour Arduino UNO R3 RFID Kit de démarrage pour Arduino UNO R3 RFID – Image 2

Note moyenne de 4.83 sur 5 étoiles

(24)
Kit de démarrage pour Arduino UNO R3 RFID
RBS11368

Disponible immédiatement

Prix régulier : A partir de 28,95 €

Fonctionnement

Le récepteur IR convertit le signal lumineux émis par la LED IR en un signal électronique faible. Ce signal est ensuite amplifié par un circuit intégré, automatiquement filtré, lissé et démodulé jusqu'à ce que le signal original de la télécommande soit restauré. Ce signal est ensuite envoyé à la broche de sortie du récepteur IR.

Chiffrement avec le protocole NEC

Pour lire les signaux d'une télécommande infrarouge, il faut d'abord connaître la manière dont ils sont chiffrés. Le chiffrement dans notre exemple est le protocole NEC.


Données techniques du protocole NEC

  • Adresses sur 8 bits et commandes sur 8 bits.
  • L'adresse et la commande sont toujours répétées pour une meilleure fiabilité.
  • Modulation par distance d'impulsions (PDM)
  • Fréquence de 38 kHz
  • Temps de bit de 1,125 ms ou 2,25 ms

Définition de 0 et 1 dans le protocole NEC (Image 1)

Transmission du signal par simple pression d'un bouton sur la télécommande (image 2)

Cette illustration montre une séquence d'impulsions typique du protocole NEC. Avec ce protocole, le LSB (Least Significant Bit) est transmis en premier. Dans ce cas, l'adresse $59 et la commande $16 sont transmises. Un message est introduit par une salve AGC de 9 ms, qui était utilisée avec les anciens récepteurs IR pour régler le gain. AGC est l'abréviation de l'anglais « automatic gain control » et sert à maintenir constant le niveau de sortie d'un amplificateur.

Cette salve AGC est suivie d'un espace de 4,5 ms, puis de l'adresse et de la commande. L'adresse et la commande sont transmises deux fois afin de réduire le taux d'erreurs. Lors de la deuxième transmission, tous les bits sont inversés et peuvent être utilisés pour vérifier le message reçu. La durée totale de transmission est constante, car chaque bit est répété avec sa longueur inversée. Si cette fiabilité n'est pas nécessaire, Sie pouvez ignorer les valeurs inversées ou étendre l'adresse et la commande à 16 bits chacune.

Une impulsion est envoyée lorsqu'une touche est enfoncée puis relâchée après un certain temps.

Une commande n'est transmise qu'une seule fois, même si la touche de la télécommande reste enfoncée. Toutes les 110 ms, un code de répétition est envoyé tant que la touche reste enfoncée. Ce code de répétition est simplement une rafale AGC de 9 ms, suivie d'une pause de 2,25 ms et d'une rafale de 560 µs.

Lorsque l'impulsion arrive au récepteur, un décodage, une amplification du signal et un lissage de l'onde ont lieu. Il doit être garanti que le niveau de sortie soit exactement l'inverse de celui du signal émis. Cela signifie que, lorsqu'il n'y a pas de signal infrarouge, le niveau de sortie est haut ; lorsqu'un signal infrarouge est présent, le niveau de sortie est bas. Le signal du récepteur peut être analysé à l'aide d'un oscilloscope pour mieux comprendre le signal.

Schéma de connexion

cliquez sur les images pour agrandir

La broche VOUT du récepteur IR est connectée à la broche 11. Les LED avec les résistances sont branchées sur les broches 2, 3, 4, 5, 6, 7. L'alimentation se fait via le bus de la plaque d'essai, connecté au GND et au 5V de l'Arduino.


Code pour Arduino

Pour le code, la bibliothèque IRremote est utilisée. Le programme décode le signal chiffré de la télécommande IR. Ainsi, les signaux de la télécommande peuvent être lus dans le moniteur série de l'IDE Arduino. Avec ces signaux, l'application - dans cet exemple, les 6 LED - peuvent être contrôlées.

Les codes peuvent varier selon la télécommande et le lot. Par exemple, si vous souhaitez modifier l'affectation des touches pour allumer la première LED, il faut modifier la ligne suivante :

long on1 = 0x00FFA25D;

Cette ligne est ajustée pour allumer la première LED. Comme on peut le voir dans le moniteur série, FFA25D correspond à la première touche de la télécommande.

Vous pouvez ensuite télécharger à nouveau le croquis modifié et allumer les LEDs à l'aide de la touche. Ainsi, vous pouvez attribuer toutes les LEDs aux touches une par une.

Afficher / masquer le code
#include <IRremote.h>

int RECV_PIN = 11; // Pin vom IR-Empfänger
int LED1 = 2; // LED Pin
int LED2 = 3; // LED Pin
int LED3 = 4; // LED Pin
int LED4 = 5; // LED Pin
int LED5 = 6; // LED Pin
int LED6 = 7; // LED Pin

// Ab hier können Sie die Tastenbelegung anpassen
long on1 = 0x00FFA25D;
long off1 = 0x00FFE01F;
long on2 = 0x00FF629D;
long off2 = 0x00FFA857;
long on3 = 0x00FFE21D;
long off3 = 0x00FF906F;
long on4 = 0x00FF22DD;
long off4 = 0x00FF6897;
long on5 = 0x00FF02FD;
long off5 = 0x00FF9867;
long on6 = 0x00FFC23D;
long off6 = 0x00FFB04F;

IRrecv irrecv(RECV_PIN);
decode_results results;

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.println("Could not decode message");
  } else {
    if (results->decode_type == NEC) {
      Serial.print("Decoded NEC: ");
    } else if (results->decode_type == SONY) {
      Serial.print("Decoded SONY: ");
    } else if (results->decode_type == RC5) {
      Serial.print("Decoded RC5: ");
    } else if (results->decode_type == RC6) {
      Serial.print("Decoded RC6: ");
    }
    Serial.print(results->value, HEX);
    Serial.print(" (");
    Serial.print(results->bits, DEC);
    Serial.println(" bits)");
  }
  
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

void setup() {
  pinMode(RECV_PIN, INPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);

  irrecv.enableIRIn(); // Start the receiver
}

int on = 0;
unsigned long last = millis();

void loop() {
  if (irrecv.decode(&results)) {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) {
      on = !on;
      // digitalWrite(8, on ? HIGH : LOW);
      digitalWrite(13, on ? HIGH : LOW);
      dump(&results);
    }
    if (results.value == on1)
      digitalWrite(LED1, HIGH);
    if (results.value == off1)
      digitalWrite(LED1, LOW);
    if (results.value == on2)
      digitalWrite(LED2, HIGH);
    if (results.value == off2)
      digitalWrite(LED2, LOW);
    if (results.value == on3)
      digitalWrite(LED3, HIGH);
    if (results.value == off3)
      digitalWrite(LED3, LOW);
    if (results.value == on4)
      digitalWrite(LED4, HIGH);
    if (results.value == off4)
      digitalWrite(LED4, LOW);
    if (results.value == on5)
      digitalWrite(LED5, HIGH);
    if (results.value == off5)
      digitalWrite(LED5, LOW);
    if (results.value == on6)
      digitalWrite(LED6, HIGH);
    if (results.value == off6)
      digitalWrite(LED6, LOW);
    last = millis();
    irrecv.resume(); // Receive the next value
  }
}