lundi 21 janvier 2013

Clonage d'une télécommande infrarouge avec un Arduino (3)

Cette rubrique fait suite à Clonage d'une télécommande infrarouge avec un Arduino (1) et Clonage d'une télécommande infrarouge avec un Arduino (2), où nous avons appris comment capter les impulsions infrarouges émises par une télécommande de téléviseur, et à les réémettre au moyen d'un Arduino.

Aujourd'hui, il ne me reste plus qu'à ajouter quelques boutons à l'Arduino afin de produire une télécommande pleinement fonctionnelle.


Voici le problème:  j'utilise un vieux téléviseur analogique muni d'une boîte de conversion analogique-numérique.  Pour allumer ou éteindre le téléviseur, ou encore pour changer le volume, il faut utiliser la télécommande du téléviseur.  Mais pour changer de chaîne, il faut utiliser la télécommande du convertisseur analogique-numérique...en gros, la famille n'utilise que 5 boutons, mais ils sont disposés sur deux télécommandes différentes!


J'ai donc assemblé un prototype de télécommande ne comportant que 6 boutons correspondant aux fonctions fréquemment utilisées:  marche/arrêt, channel up, channel down, volume up, volume down et input. Bien entendu, une LED infrarouge est branchée à la sortie numéro 3 de l'Arduino.

Voici les détails du circuit:



Et voici mon sketch, mais bien sûr les messages envoyés au téléviseurs sont très spécifiques au modèle que je possède (vous devrez procéder tel que décrit dans les rubriques précédentes pour connaître les codes de votre modèle de télécommande).

/*
Sketch pour télécommande à 6 boutons permettant
de contrôler mon téléviseur (ça ne fonctionnera
probablement pas pour votre modèle!)
LED infrarouge branchée à la pin 3
https://electroniqueamateur.blogspot.com/2013/01/clonage-dune-telecommande-infrarouge_21.html
*/
#include <IRremote.h>
IRsend irsend;
// là où sont branchés les boutons
int on_off_button = 8;
int ch_down_button = 9;
int ch_up_button = 10;
int vol_down_button = 11;
int vol_up_button = 12;
int input_button = 13;
unsigned int L = 1800; //durée d'un 1
unsigned int C = 800; //durée d'un 0
unsigned int X = 300; // durée d'une impulsion lumineuse
unsigned long time;
// signal on-off
unsigned int on_off_1[] = {
X,L,X,C,X,C,X,C,X,C,X,C,X,L,X,L,X,C,X,L,X,C,X,C,X,C,X,L,X,C,X};
unsigned int on_off_2[] = {
X,L,X,C,X,C,X,C,X,C,X,L,X,C,X,C,X,L,X,C,X,L,X,L,X,L,X,C,X,L,X};
// signal vol up
unsigned int vol_up_1[] = {
X,L,X,C,X,C,X,C,X,C,X,C,X,C,X,L,X,C,X,L,X,C,X,C,X,C,X,L,X,C,X};
unsigned int vol_up_2[] = {
X,L,X,C,X,C,X,C,X,C,X,L,X,L,X,C,X,L,X,C,X,L,X,L,X,L,X,C,X,L,X};
// signal vol down
unsigned int vol_down_1[] = {
X,L,X,C,X,C,X,C,X,C,X,L,X,C,X,L,X,C,X,L,X,C,X,C,X,C,X,L,X,C,X};
unsigned int vol_down_2[] = {
X,L,X,C,X,C,X,C,X,C,X,C,X,L,X,C,X,L,X,C,X,L,X,L,X,L,X,C,X,L,X};
// signal input
unsigned int input_1[] = {
X,L,X,C,X,C,X,C,X,C,X,L,X,L,X,C,X,C,X,L,X,C,X,C,X,C,X,L,X,C,X};
unsigned int input_2[] = {
X,L,X,C,X,C,X,C,X,C,X,C,X,C,X,L,X,L,X,C,X,L,X,L,X,L,X,C,X,L,X};
void setup()
{
pinMode(on_off_button, INPUT);
pinMode(ch_down_button, INPUT);
pinMode(ch_up_button, INPUT);
pinMode(vol_down_button, INPUT);
pinMode(vol_up_button, INPUT);
pinMode(input_button, INPUT);
}
void loop() {
if (digitalRead(on_off_button))
{
irsend.sendRaw(on_off_1, 31, 38);
delay(30);
irsend.sendRaw(on_off_2, 31, 38);
delay(30);
irsend.sendRaw(on_off_1, 31, 38);
delay(200);
}
if (digitalRead(vol_up_button))
{
irsend.sendRaw(vol_up_1, 31, 38);
delay(30);
irsend.sendRaw(vol_up_2, 31, 38);
delay(30);
irsend.sendRaw(vol_up_1, 31, 38);
delay(200);
}
if (digitalRead(vol_down_button))
{
irsend.sendRaw(vol_down_1, 31, 38);
delay(30);
irsend.sendRaw(vol_down_2, 31, 38);
delay(30);
irsend.sendRaw(vol_down_1, 31, 38);
delay(200);
}
if (digitalRead(input_button))
{
irsend.sendRaw(input_1, 31, 38);
delay(30);
irsend.sendRaw(input_2, 31, 38);
delay(30);
irsend.sendRaw(input_1, 31, 38);
delay(200);
}
if (digitalRead(ch_up_button))
{
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xFDB04F, 32);
delay(40);
}
}
if (digitalRead(ch_down_button))
{
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xFD8877, 32);
delay(40);
}
}
}

Ça fonctionne à la perfection!  Il ne reste plus qu'à trouver un réceptacle pour en faire un objet un peu plus...design.   Pour ce faire, je prévois construire mon appareil autour un Atmega 328 autonome (tel qu'expliqué ici).


Yves Pelletier (Twitter: @ElectroAmateur)

1 commentaire:

  1. Bonjour, tout d'abord un grand merci pour votre blog !
    Je debute dans l'electronique et je voudrait cloner ma telecommande de clim .Sauf que j'aimerais commander le tout par un ecran tft , donc pourriez vous m'aider ?
    J'ai recuperer les protocoles qui sont pour exemples :
    Decoded nec C3020700 (32 bits)
    Je comprend pas comment faire mon sketch
    merci

    RépondreSupprimer