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.
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
Hi Fernando,
Thank you for catching this – fixed!
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
I think Ziggy is going to produce them – he have mentioned it somewhere.
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….
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)
, thenSwitchLiveView(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.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.
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;
}
}
}
}
//———————————————————–
After you send 2, when you press the Lv button on the camera, can you see the picture on the LCD?
Also, take a look at
SwitchLiveView()
source -> https://github.com/felis/PTP_2.0/blob/master/canoneos.cpp#L206 As can be seen, it will never send 1 to camera. You need to use actualSetProperty
.it finaly works!!!!!!
thank you so much for your help and patience!!
now the working code is:
Eos.SetProperty(EOS_DPC_LiveView, 2);
delay(500);
Eos.SetProperty(EOS_DPC_LiveView, 1);
when finishing the project, should i post the code and hardware description? maybe helpfull for ohters.. what do you think?
thanks again dear oleg!!!
F
Glad you got it working! I’d love to see your project posted – please send a link when done. If you don’t have your own website you can post it here.
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
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.
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
Check the return code from
SetProperty()
. It is likely that you’re getting an error but not handling it – something like that.