Ich bin wieder da. Ich hätte nicht gedacht, dass es im Schwarzwald so viele Funklöcher gibt, dann auch noch in der Ferienwohnung
PS.: Ich habe ja Leuten beim Nutzen eines Sliders zugeschaut. Die haben zigmal die Position ausprobiert, bevor es für das Model "Action" hieß. Daher solltest Du auch einen Einstellmodus haben, bei dem die einzelnen Positionen für eine beliebeige Zeit angefahren bleiben. Allerdings haben die Leute ein Video gedreht, Du machst ja wohl Fotos.
Das Ganze spare ich mir, da ich die Kamera vor der Montage auf dem Schlitten auch kurz von Hand von A nach B bewegen kann.
Ich bin immer noch hin und her gerissen, ob ich jetzt deinen Sketch übernehme oder meinen eigenen schreibe. Ich hänge momentan bei folgendem Problem fest:
Der Encoder soll im loop ja laufend ausgelesen werden, aber der Arduino zählt die Variable nur etwa alle 4-9 Drehimpulse um 1 hoch. Liegt das daran, dass der Sketch ja weiterläuft und nur in dem Moment zählt, in dem er an dieser Stelle ist? Ich glaube für den Encoder müsste ich Interrupts verwenden, aber ich habe nur 2. Einen Interrupt-Pin wollte ich für die Endtaster frei halten, da der Schlitten dort auf jeden Fall sofort anhalten muss.
Im Beispiel 'Encoder Basic' steht, dass der Encoder mit einem oder 2 Interrupts betrieben werden kann, wie müsste ich das dann mit einem Interrupt anstellen?
Mein Versuch sieht so aus, jedoch erhalte ich eine Fehlermeldung:
#include <AccelStepper.h>
#include <Encoder.h>
#define stepPin 5 //deklariert StepPin des DRV8825
#define dirPin 4 //deklariert dirPin des DRV8825
#define EncoderPinA 3 //deklariert Encoder Pin A
#define EncoderPinB 2 //deklariert Encoder Pin B
int microstep = 8; //DRV8825 im 1/8-Schritt Modus
// Definiert Stepper und die benutzten Pins
AccelStepper stepper(1, stepPin, dirPin); //erstellt Accelstepper-Objekt mit namen 'stepper'
// Definiert Encoder und die benutzten Pins
Encoder myEnc(2, 9);
void setup(){
attachInterrupt(0, encoderLesen, CHANGE);
stepper.setMaxSpeed(800*microstep); //maximale geschwindigkeit
stepper.setAcceleration(300*microstep); //Beschleunigung
Serial.begin(9600);
}
long newPosition;
void loop(){
stepper.move(newPosition*microstep); //Schritte, die gefahren werden berechnen
stepper.runToPosition(); //Schritte fahren
Serial.println(newPosition);
}
long oldPosition = -999;
void encoderLesen(){
newPosition = (myEnc.read()/4);
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
return newPosition;
}
Fehlermeldung ist: return-statement with a value, in function returning 'void' [-fpermissive]
'Void' gibt ja keinen Wert zurück, deshalb habe ich 'void encoderLesen' durch 'long encoderLesen' ersetzt. Jetzt kommt:
invalid conversion from 'long int (*)()' to 'void (*)()' [-fpermissive]
Wie gebe ich den Wert in die Hauptfunktion zurück? In deinem Sketch würde es besser funktionieren, Agmue, oder?
Nochmal kurz zu den Endtastern: Ich möchte jetzt Mikroschalter mit einem kleinen Metallhebel benutzen. Beim Schalten sollen dann der Interrupt-Pin zum Anhalten und ein Weiterer Pin für die Richtungserkennung (Endschalter links oder rechts) benutzt werden. Dafür geht auch ein Analoger Pin.