Différences entre versions de « Senseur IR Utiliser »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
(Page créée avec « {{SenseurIR-Nav}} == xxx == xxx {{ADF-Accord}} {{MCH-Accord}} »)
 
Ligne 1 : Ligne 1 :
 
{{SenseurIR-Nav}}
 
{{SenseurIR-Nav}}
  
== xxx ==
+
The good news is that it is very easy to hook up this sensor. Just connect the output to a digital pin. The bad news is that the Arduino's friendly digitalRead() procedure is a tad too slow to reliably read the fast signal as its coming in. Thus we use the hardware pin reading function directly from pin D2, thats what the line "IRpin_PIN & BV(IRpin))" does.
xxx
+
 
 +
[[Fichier:IR-Arduino-1.jpg]]
 +
 
 +
[http://github.com/adafruit/Raw-IR-decoder-for-Arduino Vous pouvez obtenir la dernière version du code sur le github d'AdaFruit.]
 +
 
 +
<nowiki>
 +
 
 +
 
 +
    /* Raw IR decoder sketch!
 +
    This sketch/program uses the Arduno and a PNA4602 to
 +
    decode IR received. This can be used to make a IR receiver
 +
    (by looking for a particular code)
 +
    or transmitter (by pulsing an IR LED at ~38KHz for the
 +
    durations detected
 +
    Code is public domain, check out www.ladyada.net and adafruit.com
 +
    for more tutorials!
 +
    */
 +
   
 +
    // We need to use the 'raw' pin reading methods
 +
    // because timing is very important here and the digitalRead()
 +
    // procedure is slower!
 +
    //uint8_t IRpin = 2;
 +
    // Digital pin #2 is the same as Pin D2 see
 +
    // http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
 +
    #define IRpin_PIN PIND
 +
    #define IRpin 2
 +
   
 +
    // the maximum pulse we'll listen for - 65 milliseconds is a long time
 +
    #define MAXPULSE 65000
 +
   
 +
    // what our timing resolution should be, larger is better
 +
    // as its more 'precise' - but too large and you wont get
 +
    // accurate timing
 +
    #define RESOLUTION 20
 +
   
 +
    // we will store up to 100 pulse pairs (this is -a lot-)
 +
    uint16_t pulses[100][2]; // pair is high and low pulse
 +
    uint8_t currentpulse = 0; // index for pulses we're storing
 +
   
 +
    void setup(void) {
 +
    Serial.begin(9600);
 +
    Serial.println("Ready to decode IR!");
 +
    }
 +
   
 +
    void loop(void) {
 +
    uint16_t highpulse, lowpulse; // temporary storage timing
 +
    highpulse = lowpulse = 0; // start out with no pulse length
 +
    // while (digitalRead(IRpin)) { // this is too slow!
 +
    while (IRpin_PIN & (1 << IRpin)) {
 +
    // pin is still HIGH
 +
   
 +
    // count off another few microseconds
 +
    highpulse++;
 +
    delayMicroseconds(RESOLUTION);
 +
   
 +
    // If the pulse is too long, we 'timed out' - either nothing
 +
    // was received or the code is finished, so print what
 +
    // we've grabbed so far, and then reset
 +
    if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
 +
    printpulses();
 +
    currentpulse=0;
 +
    return;
 +
    }
 +
    }
 +
    // we didn't time out so lets stash the reading
 +
    pulses[currentpulse][0] = highpulse;
 +
    // same as above
 +
    while (! (IRpin_PIN & _BV(IRpin))) {
 +
    // pin is still LOW
 +
    lowpulse++;
 +
    delayMicroseconds(RESOLUTION);
 +
    if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
 +
    printpulses();
 +
    currentpulse=0;
 +
    return;
 +
    }
 +
    }
 +
    pulses[currentpulse][1] = lowpulse;
 +
   
 +
    // we read one high-low pulse successfully, continue!
 +
    currentpulse++;
 +
    }
 +
   
 +
    void printpulses(void) {
 +
    Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
 +
    for (uint8_t i = 0; i < currentpulse; i++) {
 +
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
 +
    Serial.print(" usec, ");
 +
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
 +
    Serial.println(" usec");
 +
    }
 +
    // print it in a 'array' format
 +
    Serial.println("int IRsignal[] = {");
 +
    Serial.println("// ON, OFF (in 10's of microseconds)");
 +
    for (uint8_t i = 0; i < currentpulse-1; i++) {
 +
    Serial.print("\t"); // tab
 +
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
 +
    Serial.print(", ");
 +
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
 +
    Serial.println(",");
 +
    }
 +
    Serial.print("\t"); // tab
 +
    Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
 +
    Serial.print(", 0};");
 +
    }
 +
</nowiki>
 +
 
 +
Si vous utilisez ce programme et utilisez une télécommande Sony sur laquelle vous pressez le bouton Marche (On), vous obtiendrez le résultat suivant...
 +
 
 +
[[Fichier:IR-Arduino-2.jpg]]
 +
 
 +
Si vous ignorez la première impulstion OFF (correspond au temps nécessaire au programme Arduino pour s'activer à la première réception du signal InfraRouge) et la dernière impulsion ON (qui est le début du code suivant) vous identifierez le code POWER de Sony:
 +
 
 +
{|
 +
| align="center" style="background:#f0f0f0;"|'''PWM ON'''
 +
| align="center" style="background:#f0f0f0;"|'''OFF'''
 +
|-
 +
| 2.5 ms ||0.6 ms
 +
|-
 +
| 1.2 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 1.2 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 1.2 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 1.2 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||0.6 ms
 +
|-
 +
| 0.6 ms ||270 ms
 +
|}
 +
 
  
 
{{ADF-Accord}}
 
{{ADF-Accord}}
  
 
{{MCH-Accord}}
 
{{MCH-Accord}}

Version du 30 juillet 2012 à 10:55

The good news is that it is very easy to hook up this sensor. Just connect the output to a digital pin. The bad news is that the Arduino's friendly digitalRead() procedure is a tad too slow to reliably read the fast signal as its coming in. Thus we use the hardware pin reading function directly from pin D2, thats what the line "IRpin_PIN & BV(IRpin))" does.

IR-Arduino-1.jpg

Vous pouvez obtenir la dernière version du code sur le github d'AdaFruit.



    /* Raw IR decoder sketch!
    This sketch/program uses the Arduno and a PNA4602 to
    decode IR received. This can be used to make a IR receiver
    (by looking for a particular code)
    or transmitter (by pulsing an IR LED at ~38KHz for the
    durations detected
    Code is public domain, check out www.ladyada.net and adafruit.com
    for more tutorials!
    */
     
    // We need to use the 'raw' pin reading methods
    // because timing is very important here and the digitalRead()
    // procedure is slower!
    //uint8_t IRpin = 2;
    // Digital pin #2 is the same as Pin D2 see
    // http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
    #define IRpin_PIN PIND
    #define IRpin 2
     
    // the maximum pulse we'll listen for - 65 milliseconds is a long time
    #define MAXPULSE 65000
     
    // what our timing resolution should be, larger is better
    // as its more 'precise' - but too large and you wont get
    // accurate timing
    #define RESOLUTION 20
     
    // we will store up to 100 pulse pairs (this is -a lot-)
    uint16_t pulses[100][2]; // pair is high and low pulse
    uint8_t currentpulse = 0; // index for pulses we're storing
     
    void setup(void) {
    Serial.begin(9600);
    Serial.println("Ready to decode IR!");
    }
     
    void loop(void) {
    uint16_t highpulse, lowpulse; // temporary storage timing
    highpulse = lowpulse = 0; // start out with no pulse length
    // while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
    // pin is still HIGH
     
    // count off another few microseconds
    highpulse++;
    delayMicroseconds(RESOLUTION);
     
    // If the pulse is too long, we 'timed out' - either nothing
    // was received or the code is finished, so print what
    // we've grabbed so far, and then reset
    if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
    printpulses();
    currentpulse=0;
    return;
    }
    }
    // we didn't time out so lets stash the reading
    pulses[currentpulse][0] = highpulse;
    // same as above
    while (! (IRpin_PIN & _BV(IRpin))) {
    // pin is still LOW
    lowpulse++;
    delayMicroseconds(RESOLUTION);
    if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
    printpulses();
    currentpulse=0;
    return;
    }
    }
    pulses[currentpulse][1] = lowpulse;
     
    // we read one high-low pulse successfully, continue!
    currentpulse++;
    }
     
    void printpulses(void) {
    Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
    for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
    }
    // print it in a 'array' format
    Serial.println("int IRsignal[] = {");
    Serial.println("// ON, OFF (in 10's of microseconds)");
    for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
    Serial.println(",");
    }
    Serial.print("\t"); // tab
    Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
    Serial.print(", 0};");
    }

Si vous utilisez ce programme et utilisez une télécommande Sony sur laquelle vous pressez le bouton Marche (On), vous obtiendrez le résultat suivant...

IR-Arduino-2.jpg

Si vous ignorez la première impulstion OFF (correspond au temps nécessaire au programme Arduino pour s'activer à la première réception du signal InfraRouge) et la dernière impulsion ON (qui est le début du code suivant) vous identifierez le code POWER de Sony:

PWM ON OFF
2.5 ms 0.6 ms
1.2 ms 0.6 ms
0.6 ms 0.6 ms
1.2 ms 0.6 ms
0.6 ms 0.6 ms
1.2 ms 0.6 ms
0.6 ms 0.6 ms
0.6 ms 0.6 ms
1.2 ms 0.6 ms
0.6 ms 0.6 ms
0.6 ms 0.6 ms
0.6 ms 0.6 ms
0.6 ms 270 ms


Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.