Comment lire un signal infrarouge avec Arduino
Cet article est le deuxième d’une série sur l’Arduino. Si vous avez manqué le premier, je vous invite à le lire avant celui-ci. Aujourd’hui, je vais vous expliquer comment on peut lire un signal infrarouge avec un Arduino.
Build of material (BOM)
- Un Arduino
- Un récepteur infrarouge (ou équivalent)
Préparation
Avant toute chose, il faut comprendre comment fonctionne l’infrarouge. Ce que je vais démontrer, c’est comment on peut lire les signaux de n’importe quelle télécommande, traiter le signal reçu, puis produire une sortie.
Sur le devant des télécommandes, on retrouve des diodes électroluminescentes à ondes infrarouges (ou IR LED). Lorsque vous appuyez sur un bouton de la télécommande, une série de modules électroniques travaillent de concert pour émettre des bits avec la lumière (infrarouge) produite par la LED.
Avec l’Arduino et un récepteur infrarouge, il est donc possible de lire le signal, le traiter d’une quelconque façon, puis produire une sortie.
Vous voyez sur l’image ci-dessus le récepteur en question. Il en existe plusieurs modèle et je crois (oops) que le mien est celui que j’ai mis dans le BOM au début de l’article. De toute façon, il fonctionne. J’en ai juste grillé un 😅.
Donc, en regardant le récepteur de face comme sur la photo, la patte 1 s’en va dans la pin 7 ou une autre entrée digitale. À l’intérieur du récepteur, il y a un microcontrôleur qui traite le signal infrarouge et produit un signal digital sous forme de bits. Dans ce petit truc!
La patte 2 a été connectée au ground et la troisième à la source de courant de 5v.
Un peu de code
Parce que c’est un blogue de code après tout… Je lance l’EDI d’Arduino. Puis j’installe cette librairie qui permet de traiter le signal binaire du récepteur. En gros, elle simplifie la synchronisation entre la lecture de la pin et la fréquence à laquelle le signal est émis (0 ou 1) par le récepteur infrarouge.
Puis je téléverse ce code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <IRremote.h> const int IR_PIN = 7; IRrecv irrecv(IR_PIN); decode_results results; void setup(){ Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true); } void loop(){ if (irrecv.decode(&results)){ if (results.value == 0x490) { Serial.println("Vol UP"); } else if (results.value == 0xc90) { Serial.println("Vol DOWN"); } irrecv.resume(); } } |
Si vous avez de la difficulté à comprendre, je vous invite à relire mon introduction à Arduino. Après avoir instancié et initialisé la librairie, dans la boucle du programme, je récupère la valeur lue avec irrecv.decode(), puis dépendant de la valeur, j’écris dans la « console » si le signal reçu correspond à la touche pour monter ou baisser le volume.
Note : J’ai obtenu ces valeurs en téléversant un sketch qui affiche les données reçues dans la « console ».
Note 2 : La « console » est le port série qui permet à Arduino de communiquer avec votre PC.
Conclusion
Aujourd’hui, vous avez appris à lire un signal infrarouge de n’importe quelle télécommande avec un Arduino et d’exécuter un bout de code selon le bouton appuyé. Bon, j’avoue que c’est relativement simple comme projet. Je propose de bâtir sur ça et d’explorer ensemble jusqu’à ce qu’on arrive avec un projet plus complexe.
Si vous avez aimé, partagez avec vos collègues et amis sur les réseaux sociaux. Vous êtes notre gaz!
Commentaires
6 commentaires
Bonjour Sylvain,
Je me permets de vous écrire pour avoir quelques conseils.
Je débute avec arduino et j’aimerais faire un compte à rebours de 60 secondes qui serait actionné par une télécommande avec les fonctions START, RESUME et STOP.
Mon decompte marche trés bien sans télécommande.
Malheureusement je ne sais pas quelle ligne de code écrire pour rentrer ses fonctions.
Pouvez vous m’aider sur ce point ?
D’avance merci pour votre aide
Thomas BURA
Ci-dessous le code utilisé pour le décompte copié collé sur internet
/**
* @file countdown_7segment.c
*
* @brief exercise to create a countdown timer
* using a 2-digit 7-Segment display
*
* @history exercise proposed Oct 28th, 2015
*
* @author Allan M Schwartz, allans@CodeValue.net
*
* @notes The following Arduino Pins are attached:
*
* name Arduino 7 Segment display
* —– —- —–
* D1-a D2 11
* D1-b D3 10
* D1-c D4 8
* D1-d D5 6
* D1-e D6 5
* D1-f D7 12
* D1-g D8 7
* anode +5 13
*
* D10-a D10 16
* D10-b D11 15
* D10-c D12 3
* D10-d D13 2
* D10-e D14/A0 1
* D10-f D15/A1 18
* D10-g D16/A2 17
* anode +5 14
*
* SW1 D17/A3
*/
// the 1’s digit pins a-g are digital pins 2-8
const byte ONES_DIGIT = 2;
// the 10’s digit pins a-g are digital pins 10-17
const byte TENS_DIGIT = A0;
const byte numbers[10][7] = {
// 0: segment lit, 1: segment unlit
// a b c d e f g
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1}, // 9
};
void setup(void) {
set_pinMode(ONES_DIGIT);
set_pinMode(TENS_DIGIT);
}
void set_pinMode(byte pin) {
for ( byte i = 0; i < 7; i++, pin++ )
pinMode(pin, OUTPUT);
}
void sevenSegmentClear(byte pin) {
for ( byte i = 0; i < 7; i++, pin++ )
digitalWrite(pin, 1);
}
// … display the digit {0..9} in either the ones or tens DIGIT
void sevenSegmentDigit(byte digit, byte pin) {
for ( byte i = 0; i = 0; seconds– ) {
sevenSegment_nn(seconds);
delay(1000);
}
// … flash the display for a few more seconds
for ( int seconds = 4; seconds >= 0; seconds– ) {
sevenSegmentClear(TENS_DIGIT);
sevenSegmentClear(ONES_DIGIT);
delay(500);
sevenSegment_nn(00);
delay(500);
}
delay(1000);
}
Est-ce que tu peux m’écrire par courriel? sylvain.cloutier@ezoqc.com
Bonjour
je tente de lire les codes envoyés par une télécommande avec votre programme que j’ai recopié très exactement et le moniteur sortie m’affiche plein de lignes identiques avec le texte ci-dessous :
The function decode ( &results ) ) is deprecated aThe function decode ( &results ) ) is deprecated and may not work as expected ! Just use decode () – without any parameter,
Comme je suis un vieux monsieur qui se lance dans l’informatique je n’y comprends pas un mot..
MERCI d’avance
cordialement
jean
Il semble effectivement que la librairie d’Arduino ne soit plus compatible avec cet article :/ Tu peux voir la documentation ici : https://github.com/Arduino-IRremote/Arduino-IRremote#converting-your-2x-program-to-the-3x-version
Bonjour
Je souhaite communiquer en infrarouge avec un équipement électronique dans un WATER TOYS complètement étanche.
Cordialement
JFA
Bonjour,
Avez vous reçu mon courriel, pouvez vous me venir en aide.
Merci
Cordialement
JFA
Laisser un commentaire