Arduino UNO / A4988 steppermotordriver/ Nema 17/ Pushbutton/ HILFEEEEE!!!

Hallo an alle :slight_smile:
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)

für jede hilfe bzgl der codierung bin ich dankbar

anbei mein aktuelles projekt.

teststeuerung.PNG

teststeuerung.PNG

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.

Gruß Tommy

"HILFEEEEE!!!" verjagt mich.

Grüße Uwe

hallo tommy, hoffe es klappt hiermit.. bin noch nicht so forum bewandert :confused:

#define RPMS 255.0
#define STEP_PIN 9
#define DIRECTION_PIN 8
#define GO_PIN 3

#define STEPS_PER_REV 200
#define MICROSTEPS_PER_STEP 8
#define MICROSECONDS_PER_MICROSTEP (1000000/(STEPS_PER_REV * MICROSTEPS_PER_STEP)/(RPMS / 350))

uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;

void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIRECTION_PIN, OUTPUT);
digitalWrite(STEP_PIN, LOW);
digitalWrite(DIRECTION_PIN, LOW);
pinMode(GO_PIN,INPUT);
}

void loop() {
if (digitalRead(GO_PIN) == LOW)
{
CurrentTime = micros();
if ((CurrentTime - LastStepTime) > MICROSECONDS_PER_MICROSTEP)
{
LastStepTime = CurrentTime;
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9)/2);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9)/2);
}
}
}

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

#define RPMS                255.0
#define STEP_PIN                9
#define DIRECTION_PIN           8
#define Button                  3

#define STEPS_PER_REV         200
#define MICROSTEPS_PER_STEP     8
#define MICROSECONDS_PER_MICROSTEP   (1000000/(STEPS_PER_REV * MICROSTEPS_PER_STEP)/(RPMS / 350))

uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;
int button, Speed_Level;
void setup() {               
 pinMode(STEP_PIN, OUTPUT);    
 pinMode(DIRECTION_PIN, OUTPUT);
 digitalWrite(STEP_PIN, LOW);
 digitalWrite(DIRECTION_PIN, LOW);
 pinMode(Button,INPUT);
}

void loop() {
 button = digitalRead (Button);

if (button == 1) {
Speed_Level++;
delay (300);
if (Speed_Level ==4) Speed_Level =0;
}

if (Speed_Level == 1) analogWrite (STEP_PIN, 150);
else if (Speed_Level == 2) analogWrite (STEP_PIN, 200);
else if (Speed_Level == 3) analogWrite (STEP_PIN, 255);
else analogWrite (STEP_PIN, 0);
}

Das mit den Codetags hat vorher aber besser funktioniert.

Gruß Tommy

neuer versuch Tommy....

#define RPMS                255.0
#define STEP_PIN                9
#define DIRECTION_PIN           8
#define Button                  3

#define STEPS_PER_REV         200
#define MICROSTEPS_PER_STEP     8
#define MICROSECONDS_PER_MICROSTEP   (1000000/(STEPS_PER_REV * MICROSTEPS_PER_STEP)/(RPMS / 350))

uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;
int button, Speed_Level;
void setup() {               
  pinMode(STEP_PIN, OUTPUT);    
  pinMode(DIRECTION_PIN, OUTPUT);
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(DIRECTION_PIN, LOW);
  pinMode(Button,INPUT);
}

void loop() {
  button = digitalRead (Button);

if (button == 1) {
Speed_Level++;
delay (300);
if (Speed_Level ==4) Speed_Level =0;
}

if (Speed_Level == 1) analogWrite (STEP_PIN, 150);
else if (Speed_Level == 2) analogWrite (STEP_PIN, 200);
else if (Speed_Level == 3) analogWrite (STEP_PIN, 255);
else analogWrite (STEP_PIN, 0);
}

hast du eine idee was ich ändern könnte?

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)

Bei jedem Wechsel weiterzählen 0 -> 1 -> 2 -> 3 -> 0 -> 1 usw.

(Vorübung Toggle: einmal drücken- Led an, nochmal drücken- Led aus)

Und dann musst du wissen, was die "maximal rpm" ist, bzw. je nach Stufe den passenden Wert in eine Variable schreiben.

Hallo Michael

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 :confused:

#define RPMS                255.0
#define STEP_PIN                9
#define DIRECTION_PIN           8
#define Button                  3

#define STEPS_PER_REV         200
#define MICROSTEPS_PER_STEP     8
#define MICROSECONDS_PER_MICROSTEP   (1000000/(STEPS_PER_REV * MICROSTEPS_PER_STEP)/(RPMS / 350))

uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;
int button, Speed_Level;
void setup() {               
  pinMode(STEP_PIN, OUTPUT);    
  pinMode(DIRECTION_PIN, OUTPUT);
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(DIRECTION_PIN, LOW);
  pinMode(Button,INPUT);
}

void loop() {
  button = digitalRead (Button);

if (button == 1) {
Speed_Level++;
delay (300);
if (Speed_Level ==4) Speed_Level =0;
}

if (Speed_Level == 1) analogWrite (STEP_PIN, HIGH);
else if (Speed_Level == 2) analogWrite (STEP_PIN, LOW);
else if (Speed_Level == 3) analogWrite (STEP_PIN, HIGH);
else analogWrite (STEP_PIN, 0);
}

der motor startet nun nach 3x knopfdrücken

Na ja, bei gedrücktem Knopf zählt er in 0.3s Schritten hoch. Auch gut.

int speed_Level;
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) {
     long steptime =  MICROSECONDS_PER_MICROSTEP / speed_Level; // 1 = 33% 2 = 66% 3 = 99%
     CurrentTime = micros();
     if ((CurrentTime - LastStepTime) > 2*steptime) {
         LastStepTime = CurrentTime;
         digitalWrite(STEP_PIN, HIGH);
         delayMicroseconds((steptime);
         digitalWrite(STEP_PIN, LOW);
         delayMicroseconds((steptime);
    }
  }
}

MICROSECONDS_PER_MICROSTEP muss natürlich so langsam sein, dass der Stepper es auch 3mal so schnell schafft.

Vielen Dank für deine Hilfe Michael :smiley:
Wie sollte der ganze code aussehem mit meinem Schaltchema? irgendwo ist immer noch der Wurm drin...

Wie sollte der ganze code aussehem...irgendwo ist immer noch der Wurm drin

:smiley:
"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 :wink:

Dein bisheriger Taster-Einlese-Ansatz blockiert und hält den Stepper an, während der Taster gedrückt ist.
Das kann gewollt sein...

vielen dank vorerst ich werde es morgen mal ausprobieren :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.