Nullpunkt anfahren

Hallo Experten

Aus dem Arduino Kochbuch habe ich folgenden Code vewendet, was für mein Vorhaben (Drehscheibe) sehr gut passt.

Ich verwende ein Arduino UNO und ein L298N zur Ansteuerung des Motor’s.

Jetzt meine Frage da es noch Neuland für mich ist.

Ich bin auf der Suche nach einen Code (schön wäre es mit Beschreibung des Codes zum nachvollziehen) den ich mit einbinden kann. Wenn ich einen Befehl (Null) über serial gebe, soll der Motor EINMALIG in Nullstellung fahren sodas ich ihn auch später überfahren kann. Gedacht habe ich an eine Lichtschranke (Endstop) vom 3D Drucker.

Ich Danke für Eure Unterstüzung
jede029

#include <Stepper.h>

    // Tragen Sie hier die Zahl der Schritte Ihres Motors ein

#define STEPS 200

    // Instanz der stepper-Klasse erzeugen. Wir geben die
    // Zahl der Motorschritte an und die Pins, mit denen
    // er verbunden ist.
    
Stepper stepper(STEPS, 2, 3, 4, 5);
int steps = 0;

void setup()
{
  
    // Geschwindigkeit des Motors auf 30 U/min setzen
    
stepper.setSpeed(1);
Serial.begin(9600);

}

void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
if(isDigit(ch)){ // Ist ch eine Ziffer?
steps = steps * 10 + ch - '0'; // Ja, Wert akkumulieren
}
else if(ch == '+'){
stepper.step(steps);
steps = 0;
}
else if(ch == '-'){
stepper.step(steps * -1);
steps = 0;
}
}
}

‘0’ ist vielleicht nicht so gut, da das Teil einer “normalen Eingabe” wie z.B. “100+” ist.

Aber es gibt ja ausser Ziffern, ‘+’ und ‘-’ noch reichlich andere Zeichen.

...
const byte pinEndStop=6;

void setup() {
   pinMode (pinEndStop, INPUT_PULLUP); // Endschalter sollte beim Anfahren öffnen, normal = GND
   Serial.begin(9600);
   ... 
}

void loop() {
 if (Serial.available() {
  char ch = Serial.read();
  if ( isDigit(ch) ) {
   ...
  }
   ...
  else if(ch == 'x'){
     if (sucheEndschalter() == false) Serial.println("Kein Endschalter gefunden");
     while (Serial.read() != -1 ) {} // zwischenzeitlichen Eingabepuffer leeren.
     steps = 0;
  } 
 }
}

bool sucheEndschalter() {
// Achtung blockierend, bis Endschalter gefunden ( HIGH )
//  
   int max = 1000;  // ... Schritte bis Endschaltersuche aufgegeben wird
   while ( digitalRead(pinEndStop) != HIGH ) {
      stepper.step(1);
      delay(10);
      if ( --max < 0 ) return false; // Fehler - Abbruch
   }
   return true;
}

Ich bedanke mich.. werde es mal in die Tat umsetzen wenn der endstop geliefert wurde und werde mich wieder melden.

Danke

Hollo

Nochmals danke an michael_x, es funktioniert super.

Da hab ich gleich nochmal eine Frage oder 2…

Wie kann mann den Code so ändern das ich ein Adafruit Motor Shield V1

mit microstep verwenden kann.

Danke…jede029

Der code

#include <Stepper.h>

    // Tragen Sie hier die Zahl der Schritte Ihres Motors ein

#define STEPS 200

    // Instanz der stepper-Klasse erzeugen. Wir geben die
    // Zahl der Motorschritte an und die Pins, mit denen
    // er verbunden ist.
   
Stepper stepper(STEPS, 2, 3, 4, 5);
int steps = 0;
const byte pinEndStop=6;

void setup(){
   pinMode (pinEndStop, INPUT_PULLUP); // Endschalter sollte beim Anfahren öffnen, normal = GND
    // Geschwindigkeit des Motors auf 30 U/min setzen
   
stepper.setSpeed(30); // Geschwindigkeit des Motors auf Wert U/min setzen
Serial.begin(9600);

}

void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
if(isDigit(ch)){ // Ist ch eine Ziffer?
steps = steps * 10 + ch - '0'; // Ja, Wert akkumulieren
}
else if(ch == '+'){
stepper.step(steps);
steps = 0;
}
else if(ch == '-'){
stepper.step(steps * -1);
steps = 0;
}
// s für Geschwindigkeit
else if(ch == 's'){
stepper.setSpeed(steps);
Serial.print("Setze Geschwindigkeit auf ");
Serial.println(steps);
steps = 0;
}
 else if(ch == 'x'){
     if (sucheEndschalter() == false) Serial.println("Kein Endschalter gefunden");
     if (sucheEndschalter() == true) Serial.println("Referenzfahrt abgeschlossen");
     while (Serial.read() != -1 ) {} // zwischenzeitlichen Eingabepuffer leeren.
     steps = 0;
 }
}
}
bool sucheEndschalter() {
// Achtung blockierend, bis Endschalter gefunden ( HIGH )
// 
   int max = 1000;  // ... Schritte bis Endschaltersuche aufgegeben wird
   while ( digitalRead(pinEndStop) != HIGH ) {
      stepper.step(1);
      delay(10);
      if ( --max < 0 ) return false; // Fehler - Abbruch
   }
   return true;
}

Ich hoffe, für die Frage fühlt sich jeder angesprochen.

Bin kein Experte für "Adafruit Motor Shield microsteps"

Generell ist Adafruit bekannt für guten Support und Beispielcode. Da solltest du was finden ;)

jede029: Wie kann mann den Code so ändern das ich ein Adafruit Motor Shield V1 mit microstep verwenden kann.

Adafruit-Motor-Shield-library/examples/StepperTest/StepperTest.pde

 Serial.println("Micrsostep steps");
motor.step(100, FORWARD, MICROSTEP);
motor.step(100, BACKWARD, MICROSTEP);

Wäre einen Versuch wert :)