Go Down

Topic: [APL] Un émetteur infrarouge SIRCS (Read 2247 times) previous topic - next topic

Benoît ROUSSEAU

Un émetteur infrarouge SIRCS



Après le récepteur, j'ai voulu faire un émetteur infrarouge SIRCS... Pour piloter n'importe quel matérie SONY équipé d'un récepteur infrarouge et acceptant des commandes sur 12 bits. Et, ca fonctionne...

Cordialement,
Benoît ROUSSEAU

Benoît ROUSSEAU

La LED infrarouge

Hum, je viens de voir que j'écris toujours LED alors qu'en français c'est DEL. Bon ca passe...

Comment récupérer une LED infrarouge ? dans l'article sur le récepteur infrarouge je vous dis qu'il est trés facile de récupérer un appareil équipé d'un récepteur infrarouge. Avec un peu de chanche, vous aurez aussi la télécommande qui va avec, sinon, demandez à vos amis, ils ont tous une vielle télécommande dans un tiroir dont les touches encrassées ne fonctionnent plus. Mais comme c'est la télécommande d'origine, ils la conserve sans vraiment savoir pourquoi. Sinon, une LED infrarouge ce n'est pas cher, un achat au détail ou lors d'une commande autre ne vous mettera pas sur la paille.

Dans le cas ou vous récupereriez une vielle télécommande :



C'est une illustration, essayez de couper ou déssouder la LED infrarouge en conservant des pattes plus longues pour pouvoir insérer directement une des pattes de la LED dans une broche d'Arduino.

Remarquez que le boitier est transparent et laisse apparaître l'interieur de la LED. La cathode (-) c'est la patte reliée à la partie interne qui dessine un "r" et l'anode (+) c'est la patte reliée à la partie qui dessine un 't' en mirroir. Vous pouvez aussi repérer la cathode grâce au méplat (un petit plat) tailleé sur le bord du boitier ou même du fait que cette patte est un peu plus large à la jonction avec le boitier.
Cordialement,
Benoît ROUSSEAU

Benoît ROUSSEAU

#2
Jul 15, 2006, 12:04 pm Last Edit: Jul 15, 2006, 12:05 pm by Benoit Reason: 1
Le câblage

Trés simple !

L'anode de la LED dans la broche numérique n°4 d'Arduino, sa cathode connectée, par un fil, à une des broches GND.

Cordialement,
Benoît ROUSSEAU

Benoît ROUSSEAU

#3
Jul 15, 2006, 12:16 pm Last Edit: Jul 15, 2006, 12:18 pm by Benoit Reason: 1
Le programme

Bon, je ne vais pas m'éterniser en descriptions de lignes de code. Ce qui est à personnaliser si nécessaire un indiquer par un "[#PERSO]" sur la même ligne.

Notez que la boucle en commentaire dans la fonction setup() m'a servie à déterminer la vitesse d'execution de l'instruction digitalWrite() pour calibrer les attentes afin d'obtenir un signal de modulation à 40kHz. Sachez donc pour information qu'une instruction digitalWrite prend 10us pour s'executer. Se n'est absolument pas négligeable !

Code: [Select]
/* Exemple Emetteur SIRCS      */
/* Benoît ROUSSEAU 14/07/2006  */

#define brocheLED 13    // n° broche numérique du témoin de réception (LED)
#define brocheLED_IR 3  // [#PERSO] n° broche numérique de l'anode de la LED infrarouge

#define IR_PERIPH_ID_DEFAUT 7  // [#PERSO] n° d'ID du péripherique par défaut 7

#ifndef sbi
 #define sbi(sfr, bit) ((sfr) |= (1 << (bit)))
#endif

int trame = 0;           // contient les bits IR de la trame a envoyer hors start bit
int indexBitTrame;       // index sur les bits de la trame envoyée
unsigned int tempsTrame; // contient le temps total de la trame "utile" à savoir temps du bit de départ + bits à 1 + bits à 0 + pauses

int DMS40KHZ = 2;        // délai en microsecondes à après et entre 2 digitalWrite pour obtenir un signal à 40kHz
                        // ce délai à été obtenu par mesure avec la boucle "MESURE" en commentaires dans setup()

int irID = IR_PERIPH_ID_DEFAUT; // contient l'identifiant de l'appareil visé

/*-------------------------------------------*/
// 96 = Bit de départ
// 48 = 1
// 24 = 0
/*-------------------------------------------*/

void envoieBitSIRCS (byte nbcreneaux)
{
 for (int itmp=0; itmp < nbcreneaux; itmp++)
 {
   digitalWrite(brocheLED_IR, HIGH);
   delayMicroseconds (DMS40KHZ+1);
   digitalWrite(brocheLED_IR, LOW);
   delayMicroseconds (DMS40KHZ);
 }
 tempsTrame += (nbcreneaux >> 2); // nbcreneaux / 4 en us * 10
}

void envoiePauseSIRCS()
{
 delayMicroseconds (600);
 tempsTrame += 6;
}

void envoieTrameSIRCS12Bits (int ID, int code)
{
 // préparation de la trame

 trame = 0;
 
 for (indexBitTrame=0; indexBitTrame<5; indexBitTrame++)
   if (ID & (1 << (4-indexBitTrame)))
     sbi (trame, indexBitTrame);

 for (; indexBitTrame<12; indexBitTrame++)
   if (code & (1 << (11-indexBitTrame)))
     sbi (trame, indexBitTrame);

 digitalWrite (brocheLED, HIGH); // témoin lunineux visible allumé
   
 // envoyer 4 trames à la suite
 for (int noTrame=0; noTrame < 4; noTrame++)
 {
   tempsTrame = 0;
   
   envoieBitSIRCS(96); // bit dep.
   envoiePauseSIRCS();
   for (indexBitTrame = 11; indexBitTrame >= 0; indexBitTrame--)
   {
     if (trame & (1 << (indexBitTrame)))
       envoieBitSIRCS(48); // 1
     else
       envoieBitSIRCS(24); // 0
     envoiePauseSIRCS();
   }

   // délai de fin de trame, la trame doit durée 45ms au total    
   tempsTrame /= 10;
   delay (45 - tempsTrame);
 }
 
   digitalWrite (brocheLED, LOW); // témoin lunineux visible éteint
}

// FONCTIONS ARDUINO

void setup ()
{
 Serial.begin (9600);
 pinMode (brocheLED_IR, OUTPUT);
 pinMode (brocheLED, OUTPUT);

/*
 // boucle de mesure
 unsigned long ta, tb;
 ta = millis();
 for (itmp=0; itmp<1000; itmp++)
 {
   digitalWrite(brocheLED_IR, LOW);
   delayMicroseconds (DMS40KHZ+1);
   digitalWrite(brocheLED_IR, LOW);
   delayMicroseconds (DMS40KHZ);
 }
 tb = millis();
 Serial.print (tb-ta);  // après essai, retoune 25
*/
}

void loop ()
{
   while (Serial.available())
   {
     switch (Serial.read())
     {
       case 'l' : envoieTrameSIRCS12Bits (irID, 26); // lecture
                  Serial.print ("[Lecture]");
                  break;
       case 's' : envoieTrameSIRCS12Bits (irID, 24); // stop
                  Serial.print ("[Stop]");
                  break;
       case 'p' : envoieTrameSIRCS12Bits (irID, 25); // pause
                  Serial.print ("[Pause]");
                  break;
     }
     Serial.print (13, BYTE); // à la ligne
   }
}


Que fait ce programme ?

Connectée à l'ordinateur, moniteur série ouvert (hyperTerminal par exemple), la carte envoie des ordres infrarouge lecture, pause ou stop quand vous taper respectivement dans votre moniteur série les lettres l, p, s. Ca vous permet donc de piloter un magnétoscope Sony à partir de votre moniteur série. Ca donne quelque chose comme ceci sur l'écran du moniteur série :



Notez que par défaut l'identifiant de l'appareil visé est 7 soit un camescope mini-DV en mode "Play/Edit". C'est le seul appareil SONY que l'on ai pu me prêter :).

Je reste à votre diposition si vous avez des questions.
Cordialement,
Benoît ROUSSEAU

francois34

Bonjour,

J'ai trouvé très intéressant votre post sur l'émetteur infrarouge SIRCS. En fait j'aimerais savoir s'il est possible de piloter complètement un lecteur DVD de cette manière, je veux dire, qu'en plus d'envoyer des messages [lecture] [pause] ou [stop], pourrait-on manoeuvrer les [flèches] de la télécommande? Et donc en ayant un DVD avec menu, piloter le déroulement des chapitres à partir de la Arduino?

En fait j'ai seulement testé le sketch correspondant - et qui fonctionne sans problème - sans avoir testé
avec une télécommande, mais je fais confiance. Car mon idée serait de piloter un DVD à partir de Arduino: Brancher un capteur - ultrason par exemple - sur la carte et piloter ainsi les chapitres du DVD. A la limite je préfèrerais supprimer la télécommande infrarouge, et utiliser un système avec fil. Mais le principe doit être le même, n'est-ce-pas?

Si vous avez des idées, des conseils, merci d'avance, et bravo pour vos recherches.

Benoît ROUSSEAU

Bonjour,

Merci :) pour votre intérêt à mon modeste post.

OUI, bien sûr, il est possible d'envoyer n'importe quel code SIRCS via ce programme charger dans Ardduino. Pour cela, vous devez modifier dans les parties : --> envoieTrameSIRCS12Bits (irID, 26); // lecture <-- la valeur du code IR (ici 26 pour lecture). Pour chaque code vous avez une fonction définie par Sony. Notez aussi la variable irID dont vous devrez modifier la valeur pour que l'émetteur s'adresse à votre lecteur DVD et non pas à un téléviseur ou un magnétoscope.

Où trouver ses valeurs me direz vous ? Et bien votre moteur de recherche favoris est votre ami... Et il vous donnera par exemple cette adresse : http://www.boehmel.de/sircs.htm qui vous donnera tous les codes. Il est possible que vous ayez à modifier le programme pour qu'il envoie plus de 12 bits si les lecteurs de DVDs le nécessite.

Pour ce qui est d'utiliser un câble en place de la liaison infrarouge, pas de pb particulier étant donné qu'il suffit de remplacer la LED IR par un câble pour que cela fonctionne. Enfin presque, une petite adaptation de niveau sera sûrement nécessaire. Je ne me souviens plus des niveaux d'entrée d'une prise télécommande SRCS mais vous trouverez sur Internet via votre moteur de recherche.

Je ne peux malheureusement pas allez plus loin car je n'ai pas de lecteur DVD Sony pour tester. Il m'est donc difficile de vous donner du code prêt à l'emploi.




Cordialement,
Benoît ROUSSEAU

deldude

Bonjour,

Petite question tout bête est-ce possible de faire la même chose mais en utilisant les PWM hardware?

A+


Go Up