Arduino Uno Focus pull via Joystick Problem!?

Hallo Zusammen,

ich habe mich jetzt in den letzten 4 Monaten in Arduino eingearbeitet.
Zur Zeit baue ich für mein DJI Ronin Kameragimbal einen Follow Focus, den ich via Joystick (Poti) ansteure.
Die Steuerung läuft über einen Arduino Uno

Zur Schrittmotorsteuerung nutze ich einen Easydriver von Schmalzhaus.

Nun zu meinem Problem:

Ich kann die Drehrichtung bestimmen & der Motor wird einwandfrei angesteuert. Jedoch dreht sich der Motor zurück sobald der Joystick in Nullstellung ist.

Könnt ihr mir vielleicht weiterhelfen und mir einen Denkansatz Richtung "IF - THEN" geben ?
Ich kann den genauen Wert über den Serialmotor leider nicht auslesen, da dieser sehr Sprunghaft ist..

Dementsprechend Weiß ich auch nicht so genau wie ich das im Programmcode anwende.

Zum Code muss ich sagen, dass ich mir diesen aus verschiedenen Quellen zusammengeschustert habe..

int direction;    // Variable to set Rotation (CW-CCW) of the motor
int steps = 1025; // Assumes the belt clip is in the Middle
int val = 0;

void setup() {
  Serial.begin(250000);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(dir_pin, OUTPUT);
  pinMode(step_pin, OUTPUT);
  pinMode(SLEEP, OUTPUT);

  digitalWrite(SLEEP, HIGH);  // Wake up EasyDriver
  delay(5);  // Wait for EasyDriver wake up


  /* Configure type of Steps on EasyDriver:
  // MS1 MS2
  //
  // LOW LOW = Full Step //
  // HIGH LOW = Half Step //
  // LOW HIGH = A quarter of Step //
  // HIGH HIGH = An eighth of Step //
  */

  digitalWrite(MS1, LOW);      // Configures to Full Steps
  digitalWrite(MS2, HIGH);    // Configures to Full Steps

}

void loop() {
  val = analogRead(X_pin);
  Serial.print("xpin value= ");
  Serial.println(val);
  Serial.print("steps value= ");
  Serial.println(steps);
//end serial
  
  while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 100) {
    if (steps > 0) {
      digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps--;
    }
  }

  while (analogRead(X_pin) > 100 && analogRead(X_pin) <= 400) {
    if (steps < 512) {
      digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps++;
    }
    if (steps > 512) {
      digitalWrite(dir_pin, HIGH);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps--;
    }
  }

  while (analogRead(X_pin) > 401 && analogRead(X_pin) <= 600) {
    if (steps < 1025) {
      digitalWrite(dir_pin, LOW);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps++;
    }
    if (steps > 1025) {
      digitalWrite(dir_pin, HIGH);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps--;
    }
  }

  while (analogRead(X_pin) > 601 && analogRead(X_pin) <= 900) {
    if (steps < 1535) {
      digitalWrite(dir_pin, LOW);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps++;
    }
    if (steps > 1535) {
      digitalWrite(dir_pin, HIGH);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps--;
    }
  }

  while (analogRead(X_pin) > 900 && analogRead(X_pin) <= 1024) {
    if (steps < 2050) {
      digitalWrite(dir_pin, LOW);
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps++;
    }
  }
}

Ich bedanke mich im Voraus! :o

hi,

ich hab' mir jetzt den code nicht angesehen, aber ist es so, daß der motor der stellung des joysticks folgt? also, daß der motor bis zur halben strecke fährt, wenn der stick zur hälfte der stick-strecke betätigt wird? dann ist ja auch klar, daß er zurückfährt.

ich glaube aber, daß das nicht "repariert" gehört, sondern der denkansatz geändert:

wäre es nicht besser, wenn der motor nicht dem stick nachfährt, sondern umso schneller dreht, je stärker der stick gedrückt wird. ist der stick auf null, steht der motor, je stärker Du den stick nach vorn drückst, umso schneller dreht der motor in die richtige richtung.
nach hinten genauso.

würde ich sinnvoller finden, aber ich kenn natürlich den zweck zu wenig.

gruß stefan

Ich stimme Stefan zu. Wenn die Kamera beim Loslassen des Joysticks stehen bleiben soll, dann sollte der Joystick die Bewegung (Richtung, Geschwindigkeit) des Motors bestimmen, mit Geschwindigkeit 0 im neutralen (losgelassenen) Zustand.

Anmerkungen dazu:
Um den Nullpunkt des Joysticks einen Tot-Bereich vorsehen, innerhalb dessen der Motor stehenbleibt. Ein Joystick kann bei unterschiedlichen Werten stehen bleiben, je nachdem ob er vorher nach links oder rechts gedrückt wurde, und wie stark. Sprich: die Kamera darf nach dem Loslassen keinesfalls weiterkriechen.

Da der Motor dann auch noch drehen kann, wenn die Kamera schon am Anschlag ist, ggf. Endschalter einbauen, über die der Motor dann abgeschaltet wird (direkt oder per Code). Sonst reißt irgendwann das Kabel an der Kamera ab, oder noch Schlimmeres (Seilwinde...).