Versuch eines HOMING Programms, das nach Programmstart einmalig ausgeführt werden soll bzw. nach Stromausfall, wenn z.B. der Schlitten einer Linearführung zwischen StartStop- und EndStop- Schalter stehen geblieben ist.
Ich habe meine Schritte und Gedanken dazu im Sketch kommentiert. Es funktioniert alles gut, bis auf das Verlassen der Routine.
Die Kommentare habe ich für mich ausführlich angegeben, da ich mich erst seit ein paar Tagen mit Arduino beschäftige. Werde in diesem Monat 78 Jahre alt und bin "zu jung" zum Nichtstun!
Zum Test gebe ich stellvertretend einen Text im "Hauptprogramm" aus.
Zum Verlassen der Schleife wollte ich "break" verwenden. "error: break statement not within loop or switch!!!"
In der Dokumentation habe ich gelesen, dass break dazu dient, aus einer loop harauszukommen. Das ist hier wohl nicht der Fall.
Meine Frage: Wie wird die erste Routine sauber beendet, dass sie während des Programmablaufes nicht wieder aufgerufen wird, sondern nur zu den Bedingungen, wie oben benannt, also zum Programmstart und nur einmal?
Momentan fährt der Schlitten zum Taster POS1, wenn gedrückt, um n Schritte in Richtung POS2, aber dann wieder zurück auf POS1. Das Spiel wiederholt sich in einer Endlosschleife.
Es gibt bestimmt eine einfache Lösung? Bitte um eure Hilfe, vielen Dank schon mal im Voraus.
Hier der Code:
// Versuch eines HOMING Programms, das nach Programmstart einmalig ausgeführt werden soll bzw. nach Stromausfall,
// wenn z.B. der Schlitten der Linearführung > StartStop- oder > EndStop- Schalter stehen geblieben ist: If home_erreicht
//Anschlüsse am TS 6600: PUL-, DIR- und ENA- an gemeinsame Masse
// Pinbelegung
const int DIR = 4; // für Links: DIR = HIGH
const int STEP = 5; // Entspricht "PUL" am TS 6600
const int ENA = 6;
const int STOP1 = 7; // Links ==> DIR = HIGH
const int STOP2 = 8; // Rechts
// Variablen definieren
int steps = 0;
int home = 0;
bool home_erreicht = false; // Wird auf true gesetzt, wenn Homing erfolgreich ausgeführt wurde und verhindert, dass die Schleife noch einmal durchlaufen wird
int n = 800; // Anzahl der Schritte hier anpassen je nach Stellung der Switches beim TS 6600
int pos = 0; // Hier setze ich die Position des Schlittens und addiere die Schritte bei Abfrage POS1
void setup() {
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(STOP1, INPUT_PULLUP);
pinMode(STOP2, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// Homing
digitalWrite(ENA, LOW); // Motor aktivieren
digitalWrite(DIR, LOW); // Richtung festlegen, abhängig von den Anschlüssen der Motorwicklung
while (digitalRead(STOP1) == HIGH) { // Bewegung in Richtung STOP1
digitalWrite(STEP, HIGH);
delayMicroseconds(300);
digitalWrite(STEP, LOW);
delayMicroseconds(300);
pos++; // Hier werden die Schritte bis zur POS1 aufaddiert
}
// Schlitten um n STEPs Zurückfahren, n muss noch ermittelt werden und ist abhängig von meinem Stepperdriver TS 6600 (Schalterstellung bzgl. Microsteps)
while (digitalRead(STOP1) == LOW) { // Der Schalter STOP1 ist aktiviert, ab jetzt Bewegung in RICHTUNG STOP2
// MISSGLÜCKTER VERSUCH
// *********************************************************************
/*digitalWrite(STEP, LOW);
delayMicroseconds(300);
delayMicroseconds(500);
digitalWrite(DIR, HIGH); // Richtung umkehren
digitalWrite(STEP, HIGH);
delayMicroseconds(500);
pos--;
if (pos <= -n) { // Maximale Anzahl an Schritten erreicht?*/
// ******************************************************************
digitalWrite(DIR, HIGH); // Richtung umkehren
for (int i = 0; i < n; i++) {
digitalWrite(STEP, HIGH);
delayMicroseconds(500);
digitalWrite(STEP, LOW);
delayMicroseconds(500);
// break;
}
digitalWrite(ENA, HIGH); // Motor deaktivieren
home_erreicht=true;
Serial.print(home_erreicht);
if (home_erreicht) {
Serial.print("Home erreicht");
} // break; error: break statement not within loop or switch!!!
Serial.print("Hier kommt der Code für das Hauptprogramm hin");
// ...
}
}