Hallo miteinander,
für eine Drehachse möchte ich den Nullpunkt ermitteln.
Das habe ich mir auf dem Blatt Papier überlegt und dann umgesetzt.
Natürlich erst mal ganz Primitiv so wie ich es schnell und einfach in meinem Kopf zusammen gebaut bekommen habe.
Das Klappt auch :-), doch leider ist das ein Code der Blockiert und das mag ich nicht !!, daher möchte ich den umschreiben in einen Code der nicht Blockierend ist.
den Ersten Ansatz habe ich auch geschafft, jetzt benötige ich einen Denkanstoß von euch.
Mein Drehachse ist so was: Drehachse mit Motor
Info: Der Nullpunkt ist immer am Anfang des Sensors Der Positiven Seite, die Drehachse hat keinen Endschalter !
Wie ermittle ich den 0 Punkt.
- Mache ein paar schritte ins Negative
- Prüfe ob Sensor Aktiviert ist
Wenn JA:
2.2 mache einen Schritt ins Positive
2.3 Prüfe ob Sensor Aktiviert ist
2.4 Springe zu 2.
Wenn Nein:
2.5 Setze Neuen Nullpunkt an Motorposition
Fertig
Das ist der Code dazu:
/*
* Testprogramm für einzelne Motoren
*/
#include <AccelStepper.h> // Installiren der AccelStepper LIB
// Motor Pins
int PUL = 2; // PIN für Tackt
int DIR = 3; // PIN für Drehrichtungsangabe HIGH = Im Uhrzeigersinn LOW = Gegen den Uhrzeigersinn
int ENA = 4; // PIN für Treiber ON/OFF HIGH = Motor OFF LOW = Motor ON
// Motorpins Typ zuweisen
AccelStepper Achse(1, PUL, DIR); // Motoren Installiren (1, PUL, DIR)
// Sensor Pin
int Sensor = 28; // Pin für Sensor
// Nullpunkt Marker
bool A_Null = false; // Wenn Nullpunkt gesetzt wurde = true sonst false
void setup() {
Serial.begin(250000); // Datenrate für die serielle Datenübertragung festlegen.
// Motor
pinMode(ENA, OUTPUT); // EAN auf Output setzen
Achse.setAcceleration(3000); // Beschleunigung
Achse.setMaxSpeed(1000); // RPM
digitalWrite(ENA, LOW); // Motor Aktiviren
Serial.println(F("OK, Motor Start")); // Ausgabe das Motor Startklar ist
// Sensor
pinMode(Sensor, INPUT); // Sensor auf Input setzen
} // void setup
void loop() {
while(!A_Null) { // Nullpunkt Prüfen
// Sensor suchen mit - (minus) schritten
while(!digitalRead(Sensor)) { // Sensor Prüfen
Achse.move(-100); // Sollposition relativ zur aktuellen Position einstellen
Achse.run(); // mache einen Schritt wenn diser fällig ist
} // !digitalRead(Sensor)
// Sensor anfang suchen mit + (plus) schreitten
while(digitalRead(Sensor)) { // Sensor Prüfen
Achse.move(1); // Sollposition relativ zur aktuellen Position einstellen
Achse.run(); // mache einen Schritt wenn diser fällig ist
} // digitalRead(Sensor)
// Position auf 0 Setzen
Achse.setCurrentPosition(0); // Motorposition auf 0 Setzen
A_Null = true; // Null wurde gefunden
} // !A_Null
} // void loop
Jetzt habe ich angefangen den CODE so zu schreiben das er nicht Blockiert:
Habe das auch bis auf den letzten Punkt hin bekommen.
Ich mache die Negativen Schritte, dann die Positiven, JETZT KOMMT DAS DENKPROBLEM
Wie kann ich dann den Nullpunkt setzen?
Mir ist nicht klar wie ich die Abfrage gestalten muss dafür.
Das ist mein Ansatz als CODE
/*
* Testprogramm für einzelne Motoren
*/
#include <AccelStepper.h> // Installiren der AccelStepper LIB
// Motor Pins
int PUL = 2; // PIN für Tackt
int DIR = 3; // PIN für Drehrichtungsangabe HIGH = Im Uhrzeigersinn LOW = Gegen den Uhrzeigersinn
int ENA = 4; // PIN für Treiber ON/OFF HIGH = Motor OFF LOW = Motor ON
// Motorpins Typ zuweisen
AccelStepper Achse(1, PUL, DIR); // Motoren Installiren (1, PUL, DIR)
// Sensor Pin
int Sensor = 28; // Pin für Sensor
// Nullpunkt Marker
bool Null = false; // Wenn Nullpunkt gesetzt wurde = true sonst false
bool A_Null = false; // Wenn Nullpunkt gesetzt wurde = true sonst false
void setup() {
Serial.begin(250000); // Datenrate für die serielle Datenübertragung festlegen.
// Motor
pinMode(ENA, OUTPUT); // EAN auf Output setzen
Achse.setAcceleration(3000); // Beschleunigung
Achse.setMaxSpeed(1000); // RPM
digitalWrite(ENA, LOW); // Motor Aktiviren
Serial.println(F("OK, Motor Start")); // Ausgabe das Motor Startklar ist
// Sensor
pinMode(Sensor, INPUT); // Sensor auf Input setzen
} // void setup
void loop() {
Achse.run(); // mache einen Schritt wenn diser fällig ist
if (!Null) { // Prüfen auf Nullpunkt
Nullpunkt(); // Nullpunkt setzen
}
} // void loop
void Nullpunkt() {
/*
* Nullpunkt ermitteln ohne das alles Blockiert wird
*/
// Sensor suchen mit - (minus) schritten
if ((!A_Null) && (!digitalRead(Sensor))) { // Achse Null nicht gefunden und Sensor in Aktiv
Achse.move(-100); // Sollposition relativ zur aktuellen Position einstellen
} // (!A_Null) && (!digitalRead(Sensor))
// Sensor anfang suchen mit + (plus) schreitten
if ((!A_Null) && (digitalRead(Sensor))) { // Achse Null nicht gefunden und Sensor ist Aktiv
Achse.move(1); // Sollposition relativ zur aktuellen Position einstellen
} // if
// Position auf 0 Setzen
/*
* Achse.setCurrentPosition(0); // Motorposition auf 0 Setzen
* A_Null = true; // Null wurde gefunden
* Null = true; // Null wurde gefunden
*/
} // void Nullpunkt()
Könntet Ihr mir einen Denkanstoß geben.
Gruß Mücke