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

Könnte man Focuspunkte setzten und mit definierter Geschwindigkeit
auf Tastendruck anfahren?

Ich würde eine Lösung mit Joystick vorziehen, bei der abhängig von der Auslenkung vor/zurück fokussiert wird, und mit steigender Auslenkung vor/zurück die Frequenz der Kommandos steigt bis zum sinnvollen Maximum.

Hab mal ein neues Video gemacht :) :
http://www.youtube.com/watch?v=85LzfTTRxLc
*Beim Slider wurde per Taste zwischen 2 Punken umgeschaltet (Werte leider noch Hard-Coded)
*Das Lineal wurde per Joystick mit den 3 Geschwindigkeiten focusiert
* Und dann nochmal die A->B Taste ohne Slider

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?
Hab den Timer etwas verbessert, hoffe es geht nun besser.

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 ....
Bei mir auch, wenn man aber lange genug wartet bevor man etwas sendet, klappt es besser.

Wer kein Analog-Stick/Poti hat: sollte diese Zeile auskommentieren: // val = analogRead(4) / 100 - 5;

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;
volatile int val = 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.println (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 = 128;
    TCCR2A = 0;
    TCCR2B = (1<<CS22);
    TIMSK2 |= (1<<TOIE2);
    sei();
}


ISR(TIMER2_OVF_vect) {  
  readEncoder();
}  

void loop() {
  val = analogRead(4) / 100 - 5;

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

      encoder0Pos = 40;
      while (encoder0Pos-- > 0) {
          ((CanonEOS*)ptp)->MoveFocus(2);
          delay(10);
      }
      encoder0Pos = 0;

//            Eos.SetProperty(EOS_DPC_EVFRecordStatus, 4);
            delay(100);
            sw0Pos = 0;
            recording_mode = 1;
        } else {

      encoder0Pos = 40;
      while (encoder0Pos-- > 0) {
          ((CanonEOS*)ptp)->MoveFocus(0x8002);
          delay(10);
      }
      encoder0Pos = 0;

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

//  Serial.println (val);

        if (val > 3) {
          ((CanonEOS*)ptp)->MoveFocus(3);
        } else if (val < -3) {
          ((CanonEOS*)ptp)->MoveFocus(0x8003);
        } else if (val > 2) {
          ((CanonEOS*)ptp)->MoveFocus(2);
        } else if (val < -2) {
          ((CanonEOS*)ptp)->MoveFocus(0x8002);
        } else if (val > 1) {
          ((CanonEOS*)ptp)->MoveFocus(1);
        } else if (val < -1) {
          ((CanonEOS*)ptp)->MoveFocus(0x8001);
        }

    }
}

Gruß,
Olli
 
Hi,

jetzt habe ich auch etwas am Code gearbeitet:

Da ich bei jeder Richtungsänderung des Drehencoders einen Schritt verloren habe, habe ich mal die Routine von Peter Dannegger eingebaut,
siehe:http://www.mikrocontroller.net/topic/112603.
Bei mir läuft es jetzt sauber.

Nach mehreren Tastendrücken kam es immer zum Absturz. Daher habe ich mal die Arduino-Debounce-Library eingebaut.
siehe: http://arduino.cc/playground/Code/Bounce.

Das Auslösen der Aufnahme hat sich damit bei mir aber nicht verbessert, aber die Umschaltung des Zoomfaktors klappt jetzt gut. Um die Umschaltung des Zoomfaktors zu ermöglichen, musste ich die canoneos.h und canoneos.cpp um eine Funktion erweitern, siehe Anlage.


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>
#include <Bounce.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 BUTTON 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 n = LOW;


Bounce bouncer = Bounce( BUTTON,10 ); 

uint8_t zoomfactor = 1;
volatile uint16_t focus_step_width_forward = 3;
volatile uint16_t focus_step_width_back = 0x8003;

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



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(BUTTON,INPUT);
  digitalWrite(BUTTON, HIGH);       // turn on pullup resistor


}

void readEncoder() {
  
  static int8_t last;
    int8_t neu, diff;
    
// drehencoder funktion from Peter Dannegger
// http://www.mikrocontroller.net/topic/112603    

    neu = 0;
    if( digitalRead(encoder0PinA)== HIGH ) neu = 3;
    if (digitalRead(encoder0PinB) == HIGH) neu ^= 1;  // convert gray to binary
    diff = last - neu;				      // difference last - neu
    if( diff & 1 ){				      // bit 0 = value (1)
      last = neu;				      // store neu as next last
      encoder0Pos += (diff & 2) - 1;		      // bit 1 = direction (+/-)
    } 

// read switch with arduion debounce library 
    bouncer.update();
    int value = bouncer.read();

    if ( value == LOW)
      sw0Pos = 1;
    else
      sw0Pos = 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);

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 (encoder0Pos > 0) ((CanonEOS*)ptp)->MoveFocus(focus_step_width_forward);
      else if (encoder0Pos < 0) ((CanonEOS*)ptp)->MoveFocus(focus_step_width_back);
      encoder0Pos = 0;
    
   
  if(sw0Pos > 0){
      
      sw0Pos = 0;
      if (zoomfactor==1){
        zoomfactor = 5;
        focus_step_width_forward = 2;
        focus_step_width_back = 0x8002;
      }
      else if (zoomfactor==5){
        zoomfactor = 1;
        focus_step_width_forward = 3;
        focus_step_width_back = 0x8003;
      }
      ((CanonEOS*)ptp)->Zoom(zoomfactor);
      delay(300);
      
    }  
  }
}
 
Zuletzt bearbeitet:
Man kann die Objektive ja nicht auf einen definierten Wert
fokussieren wie z.B. 3,15m oder 10,85m, wie macht ihr das
mit vordefinierten Fokuspunkten, bzw der nötigen Kalibrierung
dazu? Den Fokusring darf man danach am Objektiv natürlich
nicht mehr berühren.
 
jetzt habe ich auch etwas am Code gearbeitet:
Klasse Sache das (y)
Gleich mal testen :)

Man kann die Objektive ja nicht auf einen definierten Wert
fokussieren wie z.B. 3,15m oder 10,85m, wie macht ihr das
mit vordefinierten Fokuspunkten, bzw der nötigen Kalibrierung
dazu? Den Fokusring darf man danach am Objektiv natürlich
nicht mehr berühren

Ich fokusiere aus das erste Objekt und dann gehe ich einfach N Schritte nach vorne und wieder zurück.

Es gibt aber glaube ich eine Möglichkeit die Possition auch auszulesen,
zumindest zwischen Objektiv und Body.

Am liebsten würde ich mein Ultraschall-Abstandsmesser mit anbauen :D
 
Hmm, irgendwie ruig geworden,
ich habe mal alles zusammengefasst und eine neue Version gebastelt, kann ich heute abend mal hochladen (inkl. den änderungen von yaumatei).

Als Focus-Bedienelement nutze ich gerade den Gas-Griff von einer alten Pistolen-Fernsteuerung (z.B. sowas: http://rc-modellbau.eshop.t-online....EB/AC14/504C/EB69/t2m_Racer_Expert_24_Ghz.jpg)

Wollte erst das Lenkrad nutzen, aber der Gas-Griff ist um einiges nützlicher, vor allem an einen Schulter-Rig befestigt, kann man beide Hände am Rig lassen und mit dem Zeigefinger
den Focus einstellen (y)

Gruß,
Olli

PS: vom Rig kann ich auch mal ein Foto reinstellen, komplett aus runden ABS-Kabel-Kanälen (~15Euro)
Vorteil: leicht und man kann per Kabel-Schellen/Clipse alles mögliche leicht anstecken (Lampen, Mic, USB-Focus, ...)
 
Ich lese noch gespannt mit. Nachbau muß aber bis nach dem Einzug ins neue Heim warten, der Löti ist schon verpackt. Eine übersichtliceh Zusammenstellung von Stückliste und Software wäre super, dann geb ich mich Ende Oktober mal dran, dann kommt auch Feedback und/oder Verbesserungsideen ... ein Rig gibts schon ...
 
Hi,
eine genaue Stückliste gibt es nicht, da bissher noch jeder nur am Experimentieren ist (glaube ich).

Den OKII wollte ich nicht nachbauen, der Code war nur zum 'Nachschlagen' gedacht,
und damit die GPL auch ihrer Bestimmung gerecht wird ;)

Wenn man nur den Focus benötigt (Ohne ISO, Shutter, ... einstellungen),
kann man einfach die folgenden 3 Teile zusammen setzen und einen der Bespiel-Codes drauf flashen:

http://www.watterott.com/de/SparkFun...m6dmsrjgp3r3p7
http://www.watterott.com/de/Arduino-Pro-328-5V/16MHz
http://www.watterott.com/de/Drehenco...12-4220F-S0024

Das Funktioniert soweit schonmal !

Gruß,
Olli
 
Hi,
wollte hier die Bälle flach halten und mich daher hier nur auf die Arduino-Platform beziehen,
da diese recht einfach ist.

Aber wenn du Fragen zu PPM oder ähnlichen hast kannst du mir gerne einen PN schicken !

Gruß,
Olli

PS: im Prinzip hängt sogar beides Zusammen, aber die Verbindung rCOS/RCOPEN24<->EOS kommt später (soweit bin ich noch nicht) :D
 
Super Projekt!

Daran hätte ich auch mal Spaß. Könntest Du denn einen Art Mini-Tutorial erstellen, wie man zu einer lauffähigen Version kommt? Also was muss mit was zusammengesteckt werden... wie flashed man das Teil... und mit welchem Code (was da der aktuelle Stand der Dinge ist)?

Mit hilfe eines solchen Tutorials "für Dummies" könnten sicher einige Leute das nachbauen und auf einen definierten Stand kommen, von dem aus man weiter rumprobieren kann!

Find ich super das Projekt!:)
 
Moin,
Könntest Du denn einen Art Mini-Tutorial erstellen, wie man zu einer lauffähigen Version kommt?

Ich kann es mal versuchen, aber im Doku schreiben bin ich extrem schlecht :eek:

Hier mal den Code wie ich ihn im Moment nutze:
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>
#include <Bounce.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;
#define BUTTON 6

#ifndef EOS_DPC_EVFRecordStatus
#define EOS_DPC_EVFRecordStatus				0xD1B8
#endif


Bounce bouncer = Bounce( BUTTON,10 ); 

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;
volatile int val = 0;


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() {
  static int8_t last[4];
  int8_t neu = 0;
  int8_t diff = 0;
  // encoder function from Peter Dannegger
  // http://www.mikrocontroller.net/topic/112603    
  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 (+/-)
  } 
  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 (+/-)
  } 
  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 (+/-)
  }
  neu = 0;
  if (digitalRead(encoder3PinA) == HIGH) {
    neu = 3;
  }
  if (digitalRead(encoder3PinB) == HIGH) {
    neu ^= 1;  // convert gray to binary
  }
  diff = last[3] - neu;				      // difference last - neu
  if( diff & 1 ){				      // bit 0 = value (1)
    last[3] = neu;				              // store neu as next last
    encoder3Pos += (diff & 2) - 1;		      // bit 1 = direction (+/-)
  }
  // read switch with arduion debounce library 
  bouncer.update();
  int value = bouncer.read();
  if ( value == LOW) {
    sw0Pos = 1;
  } else {
    sw0Pos = 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);


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

void loop() {
  val = analogRead(4) / 100 - 5;
  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) {
            encoder0Pos = 40;
            while (encoder0Pos-- > 0) {
                ((CanonEOS*)ptp)->MoveFocus(2);
                delay(10);
            }
            encoder0Pos = 0;
//            Eos.SetProperty(EOS_DPC_EVFRecordStatus, 4);
            delay(100);
            sw0Pos = 0;
            recording_mode = 1;
        } else {
            encoder0Pos = 40;
            while (encoder0Pos-- > 0) {
                ((CanonEOS*)ptp)->MoveFocus(0x8002);
                delay(10);
            }
            encoder0Pos = 0;
//            Eos.SetProperty(EOS_DPC_EVFRecordStatus, 0);
            delay(100);
            sw0Pos = 0;
            recording_mode = 0;
        }
      }

    //iso100 = 0x48, iso200 = 0x50, iso400 = 0x58, iso800 = 0x60, iso1600 = 0x68
    uint8_t iso_values[7] = {0, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70};
    if (encoder1Pos > 0) {
        if (iso_mode < 6) {
          iso_mode++;
        }
        Eos.SetProperty(EOS_DPC_Iso, iso_values[iso_mode]);
        delay(100);
    } else if (encoder1Pos < 0) {
        if (iso_mode > 0) {
          iso_mode--;
        }
        Eos.SetProperty(EOS_DPC_Iso, iso_values[iso_mode]);
        delay(100);
    }
    encoder1Pos = 0;


    uint8_t aperture_values[40] = {0x08, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x14, 0x15, 0x18, 0x1b, 0x20, 0x23, 0x24, 0x25, 0x28, 0x2b, 0x2c, 0x2d, 0x30, 0x33, 0x34, 0x35, 0x3b, 0x3c, 0x3d, 0x40, 0x43, 0x44, 0x45, 0x48, 0x4b, 0x4c, 0x4d, 0x50, 0x53, 0x54, 0x55, 0x58, 0x5b, 0x5c};
    if (encoder2Pos > 0) {
        if (aperture_mode < 39) {
          aperture_mode++;
        }
        Eos.SetProperty(EOS_DPC_Aperture, aperture_values[aperture_mode]);
        delay(100);
    } else if (encoder2Pos < 0) {
        if (aperture_mode > 0) {
          aperture_mode--;
        }
        Eos.SetProperty(EOS_DPC_Aperture, aperture_values[aperture_mode]);
        delay(100);
    }
    encoder2Pos = 0;

    uint8_t shutter_values[31] = {0x5c, 0x5d, 0x60, 0x63, 0x64, 0x65, 0x68, 0x6b, 0x6c, 0x6d, 0x70, 0x73, 0x74, 0x75, 0x78, 0x7b, 0x7c, 0x7d, 0x80, 0x83, 0x84, 0x85, 0x88, 0x8b, 0x8c, 0x8d, 0x90, 0x93, 0x94, 0x95, 0x98};
    if (encoder3Pos > 0) {
        if (shutter_mode < 39) {
          shutter_mode++;
        }
        Eos.SetProperty(EOS_DPC_ShutterSpeed, shutter_values[shutter_mode]);
        delay(100);
    } else if (encoder3Pos < 0) {
        if (shutter_mode > 0) {
          shutter_mode--;
        }
        Eos.SetProperty(EOS_DPC_ShutterSpeed, shutter_values[shutter_mode]);
        delay(100);
    }
    encoder3Pos = 0;

//canoneos.h:#define EOS_DPC_AFMode						0xD108
//canoneos.h:	enum { afmodeOneShot, afmodeAIServo, afmodeAIFocus };


//    Eos.SetProperty(EOS_DPC_ShutterSpeed, (uint16_t)readFloatSerial());
//
//    Eos.SetProperty(EOS_DPC_WhiteBalance, (uint16_t)readFloatSerial());
//
//    Eos.SetProperty(EOS_DPC_Aperture, (uint16_t)readFloatSerial());

//zoomfactor = 1 || 5
// ((CanonEOS*)ptp)->Zoom(zoomfactor);

      while (encoder0Pos != 0) {
        if (encoder0Pos > 0) {
          encoder0Pos = 0;
          ((CanonEOS*)ptp)->MoveFocus(3);
        } else if (encoder0Pos < 0) {
          encoder0Pos = 0;
          ((CanonEOS*)ptp)->MoveFocus(0x8003);
        }
//        delay(10);
      }
//  Serial.println (val);
        if (val > 2) {
          ((CanonEOS*)ptp)->MoveFocus(3);
        } else if (val < -2) {
          ((CanonEOS*)ptp)->MoveFocus(0x8003);
        } else if (val > 1) {
          ((CanonEOS*)ptp)->MoveFocus(2);
        } else if (val < -1) {
          ((CanonEOS*)ptp)->MoveFocus(0x8002);
        } else if (val > 0) {
          ((CanonEOS*)ptp)->MoveFocus(1);
        } else if (val < -0) {
          ((CanonEOS*)ptp)->MoveFocus(0x8001);
        }

    }
}

Gruß,
Olli
 
Moin,

Ich kann es mal versuchen, aber im Doku schreiben bin ich extrem schlecht :eek:

Wär wirklic ganz lieb und ich glaube so man anderer hier würde das auch sehr begüßen. Bis jetzt scheint das ja noch halbwegs übersichtlich zu sein... und diese Chance sollte man nutzen, damit Intessierte die Möglichkeit haben auf einen ähnlichen Stand zu kommen.

Vielen Dank im Voraus schon mal. :)
 
Hi,

Wär wirklic ganz lieb und ich glaube so man anderer hier würde das auch sehr begüßen. Bis jetzt scheint das ja noch halbwegs übersichtlich zu sein... und diese Chance sollte man nutzen, damit Intessierte die Möglichkeit haben auf einen ähnlichen Stand zu kommen.

https://sourceforge.net/p/diy-usb-focus/home/Home/

https://sourceforge.net/p/diy-usb-focus/wiki/Home/

git clone https://unixconf@git.code.sf.net/p/diy-usb-focus/code diy-usb-focus-code

Würde mich über Hilfe freuen :eek:

Gruß,
Olli
 
Auch wenn das mehr oder weniger ein Glaubenskrieg ist: Habt ihr mal darüber nachgedacht, Github statt Sourceforge zu nutzen? Ist insbesondere praktisch wenn Leute Patches submitten wollen (geht dann komfortabel per Pullrequest).
 
Supi! So ist das prima!
Vielleicht kannst du noch angeben welchen Drehencoder du benutzt und welches Gehäuse? Vielleicht Links zum Conrad?
 
Frage: Hat schon jemand einen 11pol. miniUSB-Stecker oder Adapterkabel gefunden, das man zum Umbau benutzen kann? Um die MiniUSB-Buchse zum gleichzeitigen Steuern und Anschluss eines externen (Sucher)-Monitors zu benutzen, benögt man einen 11pol. miniUSB.

Walter.
 
WERBUNG
Zurück
Oben Unten