Posts

dslrrc – another Arduino+Android wireless EOS controller

Here is another exciting camera control project – an improvement of Yanis controller which I covered some time ago. The author – Ziggy from Crisp Concept used Yanis hardware as-is but developed his own control code for both Arduino and Android. Several additional commands has been implemented, most notably video recording and LiveView zoom control.

The project is hosted on Google Code. The source code of Arduino sketch is posted there and can be used for learning how to use commands not covered in PTP library examples. It should be noted that Ziggy uses modified versions of old PTP and USB Host libraries – you’d need to use them instead of standard ones in order for sketch to compile.

I’m hoping parallel development will be beneficial for Manishi’s and Ziggy’s projects. I’m following both with great interest and will be posting updates here. Stay tuned!

Oleg.

21 comments to dslrrc – another Arduino+Android wireless EOS controller

  • Fernando

    Hi Oleg,

    Thanks for the site, looks very interesting. Would you please correct the link, now is http://www.circuitsathome.com/crispconcept.com but should be http://www.crispconcept.com. Thanks

  • kombizz

    Thank you for showing your nice technique.
    Unfortunately, I am illetrate in this stuff. I wonder if I can buy similar technology in commercial outlets.
    If so, do you know any brand?
    thanks

  • Hi Oleg,
    Thanks for posting the article about my App. I am about to finish the Hardware Controller. The controller utilizes standard parts (including your USB Host Shield for Arduino Pro Mini) so anybody can do it by himself (I will post detailed instructions on my site), along with it I will be offering assembled and preloaded controller for purchase. It should be available for purchase on my site in mid October. I will keep you informed about status.
    Thanks again,
    Ziggy

  • Anyone have a copy of the sourcecode?, the source isn’t available.
    I’m very interested to earning how to use the commands not covered in PTP library.

    Thanks.

  • The source Code for this isn’t available anymore… i want to see how they made all the things…
    I saw the code from Yanis is really interesting, but i want these too….

  • Florian

    Dear Oleg,
    I need your help. I’m working for days on an arduino project to controll the various functions of my 5dmII…
    As seen in the video on top of the site, ziggy (also using a 5D) can easily start the liveview, and i think he is doing this with the “Eos.SwitchLiveView(true/false)”-function. In my case, when I set Eos.SwitchLiveView(true) the mirror goes up, put there appears no picture. I also tested the various video outputs (like hdmi, or av) put no success.
    please oleg, please, what to do?
    best Florian

    • For 5Dm2 you need to send SwitchLiveView(2), then SwitchLiveView(1). AFAIK, this is not compatible with any other camera; the compatible way is to send 2 then press the Lv button on the camera.

  • Florian

    oleg, thanks for your quick reply!
    hm.. i tried, as you suggested, send first SwitchLiveView(2) and than SwitchLiveView(1). Unfortunately nothing happend.
    with a button i changed between SwitchLiveView 1, 2, 0:
    _____________________
    switch (mirror) {
    case 0:
    Eos.SwitchLiveView(2);
    mirror=1;
    delay(1000);
    Serial.println(“Eos.SwitchLiveView(2)”);
    break;

    case 1:
    Eos.SwitchLiveView(1);
    mirror=2;
    delay(1000);
    Serial.println(“Eos.SwitchLiveView(1)”);
    break;

    case 2:
    Eos.SwitchLiveView(0);
    mirror=0;
    delay(1000);
    Serial.println(“Eos.SwitchLiveView(0)”);
    break;
    }
    ______________
    Am I doing the code right?

    I spoke with Will from OKII-Systems, an he told me:
    “For the 5DmkII you must set the live view output to the PC, then the rear LCD. If you try to set it directly to the rear LCD, the command is ignored. It’s a strange quirk, possibly some kind of old bug with the liveview/USB since it was one of the earliest cameras from Canon that recorded video.”

    any idea where to set the live view output?

    best florian

    • You need to have session open to the camera. Also, sending 1,2,0 won’t do anything, you need to send 2, then 1.

      • Florian

        a session, i think, is running.
        by pressing a button, connected to the arduino, it sends at first “Eos.SwitchLiveView(2)”, second press sends “Eos.SwitchLiveView(1)” (LV-lcd shoud now be activated?) and third time pressing the button sends “Eos.SwitchLiveView(0)”.
        the mirror indeed goes up, put no lcd-picture appears.
        i don’t get it…

        my code:

        //———————————————————–
        // INCLUDES
        #include
        #include
        #include

        //DEFINES BUTTON
        #define but0Pin 6 // LV-Button

        //SET
        volatile int but0Pos = 0;
        volatile int mirror = 0;

        //BOUNCE button
        Bounce bouncer_but0 = Bounce( but0Pin,10 );

        // INIT BUTTON
        void initEncoder() {

        // Init button
        pinMode(but0Pin, INPUT);
        digitalWrite(but0Pin, HIGH); // turn on pullup resistor
        }

        // READ ENCODER
        void readEncoder() {
        // read but0 with arduion debounce library
        bouncer_but0.update();
        int value_but0 = bouncer_but0.read();
        if ( value_but0 == LOW) {
        but0Pos = 1;
        }
        else {
        but0Pos = 0;
        }
        }

        class CamStateHandlers :
        public EOSStateHandlers
        {
        enum CamStates {
        stInitial, stDisconnected, stConnected };
        CamStates stateConnected;
        public:
        CamStateHandlers() :
        stateConnected(stInitial
        ) {
        };
        virtual void OnDeviceDisconnectedState(PTP *ptp);
        virtual void OnDeviceInitializedState(PTP *ptp);
        };

        CamStateHandlers CamStates;
        USB Usb;
        USBHub Hub1(&Usb);
        CanonEOS Eos(&Usb, &CamStates);

        // MAIN-SETUP
        void setup() {

        Serial.begin( 115200 );
        Serial.println(“Start”);

        initEncoder();
        if (Usb.Init() == -1)
        Serial.println(“OSC did not start.”);
        delay(1000);
        TCNT2 = 128;
        TCCR2A = 0;
        TCCR2B = (1<<CS22);
        TIMSK2 |= (1< 0) {
        //LV-on (2)
        switch (mirror) {
        case 0:
        Eos.SwitchLiveView(2);
        mirror=1;
        Serial.println(“Eos.SwitchLiveView(2)”);
        delay(1000);
        break;

        //LV-on(1)
        case 1:
        Eos.SwitchLiveView(1);
        mirror=2;
        Serial.println(“Eos.SwitchLiveView(1)”);
        delay(1000);
        break;

        //LV-off
        case 2:
        Eos.SwitchLiveView(0);
        mirror=0;
        Serial.println(“Eos.SwitchLiveView(0)”);
        delay(1000);
        break;
        }
        }
        }
        }
        //———————————————————–

  • Florian

    it’s me again…

    i was thinking about the ideal procedure during shooting.
    after 6 min. my 5dmk2 goes into kind of a standbye-mode. after that it is not possible to ractivate the cam with the arduino. you have to press capture-button or liveview-button.
    my suggestion now is, by pressing the LV-button (LV starts) inform the arduino: LV IS ON. it should be somthing like a activation-bang for starting the arduino functions (focus, rec, …)
    i looked today into the EOSEventLab.pde and the eoseventdump.cpp- and eoseventdump.h-libraries, and red also the corresponding article on
    http://www.circuitsathome.com/canon-eos-cameras-principles-of-interfacing-and-library-description

    But couldnt find out how to read out the LV-on event.

    dear oleg, do you know how it could by managed to set for example a bool var to true when the LV is activatet by pressing the lv-button on the camera?

    thankyou for your help!
    florian

  • Florian

    dear oleg.
    do you accidentally know how to set white balance values, respectively the values for it?
    in the canoneos.h-file i found the 8 presets (wbAuto, wbDaylight, wbCloudy, wbTungsten, wbFluorescent, wbStrobe, wbWhitePaper, wbShade) and also how to sent them right to the camera (Eos.SetProperty(EOS_DPC_WhiteBalance, 0x8008) but do you know how for example set 3600K? and than switch in the range from 2500 – 10000 K?
    goal is to use two buttons/one encoder to switch throug white balance values (steps of 100).
    lg Florian

    • I’ve never done anything with WB.

      • Florian

        hi oleg.
        i found out how to set the white balance. had to add “#define EOS_DPC_ColorTemperature 0xD10A” into the canoneos.h-file and than i was able to set the kelvin with “Eos.SetProperty(EOS_DPC_ColorTemperature, 3500);”…

        now i found a new problem:
        when i set the iso-value higher than 2500 and than press the rec-button on the arduino, the board goes tilt i have to reboot the arduino. it does not happen with smaler iso values (f.ex.: 400, or also with 2500 it works, but not with 3200 or higher)

        any idea whats going on here? is there any known bug or something?
        florian