Piloter un reflex par Arduino (opto + câble)

Piloter un reflex par Arduino (opto + câble)

Messagede Christian » 27 Déc 2011 01:58

Bonjour à tous,

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 !
opto_apn.jpg
Exif et Meta MicroCartouche opto_apn.jpg (88.89 Kio) Vu 25375 fois



Une tél. chinoise ... (la mienne a aucune marque dessus ...)
telecommande_d90.jpg
Exif et Meta MicroCartouche telecommande_d90.jpg (13.51 Kio) Vu 26199 fois



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 !!)


shema_opto1.jpg
Exif et Meta MicroCartouche shema_opto1.jpg (90.6 Kio) Vu 26201 fois



Résistance, voir correctif ci-dessus !

shema_opto2.jpg
Exif et Meta MicroCartouche shema_opto2.jpg (48.72 Kio) Vu 26191 fois




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 !)


test_opto_lcd_screwshield.jpg
Exif et Meta MicroCartouche test_opto_lcd_screwshield.jpg (119.85 Kio) Vu 26193 fois


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 !
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 27 Déc 2011 08:44

Hello

Excellent.
Je n'ai pas encore reçu la commande filaire chinoise pour mon D700, mais je vais suivre ce que tu as fait.

(par contre, j'ai attaqué le sujet par la face Nord -> menus du Stepduino... au bout des paramétrages, il faudra bien implanter du code pour que ces paramétrages fonctionnent - parmi ces paramètres, il y a l'intervallomètre)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Christian » 27 Déc 2011 13:15

Salut Fred,

Oui j'ai vu ta maquette, c'est déjà bien réfléchis !
(en plus on peut faire ça aussi sur un bout de papier, dans le métro, au travail ou aux cours ... ! :mrgreen: )
Perso je vais déjà commencer par plus simple au début et améliorer au fur et à mesure sur du concret, je me sens plus à l'aise de cette manière, mais ta méthode est plus pro.
Au niveau programmation, la création du menu n'est pas si simple car on peut aborder le problème par différentes techniques ! (je continuerai dans le sujet que tu as ouvert)

Pour compléter le fil, ici une carte proto ScrewShield de Sparkfun, mais la mienne est un clône chinois (DFRobot), c'est exactement la même mais en finition un peu plus "cheap". Les borniers à vis sur l'extérieur sont bien pratiques !


Un exemple d'implantation pour la suite :

Le LCD 5 boutons monopolise les broches A0, D4-5-6-7-8-9
Il est possible de brancher le reste pour le projet Stepduino comme suivant :
- D11, 12, 13 pour le moteur PAP (Dir,Step, Enable, les modes de pas seraient à choisir sur le driver manuellement)
- D10 pour un pilotage d'éclairage (facultatif mais j'y tiens ;) )
- D3 pour un opto supplémentaire
- A1-A2 Contacteur de fin de course (facultatif mais intéressant !)
- Reste libre A3-4-5 et TX / RX (à utiliser que pour une com.série)
(ah oui, je pense aussi ajouter un buzzer ! donc sur une des pin libres)

Edit 20.1.12 : Attention, correction ! Prévoyez dès maintenant un déplacement de la pin opto D2 (fil jaune 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).


stepduino_screwshield_1.jpg
Exif et Meta MicroCartouche stepduino_screwshield_1.jpg (105.75 Kio) Vu 26118 fois


Une vue plus détaillée de l'implantation des opto. Je peux fournir plus de détails sur la soudure si besoin !

stepduino_screwshield_2.jpg
Exif et Meta MicroCartouche stepduino_screwshield_2.jpg (162.89 Kio) Vu 26115 fois
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 27 Déc 2011 13:37

Hello
Justement, à propos des "pin" utilisés, je suis en train de me battre avec le 10 comme contrôler du retroeclairage

Christian a écrit:- D10 pour un pilotage d'éclairage


Dans la définition des broches pour le LCD DFrobot, j'ai donc modifié

Code: Tout sélectionner
////////// Définir les broches du LCD (pins)  /////////////////////////
LiquidCrystal lcd(8, 9, 4, 5, 6, 7, 10);


J'essaye de faire un menu "RETROECLAIRAGE", en deuxième ligne, il y a "OUI" par défaut - avec le bouton "L" ou "R" on passe à "NON", on valide avec "OK" et là, le retroéclairage doit disparaitre.
Je suis parti d'un ensemble de codes (dont le tien dans ce topic), mais si l'intensité du LCD a diminuée au chargement de mon programme, je n'ai rien de plus (enfin, j'arrive à faire disparaitre le retroéclairage en appuyant sur "OK" mais dès que je relâche, ça revient à l'état initial - je n'ai rien qui s'affiche en deuxième ligne... d'ailleurs, la modif de ton texte "Shoot = Select" par "BACKLIGHT" n'est pas effective non plus)
Bref, je vous tiens au courant.

Par rapport aux "pin" libres, utilisables, je fais le même constat
Dans ma modif du Photoduino, j'ai défini (très théorique) les E/S de la sorte

Code: Tout sélectionner
////////////////// Définition des E/S  ////////////////
int PinBouton = 0; // broche analogique (A0) utilisée pour les 5 boutons

// Pinout settings - cette façon de coder est équivalente à celle juste au-dessus
#define PINS_BUZZER          3  //(pwm6 pin)
#define PINS_SHUTTER         11  //(digital pin)
#define PINS_MOTOR1          12  //(digital pin)
#define PINS_MOTOR2          13  //(digital pin)


Puisque j'y ai pensé cette nuit, il faut que j'ajoute des entrées avec les deux microrupteurs
Je vais modifier ce début de programme en tenant compte de tes branchements.
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 27 Déc 2011 13:47

Bon, j'ai modifié

Code: Tout sélectionner
////////// Définir les broches du LCD (pins)  /////////////////////////
LiquidCrystal lcd(8, 9, 4, 5, 6, 7, 10);

////////////////// Définition des E/S  ////////////////
int PinBouton = 0; // broche analogique (A0) utilisée pour les 5 boutons
int PinMicrorupteur_avant = 1 // broche analogique (A1) utilisée pour le microrupteur à l'avant de la platine
int PinMicrorupteur_arriere = 2 // broche analogique (A2) utilisée pour le microrupteur à l'arrière de la platine

// Pinout settings - cette façon de coder est équivalente à celle juste au-dessus
#define PINS_SHUTTER1          2  //(pwm6 pin)
#define PINS_SHUTTER2          3  //(pwm6 pin - en réserve)
#define PINS_BUZZER            1  //(pwm6 pin)
#define PINS_MOTOR1            11  //(digital pin)
#define PINS_MOTOR2            12  //(digital pin)
#define PINS_MOTOR3            13  //(digital pin)

// Measure units
#define UNITS_MS             0  // miliseconds
#define UNITS_SECS           1  // seconds
#define UNITS_UM             2  // micrometres
#define UNITS_CICLES         3 // cicles

// define some values used by the panel and buttons
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


... reste à voir si ça va servir (je vais démarrer un topic sur mon utilisation du code du Photoduino)
:?
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Christian » 27 Déc 2011 13:57

Re,
En fait sur D10 je ne pensais pas du tout à un réglage du rétro-éclairage LCD mais bien à un pilotage d'éclairage externe !
(Led par module Solarox dans mon cas)
Je ne sais pas si c'est très utile de régler logiciellement l'éclairage du LCD ?? En tout cas ça bouffe une E/S de plus ...
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 27 Déc 2011 14:00

Christian a écrit:Re,
En fait sur D10 je ne pensais pas du tout à un réglage du rétro-éclairage LCD mais bien à un pilotage d'éclairage externe !
(Led par module Solarox dans mon cas)
Je ne sais si c'est très utile de régler logiciellement l'éclairage du LCD ?? En tout cas ça bouffe une E/S de plus ...

euh... bon, je bosse sur cette histoire de rétroéclairage :?
je sais que ça n'est pas super utile, mais c'est une base de travail (histoire de comprendre le code qui irait avec un menu...)
Accessoirement, supprimer le retroéclairage, si on a qu'une pile de 9V, ça peut considérablement augmenter l'autonomie du Stepduino.

Sinon, pour ton module Solarox, il ne vaut mieux pas une E/S analogique ? (il en reste...)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Christian » 27 Déc 2011 14:06

Sinon, pour ton module Solarox, il ne vaut mieux pas une E/S analogique ? (il en reste...)

Il me faut une sortie PWM. C'est l'avantage du Solarox, on peut gérer l'intensité numériquement.
(mais on peut aussi faire autrement)

Pour le Backlight, c'est vrai que l'économie d'énergie pourrait être intéressante !
(peux-tu continuer ce point directement dans le sujet LCD 5 boutons ? Il faut voir aussi comment est faite la librairie !)
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 27 Déc 2011 14:27

Christian a écrit:Pour le Backlight, c'est vrai que l'économie d'énergie pourrait être intéressante !
(peux-tu continuer ce point directement dans le sujet LCD 5 boutons ? Il faut voir aussi comment est faite la librairie !)

oui... bien sûr, c'est prévu...
mais ça m'ennuie de balancer un code qui ne marche pas :?

Edit: Suite LCD ici > viewtopic.php?f=283&t=10242&start=10#p52453
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Piloter un reflex par Arduino (opto + câble)

Messagede Fredlab » 29 Déc 2011 10:25

Hello

J'ai reçu hier la telecommande chinoise pour mon Nikon D700

Image

Pour une fois, je n'ai pas joué de la scie...
Visiblement, pour le focus, c'est fil blanc (commun) + fil jaune
pour déclencher, c'est fil blanc + fil rouge

Vous remarquerez la haute technologie mise en oeuvre.
Il faut 5 minutes à un petit chinois pour souder les trois fils + visser les deux vis
2 euros fdp compris
La Nikon (guenuine) est en promo chez Miss Num à 29,9 euros au lieu de 43,99 (lien)... elle sort des mêmes usines, avec le même petit chinois qui assemble... il faut juste dix secondes de plus pour coller la sérigraphie Nikon.
(et je ne parle pas des autres modèles qui sont au-dessus de cent euros)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Suivante

Retourner vers Pilotage des reflex et des APN compact

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité