Voici mon module d'essais pour déclencher les PDV de mon reflex.
Ici c'est un câble pour Nikon D90 qui est utilisé, mais du moment que vous repérez les trois fils [Focus-Shoot-Commun] de votre appareil cela fonctionnera de la même manière avec un autre modèle ou une autre marque.
Avec ce simple schéma de nombreuses applications deviennent possibles, à vous par exemple les timelaps d'enfer !
Matériel : Un optocoupleur 4N35 * ou équivalent (2 ou un double si vous voulez gérer l'auto-focus) + 1 ou 2 résistances 220 Ohm *
Nb: Je n'ai pas encore fait le calcul de la valeur exact de la résistance pour la Led de l'opto, avec celle-ci cela fonctionne parfaitement mais il serait quand même préférable d'avoir la valeur théorique la plus juste possible.
Edit : Après calculs je me rends compte que cette résistance et un peu sous-estimée.
La valeur calculée me donne plutôt 709 Ohm !
J'ai fait des essais avec une R. de 1K et cela fonctionne très bien. Donc pour la durée de vie de votre optocoupleur, préférez cette valeur ! (entre 680 Ohm et 1K)
* En vente entre autre chez Lextronic.fr si vous commandez d'autres choses là-bas.
Au niveau câblage du reflex, couper le boîtier de commande (le conserver, sait-on jamais) et dénuder les fils. Repérer déjà les deux fils qui déclenchent l'auto-focus (en les mettant en contact) et finalement par déduction on trouve la couleur du fil commun. Connecter ensemble Shoot + Focus et placer le commun suivant les schémas ci-joints.
Si vous vous trompez vous risquez simplement de ne pas pouvoir utiliser les menus ou l'affichage sur votre reflex : En effet si vous connectez par exemple l'auto-focus en permanence, cela bloque certaines fonctions du reflex.
Ces télécommandes filaires chinoises ne semblent pas suivre le code couleur de celles d'origines, pour le D90 cf viewtopic.php?f=233&t=5399
Ajout : Repérer les fils !
Une tél. chinoise ... (la mienne a aucune marque dessus ...)
Une tél. chinoise ... (la mienne a aucune marque dessus ...)
Edit 20.1.12 : Attention, correction ! Prévoyez dès maintenant un déplacement de la pin opto D2 (fil bleu ici) vers A2 (analogique 2) sur votre montage final Stepduino !
Ceci pour libérer les pins D2 et D3, utilisées pour les interruptions programmables (capt. de fin de course / stop).
A corriger aussi dans votre code ! (A2 en digital se déclare comme Pin 16 !!)
Résistance, voir correctif ci-dessus !
Et son code test minimum :
Marche à suivre
- Charger le code puis éteindre l'Arduino
. Brancher le câble reflex
- Mettre le boitier en focus manuel et l'allumer
- Alimenter l'Arduino
Le programme va se lancer et prendre successivement 3 photos automatiquement. (appuyer sur le bouton Reset pour recommencer)
Noter aussi l'utilisation de la Led Jaune présente sur l'Arduino (et reprise sur la carte "ScrewShield" dans le deuxième exemple).
- Code: Tout sélectionner
/*******************************************************
* Test opto-coupleur 4N35, pilotage de reflex
* Ch.Aubert, Dec. 2011
*
* Câble de télécommande chinois pour Nikon D90
* Rouge =shoot
* Jaune = focus
* Blanc = commun
* Cablage un seul opto 4N35 : pin5_opto = shoot + focus, pin4_opto = commun (blanc)
* Cablage deux opto 4N35 : pin5a_opto = shoot, pin5b_opto = focus, pin4a_opto + pin4b_opto = commun
*
* Internet, voir http://www.lenaturaliste.net/forum/viewtopic.php?f=285&t=10421
********************************************************/
/************* Définition des E/S ****************/
int PinBouton = 0; // broche analogique (A0) utisé pour les 5 boutons
int PinShoot = 2; // broche opto shoot
int PinLedArduino = 13; // Led sur circuit Arduino
/************* VARIABLES ****************/
// Réglables
int ShootPressDelay = 100; // temps d'appui Shoot
int InterPictureDelay = 500; // Délais entre PDV
/************* Setup ****************/
void setup()
{
pinMode(PinShoot, OUTPUT); // Pin Optocoupleur en sortie
pinMode(PinLedArduino, OUTPUT);
delay(InterPictureDelay); // temporisation avant de lancer les shoot
// Test shoot, 3 PDV
for (int i=0; i <=2; i++){
takePicture(); // SHOOT !!
delay(InterPictureDelay); // Délais entre photos dans la condition "for"
}
}
/************* Boucle principale ****************/
void loop()
{
//rien
}
/************* Sous programmes ****************/
// Shoot Reflex
void takePicture() {
digitalWrite(PinShoot, HIGH);
delay(ShootPressDelay);
digitalWrite(PinShoot, LOW);
}
/************* FONCTIONS ****************/
------------------------------------------------------------------------------------------
Autre exemple, un peu plus sophistiqué, avec écran LCD 5 boutons (DFRobot) et platine "ScrewShield" (DFRobot)
Le code contient une explication pour brancher un opto supplémentaire pour gérer l'auto-focus.
Le montage reprend les schémas ci-dessus (même E/S).
J'ai utilisé des petits grip-fils pour connecter provisoirement le câble reflex. Par la suite j'ajouterai un connecteur. (attention au dénudage, ces fils sont très fins !)
Le code :
- Code: Tout sélectionner
/*******************************************************
* Test 1 ou 2 opto-coupleur pour piloter un reflex
* Interface LCD 5 boutons
* Ch.Aubert, Dec. 2011
*
* Câble de télécomande chinois pour Nikon D90
* Rouge =shoot
* Jaune = focus
* Blanc = commun
* Cablage un seul opto 4N35 : pin5_opto = shoot + focus, pin4_opto = commun (blanc)
* Cablage deux opto 4N35 : pin5a_opto = shoot, pin5b_opto = focus, pin4a_opto + pin4b_opto = commun
*
* Internet, voir http://www.lenaturaliste.net/forum/viewtopic.php?f=285&t=10421
********************************************************/
/************* Librairie(s) à inclure ****************/
#include <LiquidCrystal.h>
/************* Définir les broches du LCD (pins) ****************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
/************* Définition des E/S ****************/
int PinBouton = 0; // broche analogique (A0) utisé pour les 5 boutons
int PinShoot = 2; // broche opto shoot
//int PinFocus = 3; // broche opto focus (si installé)
int PinLedArduino = 13; // Led sur circuit Arduino
/************* Constantes ****************/
#define btnRIGHT 0 // define some values used by the panel and buttons
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
/************* Variables ****************/
// Réglables
int ShootPressDelay = 200; // Délais Shoot
//int FocusPressDelay = 600; // Délais focus (si focus installé)
int InterPictureDelay = 500; // Délais entre PDV
// NON Réglables
byte lcd_key = 0;
int adc_key_in = 0;
/************* Setup ****************/
void setup()
{
lcd.begin(16, 2); // initialiser la LCD library, 16 caractères, 2 lignes
pinMode(PinShoot, OUTPUT); // Pin Optocoupleur en sortie
//pinMode(PinFocus, OUTPUT); // Pin opto en sortie (si focus installé)
pinMode(PinLedArduino, OUTPUT);
}
/************* Boucle principale ****************/
void loop()
{
lcd.setCursor(0,0); // placer le curseur à la première ligne, première position
lcd.print("Shoot = Select"); // texte d'accueil
lcd.setCursor(0,1); // placer le curseur au début de la seconde ligne
lcd_key = read_LCD_buttons(); // lire la valeur du bouton (->fonction)
switch (lcd_key) // selon le bouton appuyé ...
{
case btnRIGHT:
{
break;
}
case btnLEFT:
{
break;
}
case btnUP:
{
break;
}
case btnDOWN:
{
break;
}
case btnSELECT:
{
lcd.print("SHOOT !");
digitalWrite(PinLedArduino, HIGH); // LED on
takePicture(); // SHOOT !!
delay(InterPictureDelay); // Délais entre PDV
digitalWrite(PinLedArduino, LOW); // LED off
break;
}
case btnNONE:
{
lcd.print(" "); // rempli de blanc la deuxième ligne (16 car.)
break;
}
}
}
/************* Sous programmes ****************/
// Shoot Reflex
void takePicture() {
//digitalWrite(PinFocus, HIGH); // (si focus installé)
//delay(FocusPressDelay); // (si focus installé)
digitalWrite(PinShoot, HIGH);
delay(ShootPressDelay);
digitalWrite(PinShoot, LOW);
//digitalWrite(PinFocus, LOW); // (si focus installé)
}
/************* Fonctions ****************/
// Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
adc_key_in = analogRead(PinBouton);
if (adc_key_in > 1000) return btnNONE; // On commence par la valeur la plus probable : Aucun appui sur bouton !
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // si aucun appui sur bouton, on retoune la constante btnNONE ...
}
Prochaine étape : Les réglages et commandes du moteur PAP !