Schrittmotoren per Joystick bedienen

Hallo Leute

ich habe ein Problem und komm einfach nicht auf die Lösung. Vielleicht sieht jemand von euch, wo das Problem liegt.
Wie die Überschrift schon sagt, möchte ich über ein Arduino und Motortreiber-Shield per Joystick 2 Schrittmotoren steuern.
Ich habe mir gedacht, wenn ich auf den Joystick drücke, soll per Serial-Monitor die Position oben (o) oder unten (u) abgefragt werden und eine Zählvariable auf Null gesetzt werden.
Nun fahr ich mit einem Motor auf die nächste gewünschte Position und drücke wieder auf den Joystick. Jetzt sollte ich eben die 2 Position bestätigen und die Steuerung weiss nun “wieviele” Schritte sie fahren muss.
Das ganze habe ich in die Funktion “Bestaetigen” versucht zu verwursteln. Mein Problem ist, dass das Programm auch reinspringt, auch wenn die Bedingung nicht erfüllt ist.

Naja ich bin nicht der Superprogrammierer, aber ich glaub es ist verständlich. Ich komm leider nicht weiter.
Danke schon mal im Voraus.

Viele Grüsse aus der Schweiz

Ben

#include <AFMotor.h>
const int SW_pin = 16; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
int countX = 0;
int countY = 0;
int deltaX;
int deltaY;
AF_Stepper motor1(200, 2);
AF_Stepper motor2(200, 1);

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);
  motor1.setSpeed(100); // Set motor 1 speed to 50 rpm
  motor2.setSpeed(100); // Set motor 2 speed to 50 rpm
 }

void bestaetigen() {
    
      if (digitalRead(SW_pin)== LOW){
      Serial.println("Enter U fuer Unten oder O fuer oben");
      while(!Serial.available()); 
      char checkinput = Serial.read();
      Serial.println("Input?");
      Serial.print(checkinput);
      Serial.print("\n");
        if (checkinput=='u'){
        countX=0;
        Serial.println("2. Endpunkt anfahren");
        Serial.print("CountX:   ");
        Serial.print(countX);
        Serial.print("\n");
        delay(2000);}
        else if (checkinput=='o'){  //{}
        deltaX=countX;
        Serial.print("2DeltaX:   ");
        Serial.println(deltaX);
        Serial.print("\n");
        delay(2000);}
        }
}

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
//  Serial.print("unterer Punkt anfahren");
//  delay(2000);
  
  
if (analogRead(X_pin) < 300) {
  motor2.step(50, FORWARD, MICROSTEP);
  countX = countX-1;
  Serial.print("If schleife 1 ");
  Serial.print(countX);
    
    }
else if (analogRead(X_pin) > 800) {
  motor2.step(50, BACKWARD, MICROSTEP);
  countX = countX+1;
  Serial.print("If schleife 2 ");
  Serial.print(countX);
  
    }
else if (analogRead(Y_pin) < 300) {
  motor1.step(50, FORWARD, MICROSTEP);
  countY = countY-1;
  Serial.print("If schleife 3 ");
  Serial.print(countY);
  
    }
else if (analogRead(Y_pin) > 800) {
  motor1.step(50, BACKWARD, MICROSTEP);
  countY = countY+1;
  Serial.print("If schleife 4 ");
  Serial.print(countY);
    }


 bestaetigen();
 
}
 /code]

Joystick.ino (2.21 KB)

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Gruß Tommy

Hallo Tommy,

sorry, ich dachte er macht das automatisch, wenn ich ein ino-Datei hochlade. Wieder was gelernt.

Danke

Wir lernen alle (hoffentlich) ständig dazu und das macht den Reiz dieses Forums aus.

Gruß Tommy

Probier es mal so

#include <AFMotor.h>

const int SW_pin = 16; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
int countX = 0;
int countY = 0;
int deltaX;
int deltaY;

AF_Stepper motor1(200, 2);
AF_Stepper motor2(200, 1);

void setup()
{
	pinMode(SW_pin, INPUT);
	digitalWrite(SW_pin, HIGH);
	Serial.begin(9600);
	motor1.setSpeed(100); // Set motor 1 speed to 50 rpm
	motor2.setSpeed(100); // Set motor 2 speed to 50 rpm
}

void bestaetigen()
{
	
	if (digitalRead(SW_pin) == LOW)
	{
		Serial.println("Enter U fuer Unten oder O fuer oben");
		
		char checkinput = char (0);

		while(!Serial.available());
		{
			checkinput = Serial.read();
		}
		
		Serial.println("Input?");
		Serial.print(checkinput);
		Serial.print("\n");
		
		if (strcmp(checkinput, 'u') == 0)
		{
			countX=0;
			Serial.println("2. Endpunkt anfahren");
			Serial.print("CountX:   ");
			Serial.print(countX);
			Serial.print("\n");
			delay(2000);
		}
		else if (strcmp(checkinput, 'o') == 0)
		{
			deltaX=countX;
			Serial.print("2DeltaX:   ");
			Serial.println(deltaX);
			Serial.print("\n");
			delay(2000);
		}
	}
}

void loop()
{
	Serial.print("Switch:  ");
	Serial.print(digitalRead(SW_pin));
	Serial.print("\n");
	Serial.print("X-axis: ");
	Serial.print(analogRead(X_pin));
	Serial.print("\n");
	Serial.print("Y-axis: ");
	Serial.println(analogRead(Y_pin));
	Serial.print("\n\n");
	//  Serial.print("unterer Punkt anfahren");
	//  delay(2000);
	
	
	if (analogRead(X_pin) < 300)
	{
		motor2.step(50, FORWARD, MICROSTEP);
		countX = countX-1;
		Serial.print("If schleife 1 ");
		Serial.print(countX);
		
	}
	else if (analogRead(X_pin) > 800)
	{
		motor2.step(50, BACKWARD, MICROSTEP);
		countX = countX+1;
		Serial.print("If schleife 2 ");
		Serial.print(countX);
		
	}
	else if (analogRead(Y_pin) < 300)
	{
		motor1.step(50, FORWARD, MICROSTEP);
		countY = countY-1;
		Serial.print("If schleife 3 ");
		Serial.print(countY);
		
	}
	else if (analogRead(Y_pin) > 800)
	{
		motor1.step(50, BACKWARD, MICROSTEP);
		countY = countY+1;
		Serial.print("If schleife 4 ");
		Serial.print(countY);
	}


	bestaetigen();
	
}

Hallo FlyingEagle

es hat so halb funktioniert. Also wenn ich den unteren Endpunkt setze funktioniert es, wenn ich dann den oberen Endpunktsetze springt er dann trotzdem in den Teil der If-Schleife für den unteren Endpunkt, obwohl ich ein "o" eingetippt habe. Hat da jemand noch eine Idee?

Danke schon mal im Voraus.

Gruss Ben

Ersetz mal

while(!Serial.available());
{
    checkinput = Serial.read();
}

durch

while(!Serial.available());
checkinput = Serial.read();