Problem bei der Initialisierung (Reset). !!!!!!

Hallo Zusammen,

Mein Code hat die Funktion so dass die Schritte vom Motor mit einem Tastatur eingegeben werden, alles funktioniert super ;
aber (
das Problem bei der Initialisierung (Reset ) oder bei aus und einstecken von der Spannung der Motor zittert und macht paar schritte und ab der Position wird die Initiale Position gerechnet ... also bei paar Initialisierungen wird die Null Position komplet verstellt !!! );

Bitte wie kann ich bei der Initialisierung (Reset )oder beim Wiederstellen unter Spannung immer zur bestimmten ( Null ) Position hinfahren lassen ???

Vielen Dank

#include "AccelStepper.h" // AccelStepper Library
#include <Keypad.h>  // Keypad Library
#include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 
// defines pins numbers

// Variablen, die die eingegebene Nummer auf der Tastatur halten sollen

volatile int Zahl1=99;  // wird verwendet, um zu ermitteln, wie viele Nummern auf der Tastatur eingegeben wurden

volatile int Zahl2=99;
volatile int Zahl3=99;

// Variablen zum Halten von Entfernung  und Aktl Position

int Gesamtzahl=0;  // wird verwendet, um den endgültigen berechneten Abstandswert zu speichern

String Aktuelleposition = "";  // 
 

// Keypad Setup
const byte ROWS = 4; // Vier Reihen

const byte COLS = 3; // Vier Spalten

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; //Arduino-Pins, die mit den Reihenpins der Tastatur verbunden sind

byte colPins[COLS] = {31, 33, 35}; // Arduino-Pins, die mit den Säulenpins der Tastatur verbunden sind

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Definition der Tastaturbibliothek

 
                                    
                                    
// AccelStepper Setup
AccelStepper stepper(1, 3, 10);  // 1 = Easy Driver interface
                                  // Arduino A0 verbunden mit STEP pin von Easy Driver
                                  // Arduino A1 verbunden mit DIR pin von Easy Driver
                                  


void setup(void) {
  
  
  
  
  lcd.begin(16,2);
  lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Gib Wert:");
  //  AccelStepper speed and acceleration setup
     lcd.setCursor(14,0);
     lcd.print("MM");
     lcd.setCursor(0,1);
     lcd.print("Min:0mm  Max:5mm");
  stepper.setMaxSpeed(400);  // Nicht zu schnell, oder werden Schritte verpasst
  stepper.setAcceleration(50);  //  das gleiche
  
  
  
}


void loop(){
  
  char keypressed = keypad.getKey();  // Ruft den Wert der Tastaturtaste ab, wenn gedrückt

  if (keypressed != NO_KEY){  // Wenn die Tastentaste gedrückt wird, prüfen Sie, welche Taste es war

    switch (keypressed) {
      
      case '1':
        checknumber(1);
      break;
        
      case '2':
        checknumber(2);
      break;

      case '3':
        checknumber(3);
      break;

      case '4':
        checknumber(4);
      break;

      case '5':
        checknumber(5);
      break;

      case '6':
        checknumber(6);
      break;

      case '7':
        checknumber(7);
      break;

      case '8':
        checknumber(8);
      break;

      case '9':
        checknumber(9);
      break;

      case '0':
        checknumber(0);
      break;

      case '*':
        deletenumber();
      break;

      case '#':
        Entfernung();
      break;
    }
  }

}

void checknumber(int x){
  if (Zahl1 == 99) { // wird geprüft, ob dies die erste eingegebene Zahl wurde

    Zahl1=x;
    String displayvalue = String(Zahl1);  //  Verwandle int in einen String für display
     lcd.setCursor(0,0);
     lcd.print("Gib Wert:");
     lcd.setCursor(9,0);
    
     lcd.print(displayvalue);
     lcd.setCursor(14,0);
     lcd.print("MM");
   
    
  } else {
    if (Zahl2 == 99) {  // wird geprüft, ob es sich um die zweite eingegebene Zahl handelt

      Zahl2=x;
      String displayvalue =  String(Zahl2);
     lcd.setCursor(0,0);
     lcd.print("Gib Wert:");
     lcd.setCursor(10,0);
      lcd.print(displayvalue);
      lcd.setCursor(14,0);
     lcd.print("MM");
 

    } else {  // Es muss die dritte eingegebene Zahl sein

      Zahl3=x;
      String displayvalue =   String(Zahl3);
      lcd.setCursor(0,0);
     lcd.print("Gib Wert:");
     lcd.setCursor(11,0);
       lcd.print(displayvalue);
       lcd.setCursor(14,0);
     lcd.print("MM");

    }
  }
  
     
}

 
void deletenumber() {  // Wird verwendet, um eingegebene Zahlen zurückzusetzen

  if (Zahl1 != 99 || Zahl2 != 99 || Zahl3 !=99) {
       lcd.clear( );
       lcd.setCursor(0,0);
       lcd.print("Gib Wert:");
       lcd.setCursor(14,0);
       lcd.print("MM"); 
       lcd.setCursor(0,1);
       lcd.print("Min:0mm  Max:5mm");
       resetnumbers();
       checknumber;    
  } 
   
}
  
void Entfernung() {  // Dient zum Erstellen einer vollständigen Nummer aus den eingegebenen Nummern


    if (Zahl3 == 99 && Zahl2 == 99 && Zahl1 != 99) {
      Gesamtzahl=Zahl1;
      movestepper(Gesamtzahl);
    }
    
    if (Zahl2 != 99 && Zahl3 == 99) {
      Gesamtzahl=Zahl1*10 + Zahl2;
      movestepper(Gesamtzahl);
    }
    
    if (Zahl3 != 99) {
      Gesamtzahl=Zahl1*100 + Zahl2*10 +Zahl3;
      movestepper(Gesamtzahl);
    }
    
    resetnumbers(); // Zahlen zurücksetzen, um sich für einen neuen Eintrag vorzubereiten

  } 


void movestepper(int z) {  //  stepper wird bewegt
 if ( z <= 5) {
  int calculatedmove=(z*10);  //  Anzahl der Schritte in mm berechnen

  stepper.runToNewPosition(calculatedmove);
  Aktuelleposition = String(z);
  lcd.clear();
      lcd.setCursor(0,1);
     lcd.print("Oeffnung: ");
      lcd.setCursor(9,1);
     lcd.print(Aktuelleposition);
           lcd.setCursor(14,1);

     lcd.print("MM");  }
 else {
  lcd.clear();
      lcd.setCursor(0,1);
     lcd.print("Falscher Wert");
      
  
 }
     
 }

                
void resetnumbers() {  // Zahlen für den nächsten Eintrag zurücksetzen

  Zahl1=99;
  Zahl2=99;
  Zahl3=99;
}

Das brauchst Du eine Erkennung der "Nullposition" (Hallschaltkreis, Lichtschranke, Kontakt, ...) und musst zu Anfang in die Richtung fahren, bis die (Endschalter-)Position erkannt ist. Das ist dann Deine Bezugsposition.

Gruß Tommy

Es ist nicht möglich zu denken daß der Schrittmotor nicht durch irgendein Ereignis in einer x-beliebigen Position stehen bleibt. Du kannst nicht davon ausgehen daß der Motor beim Einschalten /Reset in einer bestimmten definierten Position ist. Du mußt beim Einschalten eine gewisse Nullposition anfahren und die Schrittzahlrechnung von dort aus machen.
Die Nullposition kann durch einen schaltet/sensor erkannt werden oder wenn der motor nicht zu stark ist durch anfahren eines mechanischen Stops.

Grüße Uwe

Hi

Wenn Du die Schaltung nur gezielt ausschaltest, könnte man den Motor zuvor auf diese Null-Position fahren.
Bei Spannungswiederkehr werden erst die Ausgänge wieder so geschaltet, wie 'Position 0' Das erwartet - also wenn der Treiber frei gegeben wird, werden die Spulen des Stepper so bestromt, daß Er in genau dieser Stellung bleibt und eben nicht nach links/recht weg springt.
Nachteil: Wenn der Stepper nicht auf Null eingeschaltet wird, springt Er trotzdem und man muß von Hand 'Nullen'.
Also auf Null verfahren und dann dem Arduino sagen, daß JETZT Null ist.

Deutlich user-freundlicher wird's mit einem Ref-Schalter, Der beim Start 'angefahren' wird und in Gegenrichtung wieder verlassen wird.
Sobald der Ref-Schalter wieder aus geht, macht man noch 1/2 Schritte und definiert dort Seinen Null-Punkt.

MfG