Hallo an alle
vorweg, ich bin ARDUINO/ Programmieranfänger (ca seit einer Woche) also bitte ich um Rücksicht.
Ich versuche mit einem Arduino UNO+A4988 driver via Pushbutton den nema17 anzusteuern. So lange ich den Puschbutton betätige läuft der Motor ( siehe Anhang mit Zeichnung und Code)
Ziel ist es per Knopfdruck eine bestimmte drehzahl anzusteuern beispiel: 1x knopf druck 30% der maximal rpm, 2x knopfdruck 60% , 3x knopfdruck 100%, 4 mal 0% (aus)
Text, also Deinen Sketch, als Bild anzuhängen ist die ungünstigste Form, die Du wählen konntest.
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.
habe hier eine neue modifizierung vorgenommen... nun dreht sich der motor bei knopfdruck (leider nicht die gewünschte RPM und schaltet bei zweimal drücken aus...
geplant ist nach wie vor
1xpush = 30%
2xpush = 60%
3xpush = 100%
4xpush = aus
Um zu erkennen, dass ein Taster zum x-ten Mal gedrückt wurde, musst du den Wechsel zwischen gedrückt und losgelassen erkennen. (Achtung, Taster prellen)
der Taster reagiert auf die Druckschematic 1-4 mit an aus (der motor startet nun nach 3x knopfdrücken). ich weiss nur noch nicht wie ich die gewünschte rpm mit einbringe
Wie sollte der ganze code aussehem...irgendwo ist immer noch der Wurm drin
"Der Ganze Code" ist immer ein falscher Ansatz.
Versuch dich an der Funktion getTaster() oder wie immer du sie nennen willst.
Einfach mit Serial.println Testausgaben.
Dann teste die Stepper-Ansteuerung, entweder separat (Serial.read()) oder mit Hilfe der ausgetesteten Taster-Eingabe. Dann sollte das "irgendwo" zumindest klarer sein.
Der "withoutDelay" Ansatz ist übrigens überflüssig, wenn du dann doch delayMicroseconds machst.
const unsigned long MICROSECONDS_PER_NICROSTEP=500; // oder so
byte speed_Level; // 0 .. 3
void loop() {
get_Taster(); // setzt speed_Level 0 ... 3 ,oder lässt es wie es ist ( so wie du es jetzt machst )
if (speed_Level > 0) {
unsigned long steptime = MICROSECONDS_PER_MICROSTEP / speed_Level; // 1 => x/33% .. 3 => x/99%
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds((steptime);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds((steptime);
}
}
void get_Taster() {
// Zum Testen über Serial (Ohne Taster)
// verstellt speed_Level auf 0 .. 3 oder lässt es unverändert
int i = Serial.read();
// -1 wenn keine Eingabe
// '0' ... '3' wird ausgewertet
// alles andere ignoriert
if ('0' <= i && i <= '3') {
speed_Level = i - '0';
Serial.print("Speed Level = ");
Serial.println(speed_Level);
}
Jetzt ist es ja doch fast "ein ganzer Code" geworden
Dein bisheriger Taster-Einlese-Ansatz blockiert und hält den Stepper an, während der Taster gedrückt ist.
Das kann gewollt sein...