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}} |