odippel
Themenersteller
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
Hab den Timer etwas verbessert, hoffe es geht nun besser.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?
Bei mir auch, wenn man aber lange genug wartet bevor man etwas sendet, klappt es 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 ....
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