Différences entre versions de « Senseur IR Intervalometre »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(3 versions intermédiaires par le même utilisateur non affichées)
Ligne 15 : Ligne 15 :
 
Si votre appareil ne dispose pas d'une fonction intervallomètre, il est possible d'utiliser une diode infrarouge (et un senseur IR) pour envoyer un signal de prise de photographie à intervalle régulier (quelques minutes par exemple).
 
Si votre appareil ne dispose pas d'une fonction intervallomètre, il est possible d'utiliser une diode infrarouge (et un senseur IR) pour envoyer un signal de prise de photographie à intervalle régulier (quelques minutes par exemple).
  
[[Image:IR-INTERVAL-1.jpg]]
+
{{ADFImage|IR-INTERVAL-1.jpg}}
  
 
La caméra utilisé dans ce projet dispose d'une télécommande infra-rouge que vous pouvez utiliser avec l'appareil photo (la plupart des appareils haute gamme en dispose).
 
La caméra utilisé dans ce projet dispose d'une télécommande infra-rouge que vous pouvez utiliser avec l'appareil photo (la plupart des appareils haute gamme en dispose).
  
[[Image:IR-INTERVAL-2.jpg|300px]]
+
{{ADFImage|IR-INTERVAL-2.jpg|300px}}
  
 
Premièrement, nous allons décoder (lire) le signal infrarouge émis par la télécommande lorsque le bouton est pressé. Ensuite, nous allons réutiliser ces données pour commander la broche de la LED Infrarouge raccordée sur notre Arduino. Ce code sera envoyé une fois par minute.
 
Premièrement, nous allons décoder (lire) le signal infrarouge émis par la télécommande lorsque le bouton est pressé. Ensuite, nous allons réutiliser ces données pour commander la broche de la LED Infrarouge raccordée sur notre Arduino. Ce code sera envoyé une fois par minute.
Ligne 25 : Ligne 25 :
 
Cette première étape est simple. Pointez la télécommande vers le senseur infrarouge et pressez le bouton. En utilisant la télécommande Nikon ML-L3 nous avons obtenu le signal suivant:
 
Cette première étape est simple. Pointez la télécommande vers le senseur infrarouge et pressez le bouton. En utilisant la télécommande Nikon ML-L3 nous avons obtenu le signal suivant:
  
[[Image:IR-INTERVAL-3.jpg]]
+
{{ADFImage|IR-INTERVAL-3.jpg}}
  
Looks like the data sent is:
+
Il semble que les données envoyées soient:
 
 
suite ici [http://learn.adafruit.com/ir-sensor/making-an-intervalometer]
 
  
 
{|  class="wikitable" border="1"
 
{|  class="wikitable" border="1"
Ligne 52 : Ligne 50 :
 
|}
 
|}
  
If you look closely you'll see its actually just
+
Et si vous faite bien attention, cette séquence se résume vraiment à:
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Ligne 67 : Ligne 65 :
 
|}
 
|}
  
sent twice. Sending the same signal twice is very common - doubling up to make sure it gets received
+
Le séquence est envoyée deux fois.
  
Next up we'll need to connect an IR 940nm LED to the output of the Arduino
+
Envoyer le même signal deux fois est assez courant - le fait de doubler le signal augmente fortement les chances qu'il soit reçu.
  
[[Image:IR-INTERVAL-4.jpg]]
+
Ensuite, nous avons besoin de connecter une LED InfraRouge 940nm sur la sortie de notre Arduino.
  
Then we'll write a sketch which will pulse pin #13 on and off very fast in the proper code sequence.
+
{{ADFImage|IR-INTERVAL-4.jpg}}
 +
 
 +
Ensuite, nous écrivons un petit sketch qui pulsera la pin #13 (allumer/éteindre vraiment très rapidement pour envoyer la bonne séquence de code ).
  
 
  <nowiki>
 
  <nowiki>
 +
    // Ce sketch envoi le va envoyer le signal de déclenchement à un Nikon D50
 +
    // (Cela fonctionnera probablement avec la plupart des Nikons)
 +
    // Voir le tutoriel complètement traduit en Français (avec aimable autorisation
 +
    //    d'AdaFruit Industries)
 +
    //
 +
    //    http://mchobby.be/wiki/index.php?title=Senseur_IR
 +
    //
 +
    // Voir le Tutoriel complet (orginal, en anglais) sur
 +
    //    http://www.ladyada.net/learn/sensors/ir.html
 +
    //
 +
    // Ce code est dans le domaine public, bonne amusement!
  
 
+
     int IRledPin = 13; // LED IR connectée à la sortie digitale 13
    // This sketch will send out a Nikon D50 trigger signal (probably works with most Nikons)
+
     // La fonction setup() est exécutée une fois seulement, quand le sketch démarre
    // See the full tutorial at http://www.ladyada.net/learn/sensors/ir.html
 
    // this code is public domain, please enjoy!
 
     int IRledPin = 13; // LED connected to digital pin 13
 
     // The setup() method runs once, when the sketch starts
 
 
     void setup() {
 
     void setup() {
    // initialize the IR digital pin as an output:
+
      // Initialiser la sortie digitale de la LED infrarouge COMME SORTIE DIGITAL
    pinMode(IRledPin, OUTPUT);
+
      pinMode(IRledPin, OUTPUT);
    Serial.begin(9600);
+
      Serial.begin(9600);
 
     }
 
     }
 +
 
     void loop()
 
     void loop()
 
     {
 
     {
    Serial.println("Sending IR signal");
+
      Serial.println("Envoi du signal IR");
    SendNikonCode();
+
      SendNikonCode();
    delay(60*1000); // wait one minute (60 seconds * 1000 milliseconds)
+
      delay(60*1000); // Attendre une minute (60 secondes * 1000 millisecondes)
 
     }
 
     }
     // This procedure sends a 38KHz pulse to the IRledPin
+
 
     // for a certain # of microseconds. We'll use this whenever we need to send codes
+
     // Cette procedure envoi une pulsation à 38KHz sur le broche IRledPin
 +
     //   durant un certain nombre de micro-secondes.
 +
    // Nous utilisons cette procédure partout où il faut envoyer un code.
 
     void pulseIR(long microsecs) {
 
     void pulseIR(long microsecs) {
    // we'll count down from the number of microseconds we are told to wait
+
      // décompter le nombre de microsecondes qu'il faut attendre.
    cli(); // this turns off any background interrupts
+
      cli(); // désactive le traitement des interruption en tâche de fond.
    while (microsecs > 0) {
+
      while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
+
        // 38 kHz équivaut a peu près à 13 microsecondes "high" et 13 microsecondes "low"
    digitalWrite(IRledPin, HIGH); // this takes about 3 microseconds to happen
+
        digitalWrite(IRledPin, HIGH); // prends +/- 3 microsecondes d'exécution
    delayMicroseconds(10); // hang out for 10 microseconds, you can also change this to 9 if its not working
+
        delayMicroseconds(10); // attendre 10 microsecondes de plus (peut aussi être changé en 9 si ne fonctionne pas correctement)
    digitalWrite(IRledPin, LOW); // this also takes about 3 microseconds
+
     
    delayMicroseconds(10); // hang out for 10 microseconds, you can also change this to 9 if its not working
+
        digitalWrite(IRledPin, LOW); // Prends aussi 3 microsecondes
    // so 26 microseconds altogether
+
        delayMicroseconds(10); // attendre 10 microsecondes de plus (peut aussi être changé en 9).
    microsecs -= 26;
+
 
    }
+
        // Le tout fait 26 microsecondes
    sei(); // this turns them back on
+
        microsecs -= 26;
 +
      }
 +
      sei(); // réactive le traitement des intérruptions (traitement en tâche de fond)
 
     }
 
     }
 +
 
     void SendNikonCode() {
 
     void SendNikonCode() {
    // This is the code for my particular Nikon, for others use the tutorial
+
      // Voici le code pour le Nikon utilisé dans ce tutorial. Pour d'autres utilisations,  
    // to 'grab' the proper code from the remote
+
      // il faudra capturer le code de la télécommande
    pulseIR(2080);
+
      pulseIR(2080);
    delay(27);
+
      delay(27);
    pulseIR(440);
+
      pulseIR(440);
    delayMicroseconds(1500);
+
      delayMicroseconds(1500);
    pulseIR(460);
+
      pulseIR(460);
    delayMicroseconds(3440);
+
      delayMicroseconds(3440);
    pulseIR(480);
+
      pulseIR(480);
     delay(65); // wait 65 milliseconds before sending it again
+
      
     pulseIR(2000);
+
      delay(65); // attendre 65 millisecondes avant de ré-envoyer le signal a nouveau
    delay(27);
+
      
    pulseIR(440);
+
      pulseIR(2000);
    delayMicroseconds(1500);
+
      delay(27);
    pulseIR(460);
+
      pulseIR(440);
    delayMicroseconds(3440);
+
      delayMicroseconds(1500);
    pulseIR(480);
+
      pulseIR(460);
 +
      delayMicroseconds(3440);
 +
      pulseIR(480);
 
     }
 
     }
 
  </nowiki>
 
  </nowiki>
  
void pulseIR(long microsecs) is our helper procedure, it will create the PWM IR signal like we saw before. I used my scope to fine-tune it so that the delays added up right. We use the not-often-discussedcli()and sei()procedures to turn off interrupts. The arduino does a couple things in the background like looking for serial data to read or write, keeping track of time, etc. Most of the time we can just ignore it but for delicate high speed signals like this we want to keep quiet so that we get a nice clean signal
+
la procédure "void pulseIR(long microsecs)" est une fonction d'aide (dite "Helper" en anglais).<br />
 
+
Elle crée un signal PWM infrarouge comme déjà montré dans ce tutoriel.<br />
If you look at SendNikonCode() you will see the IR command code that we deduced in the previous project by timing the pulses from the IR sensor.
+
Le signal à été peaufiné à l'aide d'un oscilloscope, ce qui à permit d'ajouter les temps de pause (intructions "delay()" ) appropriés.
  
[[Image:IR-Interval-5.jpg]]
+
Nous avons également utilisé les fonctions '''cli()''' et '''sei()''', fonctions rarement rencontrées sur les exemples du net. Ces instructions permettent de désactiver et réactiver la gestion des interruptions.<br />
 +
En effet Arduino effectue un certain nombre d'opération en tâche de fond (surveillance des données à lire et écrire sur le port série, gestion du temps, etc).<br />
 +
La plupart du temps, nous pouvons ignorer ce type de traitement mais pour des applications traitant un signal à "haute vitesse" comme celui qui est généré, désactiver le traitement des interruptions permet de garder un "beau signal bien lisse".
  
We wired this up and it worked great, make sure to point the IR LED at the camera properly
+
Si vous lisez le code de la fonction SendNikonCode(), vous retrouverez la séquence de code IR déduite en début de projet (en analysant les temps de pulsation du signal IR à l'aide d'un senseur Infra-Rouge).
  
[http://github.com/adafruit/Nikon-Intervalometer You can also get the latest code at github]
+
{{ADFImage|IR-Interval-5.jpg}}
  
 +
Raccorder ensuite le tout et cela fonctionne parfaitement, assurez vous de bien pointer la LED infra-rouge en direction de l'appareil photographique.
  
{{ADF-Accord}}
+
[http://github.com/adafruit/Nikon-Intervalometer Vous pouvez aussi trouver le dernier code sur le github d'AdaFruit]
  
{{MCH-Accord}}
+
{{SenseurIR-TRAILER}}

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

Maintenant qu'il est possible de lire des codes IR, il est temps de

passer à notre premier projet.
Ce projet projet sera un intervallomètre.

Un intervallomètre est une fonction de certains appareils
photographiques qui permet de faire des images à des intervalles
de temps définis.
Les intervallomètres sont utilisés pour voir en accéléré des
phénomènes lents comme la croissance de plantes, le déplacement
de nuages (voir cet article WikiPedia pour plus d'information)

Si votre appareil ne dispose pas d'une fonction intervallomètre, il est possible d'utiliser une diode infrarouge (et un senseur IR) pour envoyer un signal de prise de photographie à intervalle régulier (quelques minutes par exemple).

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

La caméra utilisé dans ce projet dispose d'une télécommande infra-rouge que vous pouvez utiliser avec l'appareil photo (la plupart des appareils haute gamme en dispose).

IR-INTERVAL-2.jpg
Crédit: AdaFruit Industries www.adafruit.com

Premièrement, nous allons décoder (lire) le signal infrarouge émis par la télécommande lorsque le bouton est pressé. Ensuite, nous allons réutiliser ces données pour commander la broche de la LED Infrarouge raccordée sur notre Arduino. Ce code sera envoyé une fois par minute.

Cette première étape est simple. Pointez la télécommande vers le senseur infrarouge et pressez le bouton. En utilisant la télécommande Nikon ML-L3 nous avons obtenu le signal suivant:

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Il semble que les données envoyées soient:

PWM ON OFF
2.0 ms 2.7 ms
0.4 ms 1.5 ms
0.5 ms 3.5 ms
0.5 ms 62.2 ms
2.0 ms 2.7 ms
0.5 ms 1.5 ms
0.5 ms 3.5 ms
0.5 ms

Et si vous faite bien attention, cette séquence se résume vraiment à:

PWM ON OFF
2.0 ms 2.7 ms
0.4 ms 1.5 ms
0.5 ms 3.5 ms
0.5 ms 62.2 ms

Le séquence est envoyée deux fois.

Envoyer le même signal deux fois est assez courant - le fait de doubler le signal augmente fortement les chances qu'il soit reçu.

Ensuite, nous avons besoin de connecter une LED InfraRouge 940nm sur la sortie de notre Arduino.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Ensuite, nous écrivons un petit sketch qui pulsera la pin #13 (allumer/éteindre vraiment très rapidement pour envoyer la bonne séquence de code ).

    // Ce sketch envoi le va envoyer le signal de déclenchement à un Nikon D50 
    // (Cela fonctionnera probablement avec la plupart des Nikons)
    // Voir le tutoriel complètement traduit en Français (avec aimable autorisation 
    //    d'AdaFruit Industries)
    //
    //    http://mchobby.be/wiki/index.php?title=Senseur_IR 
    //
    // Voir le Tutoriel complet (orginal, en anglais) sur 
    //    http://www.ladyada.net/learn/sensors/ir.html
    //
    // Ce code est dans le domaine public, bonne amusement!

    int IRledPin = 13; // LED IR connectée à la sortie digitale 13
    // La fonction setup() est exécutée une fois seulement, quand le sketch démarre
    void setup() {
      // Initialiser la sortie digitale de la LED infrarouge COMME SORTIE DIGITAL
      pinMode(IRledPin, OUTPUT);
      Serial.begin(9600);
    }

    void loop()
    {
      Serial.println("Envoi du signal IR");
      SendNikonCode();
      delay(60*1000); // Attendre une minute (60 secondes * 1000 millisecondes)
    }

    // Cette procedure envoi une pulsation à 38KHz sur le broche IRledPin
    //   durant un certain nombre de micro-secondes. 
    // Nous utilisons cette procédure partout où il faut envoyer un code.
    void pulseIR(long microsecs) {
      // décompter le nombre de microsecondes qu'il faut attendre.
      cli(); // désactive le traitement des interruption en tâche de fond.
      while (microsecs > 0) {
        // 38 kHz équivaut a peu près à 13 microsecondes "high" et 13 microsecondes "low"
        digitalWrite(IRledPin, HIGH); // prends +/- 3 microsecondes d'exécution
        delayMicroseconds(10); // attendre 10 microsecondes de plus (peut aussi être changé en 9 si ne fonctionne pas correctement)
       
        digitalWrite(IRledPin, LOW); // Prends aussi 3 microsecondes
        delayMicroseconds(10); // attendre 10 microsecondes de plus (peut aussi être changé en 9).

        // Le tout fait 26 microsecondes 
        microsecs -= 26;
      }
      sei(); // réactive le traitement des intérruptions (traitement en tâche de fond)
    }

    void SendNikonCode() {
      // Voici le code pour le Nikon utilisé dans ce tutorial. Pour d'autres utilisations, 
      // il faudra capturer le code de la télécommande
      pulseIR(2080);
      delay(27);
      pulseIR(440);
      delayMicroseconds(1500);
      pulseIR(460);
      delayMicroseconds(3440);
      pulseIR(480);
    
      delay(65); // attendre 65 millisecondes avant de ré-envoyer le signal a nouveau
    
      pulseIR(2000);
      delay(27);
      pulseIR(440);
      delayMicroseconds(1500);
      pulseIR(460);
      delayMicroseconds(3440);
      pulseIR(480);
    }
 

la procédure "void pulseIR(long microsecs)" est une fonction d'aide (dite "Helper" en anglais).
Elle crée un signal PWM infrarouge comme déjà montré dans ce tutoriel.
Le signal à été peaufiné à l'aide d'un oscilloscope, ce qui à permit d'ajouter les temps de pause (intructions "delay()" ) appropriés.

Nous avons également utilisé les fonctions cli() et sei(), fonctions rarement rencontrées sur les exemples du net. Ces instructions permettent de désactiver et réactiver la gestion des interruptions.
En effet Arduino effectue un certain nombre d'opération en tâche de fond (surveillance des données à lire et écrire sur le port série, gestion du temps, etc).
La plupart du temps, nous pouvons ignorer ce type de traitement mais pour des applications traitant un signal à "haute vitesse" comme celui qui est généré, désactiver le traitement des interruptions permet de garder un "beau signal bien lisse".

Si vous lisez le code de la fonction SendNikonCode(), vous retrouverez la séquence de code IR déduite en début de projet (en analysant les temps de pulsation du signal IR à l'aide d'un senseur Infra-Rouge).

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Raccorder ensuite le tout et cela fonctionne parfaitement, assurez vous de bien pointer la LED infra-rouge en direction de l'appareil photographique.

Vous pouvez aussi trouver le dernier code sur le github d'AdaFruit


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.