Le programmeBon, 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 !
/* 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.