Modifications

Sauter à la navigation Sauter à la recherche
4 652 octets ajoutés ,  30 juillet 2012 à 10:55
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}}
29 837

modifications

Menu de navigation