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

ok, dann passts ja :)

So richtig smooth wohl nicht, das schafft die OKi-Version glaube ich auch nicht.
Daher gefällt mir die Idee mit dem Joystick/Poti, damit würde es gehen.

Von der Software/Protokoll her, hat man 3 Möglichkeiten (Schrittweiten), 1 & 2 laufen recht sanft
aber auch langsam, 3. Weite ist deutlich im Video sichtbar (dafür kann man aber ohne umgreifen über den kompletten Bereich fokusieren).

Sollte vielleicht auch nochmal erwähnen das ich selber noch am Experimentieren bin,
also erwartet bitte nicht zu viel !

Denke mal den Stand des OKI-Focus-Systems bekommen wir auch hin, vielleicht sogar noch einen Tick besser (hatte glaube mal gelesen das die auch auf Arduino-Basis arbeiten). :cool:

Gruß,
Olli
 
Hi,
ich bin ja auch blöd, okii bietet den Quellcode sogar vorbildlich mit an:

https://www.okii.net/Articles.asp?ID=239

Hab denen mal ne Mail geschrieben, mal sehen ob man da was interessantes drin findet.
Man könnte den Code auch komplett übernehmen, aber erstmal schauen, das mit den ganzen Tastern gefällt mir nicht !

Gruß,
Olli

PS: Muss schon agen, alle achtung vor Okii, viele andere Firmen würden sich nicht an die GPL halten (aber erstmal auf die Antwort warten).


EDIT: ist er das ?: svn checkout http://okii-001.googlecode.com/svn/trunk/ okii-001-read-only
EDIT2: nö, nur die GPLv2
 
Zuletzt bearbeitet:
gibt es eigentlich auch eine Fuktion, um den Zoom (Auschnittvergrößerung) des LCD per Remote zu steuern. Habe es bisher in den libraries nicht gefunden. Diese Funktion ist ja in Verbindung mit dem focusieren recht interessant.

Walter
 
Hi,
muss mich auch noch durch alle Funktionen der Lib kämpfen.

Ich habe eine Antwort von OKII bekommen, die möchten den Code nur an Kunden raus geben :grumble:

Daher meine Frage in die Runde, hat jemand oder kennt jemand einen der Kunde bei OKII ist ?

Kann mir jemand den Code zukommen lassen ?
Durch die GPLv2 stellt das kein Problem dar, nur die wollen ihn mir nicht geben :grumble:

Danke und Gruß,
Olli

:grumble::grumble::grumble:
 
Hallo Overlook,
Klasse nummer, du hast meinen Tag gerettet (y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)

Mich regt das immer etwas auf, wenn Firmen mit OpenSource Geld verdienen und zu
kleinlich sind den Quellcode öffentlich zugänglich zu machen.

und nochmal (y)(y)(y)(y)(y)(y)(y) und danke für den 'monitorZoomButton()' Tip (y)(y)(y)(y)

Hab eben aber mal 'meinen' Source auf die neue Lib umgeschrieben (bisher nur der Focus) und dabei die Encoder abfrage in einen Timer-IRQ gesetzt (fast ohne Schrittverluste, wird aber noch):

Code:
#include <inttypes.h>
#include <avr/pgmspace.h>

#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <address.h>
#include <message.h>
#include <ptp.h>
#include <canoneos.h>

#define encoder0PinA  2
#define encoder0PinB  3
#define encoder1PinA  4
#define encoder1PinB  5
#define encoder2PinA  A0
#define encoder2PinB  A1
#define encoder3PinA  A2
#define encoder3PinB  A3
#define sw0Pin  6

volatile int encoder0Pos = 0;
volatile int encoder1Pos = 0;
volatile int encoder2Pos = 0;
volatile int encoder3Pos = 0;
volatile int sw0Pos = 0;

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

volatile int iso_mode = 0;
volatile int aperture_mode = 0;
volatile int shutter_mode = 0;


void doEncoder() {
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
//  Serial.println (encoder0Pos, DEC);
}

void initEncoder() {
  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

  pinMode(encoder3PinA, INPUT); 
  digitalWrite(encoder3PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder3PinB, INPUT); 
  digitalWrite(encoder3PinB, HIGH);       // turn on pullup resistor

  pinMode(sw0Pin, INPUT); 
  digitalWrite(sw0Pin, HIGH);       // turn on pullup resistor

  encoder0PinALast = digitalRead(encoder0PinA);
  encoder1PinALast = digitalRead(encoder1PinA);
  encoder2PinALast = digitalRead(encoder2PinA);
  encoder3PinALast = digitalRead(encoder3PinA);
}

void readEncoder() {
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
     } else {
       encoder0Pos++;
     }
//     Serial.print (encoder0Pos);
//     Serial.println ("/0 ");
   } 
   encoder0PinALast = n;

   n = digitalRead(encoder1PinA);
   if ((encoder1PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder1PinB) == LOW) {
       encoder1Pos--;
     } else {
       encoder1Pos++;
     }
     Serial.print (encoder1Pos);
     Serial.println ("/1 ");
   } 
   encoder1PinALast = n;

   n = digitalRead(encoder2PinA);
   if ((encoder2PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder2PinB) == LOW) {
       encoder2Pos--;
     } else {
       encoder2Pos++;
     }
     Serial.print (encoder2Pos);
     Serial.println ("/2 ");
   } 
   encoder2PinALast = n;

   n = digitalRead(encoder3PinA);
   if ((encoder3PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder3PinB) == LOW) {
       encoder3Pos--;
     } else {
       encoder3Pos++;
     }
     Serial.print (encoder3Pos);
     Serial.println ("/3 ");
   } 
   encoder3PinALast = n;

   if (digitalRead(sw0Pin) == LOW) {
     Serial.println ("SW");
     sw0Pos = 1;
   }
}

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



void setup() {
    Serial.begin( 115200 );
    Serial.println("Start");
    initEncoder();
    if (Usb.Init() == -1)
        Serial.println("OSC did not start.");
    delay(1000);

    TCNT2 = 50;
    TCCR2A = 0;
    TCCR2B = (1<<CS22) | (1<<CS20);
    TIMSK2 |= (1<<TOIE2);
    sei();

}


ISR(TIMER2_OVF_vect) {  
  readEncoder();
}  


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;
        encoder3Pos = 0;
    }
    if (stateConnected == stConnected) {
      if (sw0Pos > 0) {
          Eos.Capture();
          delay(5000);
          sw0Pos = 0;
      }
      if (encoder0Pos > 0) {
        ((CanonEOS*)ptp)->MoveFocus(3);
      } else if (encoder0Pos < 0) {
        ((CanonEOS*)ptp)->MoveFocus(0x8003);
      }
      encoder0Pos = 0;
    }
}

Gruß,
Olli

PS: ACHTUNG, es müssen die USB und PTP-Lib's v2.0 installiert werden
https://github.com/felis/USB_Host_Shield_2.0
https://github.com/felis/PTP_2.0
 
Freut mich, dass ich Dir weiterhelfen konnte. Und mir auch :D Hoffentlich kommt mein USB-Shield zum Wochenende.

Sind die wirklich alle nötig oder hast du da ein paar libraries drin, die Du nur zu testzwecken noch drin hast?
Code:
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <address.h>
#include <message.h>
#include <ptp.h>
#include <canoneos.h>
 
Gute Frage, wie gesagt, ist alles mehr oder weniger aus examples zusammen geworfen :eek:

Müsste man mal bereinigen, im Moment stellt es aber kein Problem dar,
daher erstmal die wichtigeren Sachen (z.B. Encoder).

Gruß,
Olli

PS: würde gerne einen Schieberegister als Port-Expander nutzen (mehr Encoder/LED's/Taster/... möglich) !?!?!
 
klasse ....

aber auch in der neuen canoneos.h fehlen die hexwerte für zoom und zoomPosition. Die habe ich aber in einer anderen Quelle gefunden:ebenfalls opensource: gphoto2

#define PTP_OC_CANON_EOS_DriveLens 0x9155
#define PTP_OC_CANON_EOS_DepthOfFieldPreview 0x9156
#define PTP_OC_CANON_EOS_ClickWB 0x9157
#define PTP_OC_CANON_EOS_Zoom 0x9158
#define PTP_OC_CANON_EOS_ZoomPosition 0x9159
#define PTP_OC_CANON_EOS_SetLiveAfFrame 0x915a
#define PTP_OC_CANON_EOS_AfCancel 0x9160

die müssen dann "nur" noch eingearbeitet werden.

Walter.
 
danke Walter (y)(y)(y)(y)(y),
aber leider hatte ich den Movi-Record-Butten in den gphoto2 quellen nicht gefunden.

Die info fehlt leider auch in den Quellen von OKII,
aber in goggle-codesearch habe ich es gefunden:
http://www.google.de/codesearch#cZwlSNS7aEw/external/libmtp/src/ptp.h&q=EVFRecordStatus&type=cs

Jetzt funktioniert auch die Video-Aufnahme per Taster :D

Code:
#include <inttypes.h>
#include <avr/pgmspace.h>

#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <address.h>
#include <message.h>
#include <ptp.h>
#include <canoneos.h>

#define encoder0PinA  2
#define encoder0PinB  3
#define encoder1PinA  4
#define encoder1PinB  5
#define encoder2PinA  A0
#define encoder2PinB  A1
#define encoder3PinA  A2
#define encoder3PinB  A3
#define sw0Pin  6

volatile int encoder0Pos = 0;
volatile int encoder1Pos = 0;
volatile int encoder2Pos = 0;
volatile int encoder3Pos = 0;
volatile int sw0Pos = 0;

#ifndef EOS_DPC_EVFRecordStatus
#define EOS_DPC_EVFRecordStatus				0xD1B8
#endif


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

volatile int iso_mode = 0;
volatile int aperture_mode = 0;
volatile int shutter_mode = 0;
volatile char recording_mode = 0;

void doEncoder() {
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
//  Serial.println (encoder0Pos, DEC);
}

void initEncoder() {
  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

  pinMode(encoder3PinA, INPUT); 
  digitalWrite(encoder3PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder3PinB, INPUT); 
  digitalWrite(encoder3PinB, HIGH);       // turn on pullup resistor

  pinMode(sw0Pin, INPUT); 
  digitalWrite(sw0Pin, HIGH);       // turn on pullup resistor

  encoder0PinALast = digitalRead(encoder0PinA);
  encoder1PinALast = digitalRead(encoder1PinA);
  encoder2PinALast = digitalRead(encoder2PinA);
  encoder3PinALast = digitalRead(encoder3PinA);
}

void readEncoder() {
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
     } else {
       encoder0Pos++;
     }
//     Serial.print (encoder0Pos);
//     Serial.println ("/0 ");
   } 
   encoder0PinALast = n;

   n = digitalRead(encoder1PinA);
   if ((encoder1PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder1PinB) == LOW) {
       encoder1Pos--;
     } else {
       encoder1Pos++;
     }
     Serial.print (encoder1Pos);
     Serial.println ("/1 ");
   } 
   encoder1PinALast = n;

   n = digitalRead(encoder2PinA);
   if ((encoder2PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder2PinB) == LOW) {
       encoder2Pos--;
     } else {
       encoder2Pos++;
     }
     Serial.print (encoder2Pos);
     Serial.println ("/2 ");
   } 
   encoder2PinALast = n;

   n = digitalRead(encoder3PinA);
   if ((encoder3PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder3PinB) == LOW) {
       encoder3Pos--;
     } else {
       encoder3Pos++;
     }
     Serial.print (encoder3Pos);
     Serial.println ("/3 ");
   } 
   encoder3PinALast = n;

   if (digitalRead(sw0Pin) == LOW) {
     Serial.println ("SW");
     sw0Pos = 1;
   }
}

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

void setup() {
    Serial.begin( 115200 );
    Serial.println("Start");
    initEncoder();
    if (Usb.Init() == -1)
        Serial.println("OSC did not start.");
    delay(1000);

    TCNT2 = 50;
    TCCR2A = 0;
    TCCR2B = (1<<CS22) | (1<<CS20);
    TIMSK2 |= (1<<TOIE2);
    sei();
}

ISR(TIMER2_OVF_vect) {  
  readEncoder();
}  

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;
        encoder3Pos = 0;
    }
    if (stateConnected == stConnected) {
      if (sw0Pos > 0) {

        if (recording_mode == 0) {
            Eos.SetProperty(EOS_DPC_EVFRecordStatus, 4);
            delay(100);
            sw0Pos = 0;
            recording_mode = 1;
        } else {
            Eos.SetProperty(EOS_DPC_EVFRecordStatus, 0);
            delay(100);
            sw0Pos = 0;
            recording_mode = 0;
        }
      }
      if (encoder0Pos > 0) {
        ((CanonEOS*)ptp)->MoveFocus(3);
      } else if (encoder0Pos < 0) {
        ((CanonEOS*)ptp)->MoveFocus(0x8003);
      }
      encoder0Pos = 0;
    }
}

Zu der Frage nach dem Schieberegister, ich wollte damit nur fragen ob jemand was dagegen hat, da ich den Code auch darauf ausrichten werde !

Gruß,
Olli
 
Zuletzt bearbeitet:
I2C : 400khz / 2pins / timeouts / umständlich / teuer

SPI (Schieberegister): >1Mhz / 3Pins / einfach / billig

:angel:
 
Ich meine den I2C-Port kann man ja mal freilassen,
aber für die Encoder doch lieber über die Register (da is I2C zu langsam für).

Achso: der Record-Button hat noch einen Bug, wenn ich das 3. mal drauf drücke,
wird irgendeine andere Funktion aktiviert, aber nicht mehr die Aufnahme :(

Gruß,
Olli
 
Nachdem das USB-Shield wirklich angekommen ist, kaufe ich nun noch den drehgeber. Benötige ich noch Widerstände und Kondensatoren um diesen anzuschliessen? erstmal ohne Schieberegister?
 
Hi overlook,
freut mich !!!!

Wiederstände werden ohne Schieberegister nicht benötigt (AVR interne PullUp's).

Gruß,
Olli
 
Ich bastel grade etwas mit Arduino und dem drehgeber rum ... leider habe ich bei vielen drehbewegungen abweichende werte, also bsp. 69-70-69-69-72 statt 69-70-71-72-73 ...verstehst Du, was ich meine? Irgendne idee, wie ich das verhindern kann?

USB-Shield läuft! und die EOS library auch, so halb zumindest. manchmal wird die kamera nicht gefunden und LiveView schaltet sich nicht korrekt ein, es wird nur der spiegel hochgeklappt ....
 
Zuletzt bearbeitet:
WERBUNG
Zurück
Oben Unten