Hallo,
ich hoffe Ihr könnt mir helfen. Ich versuche einen Schrittmotor mit Hilfe eines Endschalters zu stoppen, leider funktioniert das nicht!
Hier mal mein Quelltext sieht jemand meinen Fehler oder hat einen anderen vorschlag!
#include <AH_Pololu.h> //Library Schrittmotor
//AH_Pololu(int DIR, int STEP, int MS1, int MS2, int MS3, int SLEEP, int ENABLE, int RESET);
AH_Pololu stepper(200,2,3,4,5,6,7,8,9); //Schrittmotor Board Anschlußbelegung
void setup(){
pinMode(10, INPUT); //Digital Pin 10 als Eingang
int endschalter_links = digitalRead(10); //Initialisierung vom Endschalter auf Pin 10
stepper.enableDriver(); //Schrittmotortreiber wird eingeschaltet
stepper.setSpeedRPM(200); //Schrittmotor auf 200 Umdrehungen pro Minute
stepper.sleepOFF(); //Schrittmotortreiber Schlafmodus aus
stepper.move(5000,FORWARD); //Schrittmotor 5000 Schritte Forwärts
if (endschalter_links = HIGH){ //Wenn der Endschalter betätigt wird:
stepper.sleepON(); //Schaltet der Schrittmotortreiber in den Schlafmodus und
stepper.disableDriver(); //der Schrittmotortreiber wird aus geschaltet!
}
}
void loop(){
}
Also ist wirklich ein ziemlich grundlegendes Problem, das du auch wirklich für die weitere Programmierung verstanden haben solltest.
Les dir die beiden Artikel mal durch, sind ja nicht so lang und dann überleg dir, was macht dein Code überhaupt, wann und wie oft.
Sollte es dann immer noch nicht klar sein, kannst du dich gerne melden.
Nachdem Du den Vorschlag von nussecke befolgt hast:
Hauptproblem. Du liest genau 1 mal den Endschalter am Anfang des Sketches ein. Da kann er den Motor nicht während der Bewegung stoppen.
Ich weiß nicht ob das auslesen des Endschalters während der Bewegung funktioniert. um das zu sagen brauch ich mal die Bibliothek. Kannst Du mit den Link dazu geben?
Also die Library feiert gemütlich erstmal die Anzahl der angegeben Steps ab, ohne dass man was gegen machen kann. -> Bleibt nur, wenn du keine andere Lib findest: kleinere Schrittweiten wählen
Programmstruktur könnte dann so aussehen:
-> Setup
-alles initialisieren
-> Loop
-Kleinen Schritt nach vorne
-schauen, ob der Taster anschlägt, wenn ja Motor aus
und dann beginnt der loop ja wieder von vorne und dein Motor läuft so lang bis er stop sagt
.... und wie sieht er nun aus ?
Ich muss ehrlich gesagt ein wenig mit dem Kopf schütteln, wenn ich sehe, was die bei Pololu für Queltexte rausgeben ....
Edit:
Was für eine Steuer-Karte hast du denn da vor dem Motor ?
#include <AH_Pololu.h> //Library Schrittmotor
//AH_Pololu(int DIR, int STEP, int MS1, int MS2, int MS3, int SLEEP, int ENABLE, int RESET);
AH_Pololu stepper(200,2,3,4,5,6,7,8,9); //Schrittmotor Board Anschlußbelegung
const int buttonPin=10;
int drive = 1;
void setup(){
pinMode(buttonPin, INPUT);
stepper.enableDriver();
stepper.setSpeedRPM(180);
stepper.sleepOFF();
}
void loop(){
if (drive == 1)
{
stepper.move(1,FORWARD);
}
if (digitalRead(buttonPin) == HIGH){
drive = 0;
}
}
Das ist jetzt halt blind ins Blaue geschossen. Du musst uns schonmal angeben, was der Fehler ist, fährt der Motor generell nicht oder dreht er gemütlich weiter durch?
Wenn das jetzt nicht funktioniert, wärs langsam mal hilfreich, wenn du uns deine Verschaltung mal online stellst. Alternativ kannst du ja auch selbst mal mit SERIAL testen, ob der Schalter überhaupt anschlägt.
Wie auch immer es wäre hilfreich zu wissen, wie genau der Fehler aussieht.
TERWI:
Mach doch mal aus
stepper.move(1,FORWARD);
ein
stepper.move(100000,FORWARD);
Wahrscheinlich merkst du gar nicht, das sich der Motor 1,8° gedreht hat ?!
Der stepper dreht sich 1,8° mit jedem Loop durchlauf, eigentlich dürfte schon recht schnell sein, weil ich schätze mal, dass ein Durchlauf nicht länger als 1ms dauert.
Also das Einzige was passiert ist das der Motor fröhlich seine Runden dreht und dreht und...
Sobald ich den Knopf drücke dreht er einfach weiter. Natürlich habe ich den Schalter schon per Serial ausgelesen und beim drücken
springt der Wert auf 1 so wie es sein soll! Sorry wenn ich mich nicht sofort so ausgedrückt habe aber Ihr kennt das sicher selber, wenn man selber drin steckt...!
@nussecke: Da hast du logo recht - je ein Step pro Loop sollte man auch so sehen ....
Ich vermute falsche Anschlussbelegung.
In der Initialisierung steht:
//AH_Pololu(int DIR, int STEP, int MS1, int MS2, int MS3, int SLEEP, int ENABLE, int RESET);
AH_Pololu stepper(200,2,3,4,5,6,7,8,9); //Schrittmotor Board Anschlußbelegung
Demzufolge:
200 Schritte pro Umdreheung
Richtung von Pin 2 an 'DIR'
Step von Pin 3 an 'STEP'
Einstellung Teil-Schritte von Pins 4, 5 und 6 an 'MSI1-3'
Generell muss da auch Delay von mehreren Millisekunden zwischen die Schritte. Du kannst den Motor nicht alle paar Mikrosekunden einen Schritt machen lassen. Oder wird das durch setSpeed u.ä. Funktionen automatisch geregelt?
Hallo, also hab nochmal alle Kabel abgesteckt und wieder angeschlossen und siehe da jetzt geht es! XD
Danke erstmal für Eure nette Hilfe! Da diese Sache soweit ganz gut läuft würde ich gerne ne Klasse anlegen die Systemstart heißt in welche genau diese Methoden sollen, hab jetzt 2 Methoden erstellt "nullstellung_ein" und "nullstellung_aus" aber wie bekomme ich die jetzt in eine extra klasse?
#include <AH_Pololu.h> //Library Schrittmotor
//AH_Pololu(int DIR, int STEP, int MS1, int MS2, int MS3, int SLEEP, int ENABLE, int RESET);
AH_Pololu stepper(200,2,3,4,5,6,7,8,9); //Schrittmotor Board Anschlußbelegung
const int buttonPin=10;
void setup(){
pinMode(buttonPin, INPUT); //Digital Pin 10 als Eingang
nullstellung_ein();
}
void loop(){
nullstellung_aus();
}
void nullstellung_ein(){
stepper.enableDriver();
stepper.setSpeedRPM(190);
}
void nullstellung_aus(){
stepper.move(1,FORWARD);
if (digitalRead(buttonPin) == HIGH){
stepper.disableDriver();
}
}