Comment déclencher un appareil photo automatiquement

Comment déclencher un appareil photo automatiquement

On nous a demandé si il était possible de piloter un appareil photo Canon EOS en utilisant un Yocto-Relay et les informations sur glanées sur ce site. On a répondu par l'affirmative, mais cela nous a donné une furieuse envie d'essayer. Suivez le guide !





Remarquons tout d'abord qu'il est possible de déclencher une photo avec un EOS en se basant sur une solution purement logicielle. En effet Canon distribue un SDK pour la ligne EOS. Mais apparemment il ne fonctionne que sous Windows, et il faut s'enregistrer chez Canon pour l'obtenir, processus qui peut prendre plusieurs jours. Il est effectivement plus simple de fabriquer une fausse télécommande qu'on branchera dans la prise idoine de l’appareil.

Cette prise est différente suivant le modèle d'appareil: un simple jack audio 2.5mm pour les appareils dont le nom comporte trois chiffres comme l'EOS 500D, une prise CL-N3 pour les appareils avec un nom à deux chiffres comme l'EOS 30D. Le moyen le plus simple de se procurer une de ces fiches CL-N3 est d'acheter un câble et de le couper. Les prises Jack 2.5mm se trouve dans tous les magasins d'électronique.

Pour avoir une fiche CL-N3, achetez un câble, et coupez-le.
Pour avoir une fiche CL-N3, achetez un câble, et coupez-le.


Ces deux prises fonctionnent selon le même principe: il y a trois contacts: l'un d'entre eux est la masse, les deux autres correspondent à la mise au point et au déclencheur. Pour déclencher l'appareil il suffit de mettre en contact le fil du déclencheur avec la masse. Pareil pour la mise au point. Tâche triviale à réaliser avec un Yocto-Relay. On a juste rajouté une petite résistance de 200Ω pour limiter le courant qui passe quand on ferme le circuit. Elle ne sert probablement à rien mais vu le prix de ce genre d’appareil on a préféré être prudent.

Pour prendre une photo il suffit de mettre en contact la masse et le fil du déclencheur
Pour prendre une photo il suffit de mettre en contact la masse et le fil du déclencheur


Connexion sur un Yocto-Relay. Notez les deux résistances de 200 Ohm ajoutées par sécurité.
Connexion sur un Yocto-Relay. Notez les deux résistances de 200 Ohm ajoutées par sécurité.



Mise en pratique
Bien, maintenant qu'on a un appareil photo télécommandable par USB, que va-t'on bien pouvoir photographier avec? On a décidé de faire une petite expérience pour tester la précision de nos modules: peut-on photographier une petite voiture à ressort au moment précis où elle percute un tas de briques en plastiques? L'idée étant de mesurer la vitesse de la voiture, puis d'en déduire l'instant où la voiture va percuter la pile de briques, pour déclencher la photo juste au bon moment.

Pour calculer la vitesse de la voiture on fabrique deux barrières lumineuses avec des LEDs, des photo-transistors et un Yocto-Knob. La conductivité des photo-transistors varie en fonction de l'éclairage qu'ils reçoivent, et ce changement de résistance est facilement détectable par le Yocto-Knob. On a déjà utilisé ce principe dans l'anémomètre et la girouette.

Le Yocto-Relay contrôle l'appareil photo, le Yocto-Knob contrôle les barrières lumineuses
Le Yocto-Relay contrôle l'appareil photo, le Yocto-Knob contrôle les barrières lumineuses


Une des deux barrières lumineuses
Une des deux barrières lumineuses


Il suffit de mesurer le temps que met la voiture pour passer entre les deux barrières lumineuse pour en déduire la vitesse. Ce temps est facilement obtenu: lorsque que la voiture passe la deuxième barrière,on demande au Yocto-Knob la milliseconde à laquelle les deux canaux ont changé d'état pour la dernière fois et on soustrait ces deux valeurs. On calcule la vitesse de la voiture en fonction de la distance qui sépare les deux barrière, puis on en déduit le temps qu'elle va mettre pour aller jusqu'à l'obstacle, devant l'objectif. Il ne reste plus qu'à demander au relais de se déclencher au bon moment a l'aide de la fonction delayedPulse. Seule petite subtilité: il ne faut pas oublier d'anticiper le temps que met l'appareil photo pour réagir, soit 65 ms dans le cas d'un EOS 30D. Voici le code complet en C++.

#include <iostream>
#include "yocto_api.h"
#include "yocto_relay.h"
#include "yocto_anbutton.h"

using namespace std;

// some ugly global variables
typedef enum {READY,LIGHT1,LIGHT2} STATES;
static  STATES state = READY;
static  u64  timeReference =0;
static  u64  shutterTime;
static  YAnButton* LightBarrier1;
static  YAnButton* LightBarrier2;
double duration;
double speed;

// distance between the light barriers
#define  BARRIERDIST  30.0
// distance between the 1st light barrier and the camera
#define  CAMERADIST   70.0

// called when the 1st barrier is crossed
static void LightBarrier11CallBack(YAnButton *fct, const string& value)
{  int ivalue = atoi(value.c_str());
   if (ivalue<200) return;
   if (state!=READY) return;
   state = LIGHT1;
   timeReference = YAPI::GetTickCount();
}

// called when the 2nd barrier is crossed
static void LightBarrier12CallBack(YAnButton *fct, const string& value)
{   int ivalue = atoi(value.c_str());
    if (ivalue<200) return;
    if (state!=LIGHT1) return;    
    // the car has crossed the second barrier
    // lets make some speed calculation
    int last1 = LightBarrier1->get_lastTimeReleased();
    int last2 = fct->get_lastTimeReleased();
    duration =last2-last1;
    speed = BARRIERDIST / duration;
    shutterTime = timeReference + (u64)(CAMERADIST / speed);
    state = LIGHT2;
}

int main(int argc, const char *argv[])
{
    string errmsg;
   
    // API init
    if (YAPI::RegisterHub("usb", errmsg) != YAPI::SUCCESS) {
        cout << "RegisterHub error : " << errmsg<<endl;
        return 1;
    }
   
    // find the relay connected to the camera shutter
    YRelay* shutter = YRelay::FindRelay("shutter");

    // find the anButton entry connected to the 1st barrier
    LightBarrier1 = YAnButton::FindAnButton("lightBarrier1");

    // and sets a callback which will be called each time the
    // measured value changes significantly
    LightBarrier1->registerValueCallback(LightBarrier11CallBack);

    // find the anButton entry connected to the 2nd barrier
    LightBarrier2 = YAnButton::FindAnButton("lightBarrier2");
    LightBarrier2->registerValueCallback(LightBarrier12CallBack);

    // let's roll!
    while (true) {
        YAPI::Sleep(1, errmsg);
        u64 now = YAPI::GetTickCount();
        switch(state) {
        case LIGHT1:
            // 2nd barrier was never crossed, let's reset
            if(now > timeReference+5000)
            {   state = READY;
                cout << "Timeout, reset" << endl;
            }
            break;
        case LIGHT2:
            // 2nd barrier has been crossed: setup the relay with the
            // right delay (note: the EOS 30D has a 65ms shutter lag)
            shutter->delayedPulse(shutterTime-now-65, 200);
            state = READY;
            break;
        }
    }
}



Après la théorie, voyons ce que cela donne en pratique:

  



Je sens qu'on va bien s'amuser avec notre appareil photo télécommandé :-)

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.