Différences entre versions de « Senseur IR Utiliser »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
Ligne 176 : Ligne 176 :
  
  
{{ADF-Accord}}
+
{{SenseurIR-TRAILER}}
 
 
{{MCH-Accord}}
 

Version actuelle datée du 25 août 2013 à 19:12

La bonne nouvelle c'est qu'il est vraiment très facile
de raccorder ce senseur. Il suffit de connecter la sortie
sur une pin digital.

La mauvaise nouvelle, c'est que la procédure digitalRead()
d'Arduino qui est si facile d'emploi est un peu trop lente pour ce type
d'application. digitalRead() ne peut pas offrir une lecture fiable
lorsqu'un signal aussi rapide est fourni au microcontroleur.

En conséquence, nous utilisons une fonction de lecture de type matérielle
pour lire directement l'information depuis la pin D2.
C'est exactement ce que fait la ligne "IRpin_PIN & BV(IRpin))".

IR-Arduino-1.jpg
Crédit: AdaFruit Industries www.adafruit.com

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



    /* Sketch de décodage de Signal IR brute!
    Ce programme utilise un Arduino et un senseur/décodeur infrarouge 
    PNA4602 (ou équivalent) pour décoder le signal IR reçu.

    Cela peut être utilise pour faire un récepteur infrarouge 
    (si l'on recherche un code particulier) ou un émetteur infrarouge
    (en pulsant une LED IR à ~38KHz avec les temps d'impulsion détectés).

    Ce code est en domaine public, une traduction de la version AdaFruit
    (voir plus bas).
    Pour plus de tutoriels en FRANCAIS.
       wwww.mchobby.be 
       wiki.mchobby.be 

    Ce sketch est disponible sur 
       http://mchobby.be/wiki/index.php?title=Senseur_IR 
    
    -----------------------------------------------------------------
    Code en domaine publique, vérifiez www.ladyada.net et adafruit.com
    pour plus de tutoriels!     
    Code is public domain, check out www.ladyada.net and adafruit.com
    for more tutorials!
    */
     
    // Nous devons utiliser la méthode de lecture 'brute' pour lire la
    // la pin ('raw' pin reading method) parce qu'il est important d'avoir
    // un temps de traitement très court (la procedure digitalRead() est 
    // une procedure plus lente!)
    //
    //uint8_t IRpin = 2;
    // Digital pin #2 est identique à la pin D2 d'un ATMega voir
    // http://arduino.cc/en/Hacking/PinMapping168 pour plus d'info sur le
    // 'raw' pin mapping
    #define IRpin_PIN PIND
    #define IRpin 2
     
    // L'impulsion maximale que nous allons essayer de détecter.
    // 65 millisecondes est une longue période de temps.
    #define MAXPULSE 65000
     
    // Résolution temporelle (timing resolution), plus c'est grand et 
    // plus ce sera précis (c'est donc meilleur) - mais trop grand signifie 
    // que nous n'aurons pas un chronométrage exact (fidèle)
    #define RESOLUTION 20
     
    // Stockage de 100 paires d'impulsions (On/OFF, c'est vraiment BEAUCOUP)
    uint16_t pulses[100][2]; // Une pair est composée de d'impulsion HAUT (high) et bas (low)
    uint8_t currentpulse = 0; // Index pour les impulsions qui seront stockées
     
    void setup(void) {
      Serial.begin(9600);
      Serial.println("Pret à décoder le signal 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
Crédit: AdaFruit Industries www.adafruit.com

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



Source: IR Sensor

Crée par LadyAda pour AdaFruit Industries.

Traduit par Meurisse D. pour MCHobby

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.