Position des Schrittmotors speichern und wiedergeben

Hallo liebes Arduino Forum,

ich bin ziemlich neu hier und beschäftige mich erst seit kurzem mit Arduino und versuche mich gerade an einer Steuerung für Schrittmotoren und bin nun auf das folgenden Problem gestoßen und komme nicht mehr weiter.

Erstmal eine kurze Erklärung zu meinem Projekt:

Ich möchte mit einem Joystick einen Schrittmotor ansteuern. Findet eine Auslenkung am Joystick statt, soll sich der Motor bewegen. Soweit so gut und dies funktioniert auch.
Jedoch möchte ich im nächsten Schritt die Position des Schrittmotors speichern und wenn ich den Schrittmotor weiterbewege, mit Hilfe eines Tasters zurück zu der gespeicherten Position zurückkehren.

Dafür benutze ich zwei Taster, wobei der eine Taster eigentlich ein Endtstop ist ( da es aber eigentlich auch ein Taster ist, denke ich nicht, dass es ein Problem darstellen sollte?). Der normale Taster ist sendet ein LOW signal aus wenn er betätigt wird.
Beim Betätigen des ersten Tasters soll die Position gespeichert werden und beim betätigen des zweiten Tasters soll die Position des Schrittmotors wieder zurückkehren.

Ich stehe nun vor dem Problem, dass es nur in eine Richtung funktioniert (für X > 562) für X < 462 funktioniert es gar nicht.

int stepPin1 = 6;
int dirPin1  = 7;
int stepPin2 = 8;
int dirPin2  = 9;
float joyStickX = A0;
float joyStickY = A1;
int taster = 12;
const int switchPin1 = 2;

float jsXValue = 0;   //Variable zur Speicherung des X Wertes
float jsYValue = 0;   // Variable zur Speicherung des Y Wertes
int tasterStatus;
int switchStatus = 0;
int steps1 = 0;
int steps2 = 0;

int steps1Value;
int steps2Value;

int stepSpeed = 5;

void setup()
{
  pinMode(stepPin1, OUTPUT);
  pinMode(dirPin1, OUTPUT);
  pinMode(stepPin2, OUTPUT);
  pinMode(dirPin2, OUTPUT);
 
  pinMode(joyStickX, INPUT);
  pinMode(joyStickY, INPUT);
  pinMode(taster, INPUT_PULLUP);
  pinMode(switchPin1, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop(){

  tasterStatus = digitalRead(taster);
   
  switchStatus = digitalRead(switchPin1);


  if(tasterStatus == LOW){
    steps1 = 0;
    steps2 = 0;
   
    
  }
  
  if(switchStatus == HIGH){
    

    steps1 = steps1Value;
    for( int x = 0; x < steps1Value; x++){
      digitalWrite (dirPin1, LOW);    //Richtungsangabe, entgegen Urzeigersinn
   
      digitalWrite(stepPin1, HIGH);
      delay(stepSpeed);
      digitalWrite(stepPin1, LOW);
      delay(stepSpeed);
      }
   
    
    steps2 = steps2Value;
    for( int x = 0; x < steps2Value; x++){
      digitalWrite (dirPin1, HIGH);    //Richtungsangabe, entgegen Urzeigersinn
   
      digitalWrite(stepPin1, HIGH);
      delay(stepSpeed);
      digitalWrite(stepPin1, LOW);
      delay(stepSpeed);
  
     }
     
     
    }
   
  
  
  
  
  jsXValue = analogRead(joyStickX);  // Auslesen der Spannung am JoyStick
  
  
  if ( jsXValue > 562 )             // falls Wert größer 712. Bewegung nach Rechts
  { digitalWrite (dirPin1, HIGH);    //Richtungsangabe, entgegen Urzeigersinn
   
    digitalWrite(stepPin1, HIGH);
    delay(stepSpeed);
    digitalWrite(stepPin1, LOW);
    delay(stepSpeed);

    steps1Value = steps1++;
    
  }
 

 
    jsXValue = analogRead(joyStickX);  // Auslesen der Spannung am Joystick
  
  if ( jsXValue < 462)               // falls Wert kleiner 462 Bewegung nach links
  { digitalWrite (dirPin1, LOW);     // Richtungangabe, mit dem Urzeigersinn
  
    digitalWrite(stepPin1, HIGH);
    delay(stepSpeed);
    digitalWrite( stepPin1, LOW);
    delay(stepSpeed);

    steps2Value = steps2++;
  
}
}

Das ist nebenbeibemerkt nur ein Ausschnitt meines Codes. Der komplette ist einfach nur für zwei Schrittmotoren, daher sind so viele Variablen benannt am Anfang.

Wenn ich die Reihenfolge der beiden for Schleifen vertausche funktioniert übrigens dann gar nichts mehr.
Die Taster funktlionieren auf jeden Fall. Wenn ich bei der selben Schaltung einen anderen Code drauflade (z.B. wenn der Taster berührt wird, sollen sich die Schrittmotoren aufhören zu drehen), funktioniert alles.

Ich wäre euch sehr dankbar, wenn ihr mir bei diesem Problem helfen könntet oder Ideen habt, was ich vändern könnte.

Liebe Grüße
GlitzerFee

EDIT: okay ich nehme es zurück. Der code ist sicherlich total fehlerhaft, da im Fall ( x> 562) es auch nur (gefühlt) zufällig funktioniert.

    steps1Value = steps1++;

Habe die Logik evtl. nicht verstanden, aber ich fürchte,steps1Valuebleibt immer 0.

Auch würde ich den Joystick nur einmal auslesen und dann nur eins von { links/nichts/rechts } machen.

michael_x:

    steps1Value = steps1++;

Habe die Logik evtl. nicht verstanden, aber ich fürchte,steps1Valuebleibt immer 0.

Auch würde ich den Joystick nur einmal auslesen und dann nur eins von { links/nichts/rechts } machen.

ich habe gehofft, dass die heraufgezählten Schritte in steps 1 Value gespeichert werden können. Aber es kann sehr gut sein, dass es nicht funktioniert. Ich bin mir selber mit den ganzen Funktionen und was man machen kann und was nicht, so sicher.

Hmm.. okay ich probier dann nochmal etwas rum :slight_smile:

ich probier dann nochmal etwas rum

Gut.
Tips: vermeide die doppelten Variablen steps1 und steps1value oder erklär, warum du die brauchst

  steps1++; // aktuelle Position merken  oder so, sollte reichen ...

Ich verstehe auch nicht, weshalb du 4! Variablen brauchst, um dir die Steps zu merken. Dazu reicht eine einzige.
Wenn Du den joystick so bewegst, dass sich der Motor im Uhrzeigersinn dreht, zählst Du sie bei jedem Schritt eins hoch. Dreht sich der Motor andersherum, ziehst Du bei jedem Step eins ab.
Da die Variable als 'int' auch mit Vorzeichen umgehen kann, funktioniert das in beide Richtugnen vom Ausgangspunkt. In der Variablen steht dann immer, wieviel Schritte rechts ( positiv ) oder links ( negativ ) vom Ausgangspunkt dein Schrittmotor gerade steht.
Willst Du zurück zum Ausgangspunkt, musst Du dann genau soviele Schritte - je nach Vorzeichen rechts oder linksherum - machen um wieder dort anzukommen. Dazu brauchst Du dann auch nur eine for-Schleife. Deinen Dir-Ausgang setzt Du je nach Vorzeichen auf rechts oder linksherum und dann verwendest Du in der for-Schleife den Absolutwert des Step-Zählers.

Noch eine Anmerkung;
float brauchst Du in deinem Sketch gar nicht.
Auch die Pin-Nummern der Analogeingänge sind ganz normale Zahlen wie bei den Digital-Pins ( am besten als 'const byte' definieren ). Und auch die Ergebnisse von analogRead sind ganzzahlige Werte ( int ).

hey MicroBahner,

das probiere ich später mal direkt aus, ich muss mich noch ein bisschen in die Denkweise einfinden.
Und zu deiner Anmerkung, vielen dank für den Hinweis. Das wird auch direkt geändert bzw. muss ich mich mal auf jeden Fall mehr einlesen, was das angeht :'D