Bonjour,
Cela faisait un moment que je souhaitais réaliser un boitier de commande pour réaliser des photos haute vitesse par déclenchement d’un flash ou de l’appareil photo.
Par le flash avec obturateur de l’appareil ouvert et dans le noir d’un pièce afin d’avoir des vitesses très rapides par le flash et ainsi de figer l’objet.
Il existe des solutions toutes faites mais qui soit ne réponde pas à tous mes besoins, soit sont trop onéreuses ou alors utilise un smartphone. Et puis, le DIY, c’est sympa surtout quand on navigue dans les autres univers de passions et que le résultat est à la hauteur de ce que l’on espérait. Je voulais donc tester le micro-controlleur Arduino.
Le cahier des charges :
– Déclencher un flash ou un appareil photo (en l’occurrence, ici, un boitier Nikon avec une prise 10 broches) avec possibilité de mise au point avant le déclenchement.
– Pouvoir gérer plusieurs types de capteurs sans faire de programmation ultérieure
– Faire de la détection sur :
- un son ou bruit
- une barrière infrarouge
- un contact à fermeture
- un déclenchement manuel.
Le matériel :
– des capteurs (IR, Sonore, …)
– un micro-controlleur type Arduino (acheté chez …) ,son shield (pas obligatoire) et deux « relais » (un seul si l’on ne veut pas l’autofocus avant le déclenchement). En fait, les relais ne sont pas assez rapides pour le flash. En exemple, celui que j’ai regardé avait un délai de latence de 10 ms. Une éternité dans l’univers de la photo haute vitesse.
J’ai donc cherché un peu et ai trouvé des solutions à base d’arduino qui utilisait des triacs ou des opto-isolateurs. La, on parle de 100 Micro-secondes, soit 100 fois plus rapide.
– un boitier (pour faire home made mais joli quand même) avec un Reset, un bouton poussoir pour déclenchement manuel, un boitier pour piles (mais on peut l’alimenter en direct) et un bouton Marche/Arrêt
– un cordon jack 2.5 – 10 broches Nikon (trouvé sur ebay)
– un cordon Pc sync flash mâle-mâle (peut être remplacé par un cordon jack) (trouvé sur ebay)
– un sabot flash avec entrée sync flash et/ou jack
– deux prises usb A pour déporter l’émetteur et récepteur infra-rouge
– un encodeur rotatif pour le choix de l’entrée
– quelques leds et résistances
Coût de l’ensemble environ 80 €
On peut y ajouter un écran LCD (env. 10€), mais je suis parti sur des voyants à LED.
La réalisation par étapes :
Etape 1 : Faire un plan pour positionner les éléments, avoir la liste des fournitures requises, de l’implantation des divers éléments et ainsi se donner une bonne idée de la réalisation finale.
« Brouillons »
Etape 2 : Commander le matériel et/ou récupérer dans son stock.
Il y’a pas mal de choses que l’on peut soit récupérer sur du vieux matériel ou alors faire des variantes sur le types de prises utilisées. Par exemple pour le flash, on peut se contenter d’un banal cordon mono jack 3.5 et d’une fiche femelle mono à souder. Ou alors, pour l’ infra-rouge, on peut récupérer des ports PS/2 clavier et souris ainsi que les câbles. Cela permet de différencier plus facilement l’émetteur du récepteur.
Moi, je suis partis sur de la récupération et du neuf.
Etape 3 : Le câblage
Réaliser sans boitier pour bien tester tous les éléments et les actions qui en découlent, le bon fonctionnement de l’ensemble. C’est ballot de tout monter et devoir déjà démonter si une petite erreur s’est glissée.
Pour faire les tests, je me suis servi de la base shield Grove 1.3
C’est pratique car il n’y a pas de soudures à faire.
Donc :
– D2 = Voyant de fonctionnement et déclenchement
– D3 = Emetteur Infrarouge
– D4 = Bouton Marche/Arrêt (ne coupe pas le micro-controlleur mais permet de faire des manips sans tout débrancher
– D5 = Relais 1 pour commande flash et AF (opto-coupleur)
– D6 = Relais 2 pour commande appareil photo en déclenchement
– D7 = Bouton poussoir ou contact tactile pour commande manuelle
– D8 = Encodeur pour choix de l’entrée
– A0 = Capteur sonore
– A1 = Potentiomètre pour réglage de la sensibilité de la détection sonore
– A2 = Entrée pour détection son sur jack 3.5
– A3 = Récepteur Infrarouge
Etape 4 : La programmation
Pas le plus dur, pas le plus simple non plus, cela dépend de ses propres compétences. Il est assez aisé de trouver sur @ ce que nous avons besoin pour la réalisation. Ensuite, il y a quelques forums avec des gens sympas qui aide pas mal.
Voici le code pour les tests (n’étant pas un expert en programmation, j’ai fait avec les moyens du bord, à savoir ma maigre connaissance du langage, mais cela fonctionne.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
#include <IRremote.h> IRsend irsend; // déclaration de l'objet émetteur (pin D3) int dclport=0; int niveaudefini = 0; int niveauacquis = 0; int attente = 0; //encodeur int val; int encoder0PinA = 8; int encoder0PinB = 9; int encoder0Pos = -1; int encoder0PinALast = LOW; int n = LOW; void setup() { pinMode(2, OUTPUT); // voyant de fonctionnement pinMode(3, OUTPUT); // capteur emetteur IR pinMode(5, OUTPUT); // optocoupleur pinMode(6, OUTPUT); // relais pinMode(7, INPUT); // bouton poussoir pinMode (encoder0PinA,INPUT); //8 pinMode (encoder0PinB,INPUT); //9 pinMode(10, OUTPUT); // voyant choix1 pinMode(11, OUTPUT); // voyant choix2 pinMode(12, OUTPUT); // voyant choix3 pinMode(13, OUTPUT); // voyant choix4 pinMode(A0, INPUT); // capteur sonore pinMode(A1, INPUT); // potentiometre pour sensibilitee détection sonore pinMode(A3, INPUT); // capteur recepteur IR irsend.enableIROut(38); // crée une sortie modulée à 38KHz sur la pin 3 Serial.begin(9600); //. pour les tests, affichage des détections ou non } void loop() { if (digitalRead(4)==HIGH) { digitalWrite(2, HIGH); int sensorsoundvalue = analogRead(A0); niveauacquis = map(sensorsoundvalue,0,1023,0,125); int sensorrotaryvalue = analogRead(A1); niveaudefini = map(sensorrotaryvalue,0,1023,0,255); // Division du sensorrotaryvalue (max 1024) pour plus grande plage détection irsend.mark(3); // envoi du signal pour une durée illimitée boolean mesure1 = digitalRead(A3); // première mesure delay(5); // délai boolean mesure2 = digitalRead(A3); // seconde mesure boolean etat = mesure1 * mesure2; // comparaison int chgtetat = 0; // pour limiter a un seul affichage n = digitalRead(encoder0PinA); if ((encoder0PinALast == LOW) && (n == HIGH)) { if (digitalRead(encoder0PinB) == LOW) { encoder0Pos--; chgtetat = 1; } else { encoder0Pos++; chgtetat = 1; } Serial.print ("Selection "); Serial.print (encoder0Pos); } encoder0PinALast = n; switch (encoder0Pos) // Affichage du sensor qui a été activé et déclenchement relais. { case 0: if (attente == 10) { Serial.println("En attente selection du capteur"); digitalWrite(2, LOW); Coupuresvoyants(); attente == 0; } else { attente = attente+1; } delay(100);// delai entre deux boucles pour une meilleure stabilité break; case 1: // Capteur Sonore if (chgtetat == 1) { Serial.println(" Capteur Sonore"); Coupuresvoyants(); digitalWrite(10, HIGH); chgtetat = 0; } if (niveauacquis>niveaudefini) { Declenchement(); Serial.print("Declenchement par capteur sonore niveau regle : "); Serial.print("niveau acquis :"); Serial.print(niveauacquis); Serial.print(" niveau regle :"); Serial.println(niveaudefini); chgtetat = 1; } break; case 2: // Bouton Poussoir if (chgtetat == 1) { Serial.println(" Capteur Bouton Poussoir"); Coupuresvoyants(); digitalWrite(11, HIGH); chgtetat = 0; } if (digitalRead(7)==HIGH) { Declenchement(); Serial.println("Declenchement par bouton poussoir"); chgtetat = 1; } break; case 3: // Capteur IR if (chgtetat == 1) { Serial.println(" Capteur Faisceau IR"); Coupuresvoyants(); digitalWrite(12, HIGH); chgtetat = 0; } if (etat == HIGH) // si les deux lectures voient une coupure { Declenchement(); Serial.println("Declenchement par coupure faisceau IR"); chgtetat = 1; } break; case 4: // Capteur Auxilliaire if (chgtetat == 1) { Serial.println(" Entree Auxilliaire"); Coupuresvoyants(); digitalWrite(13, HIGH); chgtetat = 0; } if (analogRead(A6) == HIGH) { Declenchement(); Serial.println("Declenchement par entree auxilliaire"); chgtetat = 1; } break; } } else { Serial.println("En Arret"); digitalWrite(2, LOW); Coupuresvoyants(); } } void Declenchement() { digitalWrite(6, HIGH); // déclenchement Optocoupleur - Flash et/ou AF boitier delay(100); // temporisation pour Autofocus digitalWrite(5, HIGH); // déclenchement relais pour obturateur digitalWrite(2, LOW); // voyant de fonctionnement delay(500); // délai digitalWrite(6, LOW); // fin optocoupleur digitalWrite(5, LOW); // fin relais obturateur delay(900); } void Coupuresvoyants() { digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); } |
Etape 5 : Les tests
La on teste tous les capteurs, un par un avec l’appareil et/ou le flash.
Comme je suis parti d’un modèle avec double relais pour gérer l’autofocus et le déclenchement du boitier Nikon, je teste d’une part l’autofocus et ensuite le déclenchement avec un délai (réglable).
Pour une utilisation sans autofocus, n’ayant mis qu’un seul poussoir, il faut débrayer l’autofocus de l’appareil. Le bouton poussoir ne gére donc que le déclenchement de l’appareil et/ou le déclenchement du flash.
Etape 6 : Le montage final.