• Herzlich willkommen im "neuen" DSLR-Forum!

    Wir hoffen, dass Euch das neue Design und die neuen Features gefallen und Ihr Euch schnell zurechtfindet.
    Wir werden wohl alle etwas Zeit brauchen, um uns in die neue Umgebung einzuleben. Auch für uns ist das alles neu.

    Euer DSLR-Forum-Team

  • In eigener Sache!

    Liebe Mitglieder, liebe Besucher und Gäste
    ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
    Bitte hier weiterlesen ...

  • DSLR-Forum Fotowettbewerb neu erfunden!
    Nach wochenlanger intensiver Arbeit an der Erneuerung des Formates unseres internen Fotowettbewerbes ist es Frosty als Moderator
    und au lait als Programmierer gelungen, unseren Wettbewerb auf ein völlig neues Level zu heben!
    Lest hier alle Infos zum DSLR-Forum Fotowettbewerb 2.0
    Einen voll funktionsfähigen Demowettbewerb kannst du dir hier ansehen.
  • Neuer Partner: AkkuShop.de
    Akkus, Ladegeräte und mehr (nicht nur) für Digitalkameras und Drohnen
  • Neuer Gutscheincode unseres Partners Schutzfolien24:
    DSLR-Forum2024
    Dauerhaft 10% Rabatt auf alle Displayschutzfolien der Eigenmarken "Upscreen", "Brotec", "Savvies".
    Der Code ist für alle Geräteklassen gültig.
  • Stimmt ab über die Sieger des DSLR-Forum Fotowettbewerbs April 2024.
    Thema: "Sprichwörtlich"

    Nur noch bis zum 30.04.2024 23:59!
    Jeder darf abstimmen!
    Zur Abstimmung und Bewertung hier lang
WERBUNG

EOS Follow-Focus mit extras über USB (Arduino-Based)

Liest hier eigentlich noch jemand mit ? :rolleyes:

Ich hänge gerade an dem Problem, daß sich der Fokus-Peak bei ML ganz komisch verhält (die "dots" wandern in zeilen von oben nach unten durchs bild, wenn man einmal REC-start und REC-stop am arduino gedrück hat. gleiches passiert aber auch, wenn ich den auslöser (REC funktion über ML) drücke. Allerdings passiert es nicht, wenn der arduino gar nicht angeschlossen ist.

Des weiteren habe ich öfter mal nach wenigen minuten und mehrmaligem drücken von REC einen freeze der steuerung.

hat jemand so nen arduino noch im testaufbau und mag meinen code mal laufen lassen ? wo die encoder hin müssen ist im programm ersichtlich und veränderbar. ich hoffe, er ist gut genug dokumentiert. code basiert auf dem USB-host-shield2. die erweiterte canoneos-cpp und canoneos.h ist angehangen (REC+zoom hinzugefügt, danke für den tip hier im thread)

PHP:
// INCLUDES
#include <canoneos.h>
#include <usbhub.h>
#include <Bounce.h>

//DEFINES ENCODER
#define encoder0PinA  3    // Fokus, Digitalport 3
#define encoder0PinB  2    // Fokus, Digitalport 2
#define encoder1PinA  A3   // ISO, Analogport 3
#define encoder1PinB  A2   // ISO, Analogport 2
#define encoder2PinA  A0   // Blende, Analogport 0
#define encoder2PinB  A1   // Blende, Analogport 1

//DEFINES SWITCHE/BUTTONS
#define sw0Pin        4    // left switch  -zoom5x, Digitalport 4
#define sw1Pin        5    // right switch, Digitalport 5,  -aktuell ohne funktion
#define but0Pin       6    // red button (Record), Digitalport 6
#define but1Pin       7    // green button, Digitalport 7, -aktuell ohne funktion

//SET (grundstellungen)
volatile int encoder0Pos = 0;
volatile int encoder1Pos = 0;
volatile int encoder2Pos = 0;
volatile int sw0Pos = 0;
volatile int sw1Pos = 0;
volatile int but0Pos = 0;
volatile int but1Pos = 0;
volatile int ffstep = 2;
volatile int bfstep = 0x8002;
volatile int iso_mode = 0;
volatile int aperture_mode = 0;
volatile char recording_mode = 0;
volatile char zoom_mode = 0;

//BOUNCE schalter und taster
Bounce bouncer_but0 =  Bounce( but0Pin,10 ); 
Bounce bouncer_but1 = Bounce( but1Pin,10 ); 
Bounce bouncer_sw0 = Bounce( sw0Pin,10 );
Bounce bouncer_sw1 = Bounce( sw1Pin,10 );

int encoder0PinALast = LOW;
int encoder1PinALast = LOW;
int encoder2PinALast = LOW;
int n = LOW;

// INIT ENCODER/SWITCH/BUTTON
void initEncoder() {
    // init drehencoder
    pinMode(encoder0PinA, INPUT); 
    digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
    pinMode(encoder0PinB, INPUT); 
    digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
  
    pinMode(encoder1PinA, INPUT); 
    digitalWrite(encoder1PinA, HIGH);       // turn on pullup resistor
    pinMode(encoder1PinB, INPUT); 
    digitalWrite(encoder1PinB, HIGH);       // turn on pullup resistor
  
    pinMode(encoder2PinA, INPUT); 
    digitalWrite(encoder2PinA, HIGH);       // turn on pullup resistor
    pinMode(encoder2PinB, INPUT); 
    digitalWrite(encoder2PinB, HIGH);       // turn on pullup resistor
  
    // Init taster/buttons
    pinMode(sw0Pin, INPUT); 
    digitalWrite(sw0Pin, HIGH);       // turn on pullup resistor
    
    pinMode(sw1Pin, INPUT); 
    digitalWrite(sw1Pin, HIGH);       // turn on pullup resistor
    
    pinMode(but0Pin, INPUT); 
    digitalWrite(but0Pin, HIGH);       // turn on pullup resistor
    
    pinMode(but1Pin, INPUT); 
    digitalWrite(but1Pin, HIGH);       // turn on pullup resistor
  
    encoder0PinALast = digitalRead(encoder0PinA);
    encoder1PinALast = digitalRead(encoder1PinA);
    encoder2PinALast = digitalRead(encoder2PinA);
}

// READ ENCODER
void readEncoder() {
    static int8_t last[4];
    int8_t neu = 0;
    int8_t diff = 0;
  
    // drehencoder funktion from Peter Dannegger http://www.mikrocontroller.net/topic/112603    
    // Encoder 0
    neu = 0;
    if (digitalRead(encoder0PinA) == HIGH) {
        neu = 3;
    }
    if (digitalRead(encoder0PinB) == HIGH) {
        neu ^= 1;  // convert gray to binary
    }
    diff = last[0] - neu;				      // difference last - neu
    if( diff & 1 ){				      // bit 0 = value (1)
        last[0] = neu;				              // store neu as next last
        encoder0Pos += (diff & 2) - 1;		      // bit 1 = direction (+/-)
    } 
  
    // Encoder 1
    neu = 0;
    if (digitalRead(encoder1PinA) == HIGH) {
        neu = 3;
    }
    if (digitalRead(encoder1PinB) == HIGH) {
        neu ^= 1;  // convert gray to binary
    }
    diff = last[1] - neu;				      // difference last - neu
    if( diff & 1 ){				      // bit 0 = value (1)
        last[1] = neu;				              // store neu as next last
        encoder1Pos += (diff & 2) - 1;		      // bit 1 = direction (+/-)
    } 
  
    // Encoder 2
    neu = 0;
    if (digitalRead(encoder2PinA) == HIGH) {
        neu = 3;
    }
    if (digitalRead(encoder2PinB) == HIGH) {
        neu ^= 1;  // convert gray to binary
    }
    diff = last[2] - neu;				      // difference last - neu
    if( diff & 1 ){				      // bit 0 = value (1)
        last[2] = neu;				              // store neu as next last
        encoder2Pos += (diff & 2) - 1;		      // bit 1 = direction (+/-)
    } 
  
    // read but0 with arduion debounce library 
    bouncer_but0.update();
    int value_but0 = bouncer_but0.read();
    if ( value_but0 == LOW) {
        but0Pos = 1;
    } else {
        but0Pos = 0;
    }
    
    // read but1 with arduion debounce library 
    bouncer_but1.update();
    int value_but1 = bouncer_but1.read();
    if ( value_but1 == LOW) {
        but1Pos = 1;
    } else {
        but1Pos = 0;
    }
    
    // read sw0 with arduion debounce library 
    bouncer_sw0.update();
    int value_sw0 = bouncer_sw0.read();
    if ( value_sw0 == LOW) {
        sw0Pos = 1;
    } else {
        sw0Pos = 0;
    }
    
    // read sw1 with arduion debounce library 
    bouncer_sw1.update();
    int value_sw1 = bouncer_sw1.read();
    if ( value_sw1 == LOW) {
        sw1Pos = 1;
    } else {
        sw1Pos = 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<<TOIE2);
    sei();
}


ISR(TIMER2_OVF_vect) {  
    readEncoder();
}  

// MAIN-LLOP
void loop() {
    Usb.Task();
}

void CamStateHandlers::OnDeviceDisconnectedState(PTP *ptp) {
    if (stateConnected == stConnected || stateConnected == stInitial) {
        stateConnected = stDisconnected;
        Notify(PSTR("Camera disconnected.\r\n"));
    }
}

void CamStateHandlers::OnDeviceInitializedState(PTP *ptp) {
    if (stateConnected == stDisconnected || stateConnected == stInitial) {
        stateConnected = stConnected;
        encoder0Pos = 0;
        encoder1Pos = 0;
        encoder2Pos = 0;
    }
    if (stateConnected == stConnected) {
        
        // Rec-Mode ##################################################################
        // ###########################################################################
        if (but0Pos > 0) {
            if (recording_mode == 0) {
                Eos.SetProperty(EOS_DPC_EVFRecordStatus, 4);
                delay(100);
                but0Pos = 0;
                recording_mode = 1;
            } else {
                Eos.SetProperty(EOS_DPC_EVFRecordStatus, 0);
                delay(100);
                but0Pos = 0;
                recording_mode = 0;
            }
        }

        // zoom field: 1x, 5x ########################################################
        // ###########################################################################
        if (zoom_mode == 0 and sw0Pos == 1) {
            ((CanonEOS*)ptp)->Zoom(5);
            delay(100);
            zoom_mode = 1;
            ffstep = 1;
            bfstep = 0x8001;
        } 
        if (zoom_mode == 1 and sw0Pos == 0) {
            ((CanonEOS*)ptp)->Zoom(1);
            delay(100);
            zoom_mode = 0;
            ffstep = 2;
            bfstep = 0x8002;
        } 

        // ISO auto, 100,160,320,640,1250,2500 #######################################
        // ###########################################################################
        uint8_t iso_values[7] = {0, 0x48, 0x4D, 0x55, 0x5D, 0x65, 0x6D}; 
        if (encoder1Pos > 0) {
            if (iso_mode < 6) {
                iso_mode++;
                Eos.SetProperty(EOS_DPC_Iso, iso_values[iso_mode]);
            }
            delay(50);
        } else if (encoder1Pos < 0) {
            if (iso_mode > 0) {
                iso_mode--;
                Eos.SetProperty(EOS_DPC_Iso, iso_values[iso_mode]);              
            }
            delay(50);
        }
        encoder1Pos = 0;
    
        // BLENDE f1.2,1.4,1.6,1.8,2.0,....f16 #######################################
        // ###########################################################################
        uint8_t aperture_values[23] = {0x0d, 0x10, 0x13, 0x15, 0x18, 0x1b, 0x1d, 0x20, 0x23, 0x25, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x45, 0x48};
        if (encoder2Pos > 0) {
            if (aperture_mode < 22) {
                aperture_mode++;
                Eos.SetProperty(EOS_DPC_Aperture, aperture_values[aperture_mode]);
            }
            delay(50);
        } else if (encoder2Pos < 0) {
            if (aperture_mode > 0) {
                aperture_mode--;
                Eos.SetProperty(EOS_DPC_Aperture, aperture_values[aperture_mode]);
            }
            delay(50);
        }
        encoder2Pos = 0;

        // FOCUS ACTION ##############################################################
        // ###########################################################################
        while (encoder0Pos != 0) {
            if (encoder0Pos > 0) {
                encoder0Pos = 0;
                ((CanonEOS*)ptp)->MoveFocus(ffstep); // MoveFocus(2), MoveFocus(3) = schrittweite vorwärts
                delay(10);
            } else if (encoder0Pos < 0) {
                encoder0Pos = 0;
                ((CanonEOS*)ptp)->MoveFocus(bfstep); // MoveFocus(0x8002), MoveFocus(0x8003) = Schrittweite rückwärts
                delay(10);
            } 
        }
        encoder0Pos = 0;
    }
}
 
Zuletzt bearbeitet:
Hallo Stoecky2!

Eure Beiträge sind über 21000 mal angeklickt worden, also keine Bange, wir Trittbrettfahrer sind brennend interessiert.
Und warte nur, wenn du schreibst "alles funktioniert ohne Probleme", dann ist die Hölle los!

MfG
dslr-urtyp
 
H
Und warte nur, wenn du schreibst "alles funktioniert ohne Probleme", dann ist die Hölle los!

MfG
dslr-urtyp
ey, ich hab keine ahnung von dem was ich hier tue und brauche hilfe ... :eek::rolleyes::):ugly:

Ich komm eher aus der PHP-Web-Schiene, daher tue ich mich mit C++ ein bissl schwer.

Nächste Woche kommt aber das PDF mit der Anleitung zum Nachbau. Die Hardware steht soweit, ich muß noch die Softwareinstallation der Entwicklungsumgebung und die Einbinduing der Lib's screenshooten und nen bissl was dazu schreiben.

Ab dann hoffe ich auf ein bissl Hilfe von aussen, da mir die prozeduren dinge in dem Programm echt Schwierigkeiten bereiten. Die debounce-lib hab ich bis heute nicht verstanden.

Ich hab mal nen "guten" Drehencoder mit eingebautem debouncer gekauft (120pulse/umdrehung) mal sehen, was der dazu sagt. die drehschalter zur direkten ansteuerung von ISO und blende sind auch da. das kommt aber dann später erst, sonst muß ich ständig die anleitung umschreiben ;) erstmal die basics vermitteln, damit mir jemand helfen kann ;)
 
Bevor ich jetzt hier ganz druchdrehe, eine Frage an die Mitbauer ...

Der Grundcode ist ja seit Threadbeginn ähnlich, und auch ich habe darauf aufgebaut, um erstmal das Prinzip zu verstehen.

Aber kann mir mal jemand eins erklären ? ...

a) oben im code wird der interne pullup-resistor mit "digitalWrite(encoder0PinA, HIGH;" eingeschaltet. gut und schön, glauben wir das mal ;)

b) dann wird es ein eingang für den drehencoder ... "pinMode(encoder0PinA, INPUT);" auch logisch und sehr praktisch :D

c) angeschlossen sind drehencoder typ "günstig", die nix anderes machen als die beiden digitaleingänge gegen "ground" zeitversetzt (drehrichtung) zu ziehen. soweit die basics der elekronik.

Aber warum zum teufel fragt man dann den HIGH-zustand mit "if (digitalRead(encoder0PinA) == HIGH)" ab? Müsste es hier nicht "LOW" heissen?

Wenn ich an dem Encoder relativ langsam drehe, kommen bei mir drei steps raus.

Worauf ich hinaus will: Ich hab mal einen Bourns Optical encoder angeschlossen ( http://www.bourns.com/data/global/pdfs/em14.pdf ) der von hause aus nen sauberen quadrature-code liefert (allerdings in Ruhe LOW und beim drehen dann HIGH). Nun hab ich im Programm einfach mal den PullUp Widerstand deaktiviert, und die abfrage mit "if HIGH" gelassen. Und siehe da ... es funktioniert um Längen besser. Saubere kleine Schritte, die sogar einen ständigen schrittmodus von "1" bzw "0x8001" zulassen. Der Drehencoder hat 64 schreitte bei 360°. Das "fühlt" sich wesentlich wertiger und verlässlicher an. Ich frage mich nur, ob das der "bessere" Encoder ist, oder nun der richte HIGH-LOW modus.
 
Der Code hängt komplett zwei Posts weiter oben. :)

weiter oben steht hier nix :rolleyes: (zur Info, die Reihenfolge was oben ist bestimmt der User :devilish:) ich guck jetzt aber nicht den Code durch, wie gesagt, high kann low sein oder umgekehrt, per #define oder durch vorgeschaltete inverter buffer, mach ich auch manchmal um den atmel zu schonen ;)
 
Wie versprochen hier nun mein HOW-TO zu dem Projekt.
Gebt mir bitte Feedback (in jederlei Hinsicht: Ob ihr es doof findet, zu unverständlich, ob ihr es nachbaut und wie es geklappt hat, Erweiterungen, Tips, Ideen, Links, was hab ich vergessen, etc, ich werde diese dann ggf nacharbeiten und einbringen.)

Besonders beim Code ist sicherlich noch einiges drin, das würde ich dann gerne im Teamwork machen, wenn der ein oder andere es nachgebaut hat.

Und nun wünsche ich viel Spaß beim Lesen.

ARemote-V102.pdf
 
Hallo Stoecky2!

Vielen Dank für die Mühe, die du aufgewendet hast.
Nach Fertigstellung meines Studios ist das meine nächste Arbeit.
Was ich noch nicht verstanden habe ist: sind die Steuerungsbefehle bei jeder Canon gleich? (habe eine 7D).

MfG
dslr-urtyp
 
Was ich noch nicht verstanden habe ist: sind die Steuerungsbefehle bei jeder Canon gleich? (habe eine 7D).

MfG
dslr-urtyp
so ganz bin ich da noch nicht hintergestiegen, habe aber das Canon SDK-PDF hier rumfliegen. Im Grund würde ich sagen: ja. bei den älteren werden dann ein paar befehle fehlen, gehe ich von aus.

kann eigentlich nicht anders sein, da diese lib ha "canoneos.h" heisst und nicht spezifiziert wird. daher gehe ich davon aus, dass es mit allen geht. wenn ich meine version mal ganz ferig habe, checke ich mal alle cams im bekanntenkreis ;)
 
Gebt mir bitte Feedback (in jederlei Hinsicht:

unverbindlich, meine letzten AVR sowie wUSB betreibe ich direkt an 4x AA NiMh Akkus ohne Regler ! NiMh haben voll 5,5V (4x) und das kann Atmel und runter bis zu 3,6 V (4x 0,9 Entladeschlussspannung) habe ich noch keine Fehlfunktion bemerkt, wie sich die Adruinos Boards verhalten weiss ich aber nicht ;)

http://www.mikrocontroller.net/wikifiles/f/f0/Schaltplan_transistortester.png
geniale Abschaltung, wenige nA standby Strom, denk dir den Spannungsregler weg und 9V sind 4x AA(AAA), benötigt keinen Ausschalter, kann vom Atmel ausgeschaltet werden
 
Zuletzt bearbeitet:
Besten Dank Stoecky2 für die Anleitung. Ich habe damit endlich meinen Arduino so programmieren können,daß ich jetzt zum ersten Mal an meiner 5DMII Blende und ISO verstellen konnte. Leider funzt die Geschichte mit dem Fokus überhaupt nicht! Weder in Liveview noch ohne: wenn ich den Decoder drehe passiert rein gar nichts! Aufnahme jedoch starten geht, dito die 5x Lupe zu aktivieren. Ich habe als USB-Shield das von circuits@home, das sparkfun soll ja mit der USB-2.0-library nicht zu funktionieren.
Ich habe schon den Drehdecoder umdefiniert und damit Fokus und Blende vertauscht, wieder funktioniert Blende aber Fokus nicht. Ist Dir oder jemandem anderen schon einmal so etwas aufgefallen?
Meine Idee mit dem Arduino wäre eine Art Universalsteuerung aufzubauen - Zielrichtung timelapse. Dabei möchte ich gerne zwei Fokuspunkte definieren und während der Aufnahmen langsam von dem einem zum anderen "fahren", dann könnte ich ja auch den Motor an meiner Eigenbaudolly steuern...
Dazu wäre natürlich eine funktionierende Grundlage spannend, an der in dann meine Ideen austoben würde.
Gruß Stefan
 
@Ljosmyndari: Es freut mich sehr, daß es bei Dir geklappt hat, dann habe ich anscheinend keine groben Schnitzer in der Anleitung. Danke auch für das Feedback. Eine 5DII habe ich aktuell nicht im Zugriff zu testen. Wenn alles andere bei Dir klappt, und Du den Drehencoder schonmal per Pinbelegung vertauscht hast, kann es ja an der Hardware eigentlich nicht liegen.

Mach doch mal in der Arduinoumgebung den seriellen Monitor an (nicht wundern, dann rebootet der arduino einmal) und schaue, ob da Fehlermeldungen kommen. So ein paar debugging infos wirft der Monitor aus, wenn man den encoder dreht. Wenn man die Blende zum Beispiel auf einen Wert drehen will, den die Optik nicht kann, dann kommt auf der serielln Console eine Fehlermeldung der Cam zurück.
 
@Stoecky2: es kommen keine Fehlermeldungen wenn ich den Decoder laufen lasse. Wenn ich dagegen ohne Liveview die Videoaufnahme starte oder den Zoomknopf drücke erscheint beidesmal der Fehler 2019.
Ich werde wenn ich die verflixte Liste mit den Befehlen finde, diese mal alle durchprobieren.
Die 20D und die G10 funktionieren damit überhaupt nicht, das hatte ich schon probiert.
Gruß Stefan
 
mhh komisch ... ich hatte sowas in der Art auch mal. Da waren die delays (deren sinn mir noch nicht ganz klar ist) blöd gesetzt und aus irgendwelchen gründen würde die subroutine dann gar nicht mehr abgefragt.

mal so ganz auf doof ... setzt doch mal mal nen Println zur debuggingausgabe in die fokusroutine ganz am ende. dann muß zumindest beim drehen des encoders ne ausgabe kommen (inkl der step-var)

beispiel:

PHP:
        // FOCUS ACTION ##############################################################
        // ###########################################################################
        while (encoder0Pos != 0) {
            if (encoder0Pos > 0) {
                encoder0Pos = 0;
                Serial.println("Focus forward"); // debugging
                Serial.println(ffstep); // debugging
                ((CanonEOS*)ptp)->MoveFocus(ffstep); // MoveFocus
                delay(10);
            } else if (encoder0Pos < 0) {
                encoder0Pos = 0;
                Serial.println("Focus backward"); // debugging
                Serial.println(bfstep); // debugging
                ((CanonEOS*)ptp)->MoveFocus(bfstep); // MoveFocus
                delay(10);
            } 
        }
 
Das Teil macht mich madig ;-)
Jetzt habe ich verschiedene Versionen von der IDE (1.0 und 0.23) mit jeweils verschiedenen libraries für PTP und das USB-shield auf dem Rechner aufgebaut.
Dabei konnte ich mit der 0.23er IDE und den neuen PTP/USB-libs den DIY-Follow-Focus - sketch compilieren und dort...
... lief bei mir der Fokus...
...einmal! Dann konnte ich das Ergebnis nicht mehr wiederholen.
Grundsätzlich scheint die 5DMII somit steuerbar zu sein, aber die Ergebnisse scheinen eine Veröffentlichung im Journal of irreproducible experiments wert zu sein.
Ich werde wohl den Lötkolben anschmeissen und mal versuchen das Teil abzustrippen und die Lötstellen nachzuchecken.
Gruß Stefan
 
Also wenn Du die Cam ansonsten steuern kannst, wie soll es dann an einer Lötstelle liegen ?

Ich habe mal im Canon SDK nachgesehen, und auch hier http://www.circuitsathome.com/ptpusb-control-camera-data in allen Fällen ist der Befehlssatz für movefocus bzw drivelens der PTP-Code 0x9155 Also ich kann mir nicht vorstellen, daß der Code bei einer 60D geht und bei einer 5DII nicht. Zumindest finde ich nix, was dafür spricht :D

Was mir aber so gar nicht in den Kopf will ... wie zum Teufel kommt man von den Codes aus dem Canon-SDK auf die Codes für die PTP? Wobei das irgendwie wohl nix miteinander zu tun hat. Ich such nämlich seit Stunden nach einer Möglichkeit, den Audiopegel während der Aufnahme mit dem Arduino zu steuern.
 
So, jetzt wird es etwas klarer, das Abstrippen in Hard-&Software hat geholfen: Ich muß den Arduino vorher starten und im Serial Monitor sollte schon einmal ein "disconnect" zu sehen sein, bevor die 5DMII angehen darf. Dann muß ich diese sofort ohne irgendetwas an dem Arduino zu tun in den Liveview schalten - wenn ich dann den Decoder drehe läuft der Fokus.
ISO, Blende, etc. funktionieren auch ohne Liveview und völlig unbeeindruckt von dem oben angegebenen "Gewese" scheinbar jederzeit.
Spiele ich dagegen nach dem Einschalten der Cam erst einmal mit dem Decoder für den Fokus, läuft auch nach dem Einschalten des Liveviews gar nichts mehr!
Ich finde das ein wenig merkwürdig und wenn das schon jemand mal gepostet hat, ist es mir leider hier entgangen. Nun denn ich habe verstanden und kann von der Basis aus weiterspielen!
Gibt es denn irgendwo eine übersichtlichere Zusammenstellung der möglichen Befehle und Syntax als bei circuits@home? Das SDK ist ja laut Canon wohl nur für Firmen zugänglich.
 
Spannend :eek: Muß ich mal testen, ob das bei mir auch so ist. Meine Cam geht aufgrund des immer eingestellten Videomodus eh immer in Liveview. Ich mach da keine Fotos mit. :ugly:

Viele Möglichkeiten findest du direkt in der lib (canoneos.h). Da kommt man schon ganz gut klar mit, nur ist eben nicht alles drin.

Das Canon SDK bekommt man auch als Privatmann, wenn man sich auf der Website bei denen als "Enwickler" bewirbt. http://www.didp.canon-europa.com/
 
WERBUNG
Zurück
Oben Unten