Modifications

Sauter à la navigation Sauter à la recherche
6 874 octets ajoutés ,  25 août 2013 à 19:12
aucun résumé de modification
Ligne 1 : Ligne 1 :  
{{SenseurIR-Nav}}
 
{{SenseurIR-Nav}}
   −
== xxx ==
+
Maintenant qu'il est possible de lire des codes IR, il est temps de
xxx
     −
{{ADF-Accord}}
+
passer à notre premier projet.<br />
 +
Ce projet projet sera un intervallomètre.<br />
   −
{{MCH-Accord}}
+
Un intervallomètre est une fonction de certains appareils<br />
 +
photographiques qui permet de faire des images à des intervalles<br />
 +
de temps définis.<br />
 +
Les intervallomètres sont utilisés pour voir en accéléré des<br />
 +
phénomènes lents comme la croissance de plantes, le déplacement<br />
 +
de nuages (voir cet [http://fr.wikipedia.org/wiki/Intervallom%C3%A8tre 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).
 +
 
 +
{{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).
 +
 
 +
{{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.
 +
 
 +
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:
 +
 
 +
{{ADFImage|IR-INTERVAL-3.jpg}}
 +
 
 +
Il semble que les données envoyées soient:
 +
 
 +
{|  class="wikitable" border="1"
 +
| align="center" style="background:#f0f0f0;"|'''PWM ON'''
 +
| align="center" style="background:#f0f0f0;"|'''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 à:
 +
 
 +
{| class="wikitable" border="1"
 +
| align="center" style="background:#f0f0f0;"|'''PWM ON'''
 +
| align="center" style="background:#f0f0f0;"|'''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.
 +
 
 +
{{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>
 +
    // 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);
 +
    }
 +
</nowiki>
 +
 
 +
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 />
 +
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.<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".
 +
 
 +
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).
 +
 
 +
{{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.
 +
 
 +
[http://github.com/adafruit/Nikon-Intervalometer Vous pouvez aussi trouver le dernier code sur le github d'AdaFruit]
 +
 
 +
{{SenseurIR-TRAILER}}
30 894

modifications

Menu de navigation