Servus, grüezi und Hallo Arduino Forum,
Vorab, dies ist mein erster Forum Beitrag überhaupt, also entschuldigt eventuelle Formfehler etc. (Natürlich habe ich mich auch in die "Forum Regeln" eingelesen aber vielleicht habe ich was vergessen)
Zum Projekt.
Ich bin gerade mit der Entwicklung einer Steuerung von 3 Schrittmotoren mittels 2 Joysticks beschäftigt (inkl. Endlagenschalter).
Folgende Teile verwende ich:
1x Elegoo Mega 2560
3x NEMA 17 Stepper. 2A
3x DRV8825 Driver
2x Joystick-Modul (Makerfactory)
6x Endlagenschalter
1x Step-Down Modul LM2596
1x Custom PCB
1x Schaltnetzteil 12V 3.4A
Was soll der Code können:
- Jeweils eine Achse der Joysticks soll einen Steppermotor steuern
- Die Endlagen der Motoren sollen abgesichert sein. (Ich habe 6 Taster verwendet, aber ich weiß mit Hilfe einer Library kann ich es auch 3 nutzen, aber dann muss ich Steps zählen etc. und da konnte ich mir nicht weiterhelfen)
- Es sollen über einen separaten Taster 3 Geschwindigkeitsstufen anzusteuern sein
- Mittels der Bedienung der Joysticks soll nur eine Geschwindigkeit zu verwenden sein
- Da die Motoren bei Mittelstellung der Joysticks trotzdem aktiv sind und "piepen" möchte ich bei X und Y Achse mir den Sleep Pin vom Treiber zum Nutzen machen. (Die Z Achse (Vertikal) soll natürlich nicht absacken, wenn der Joystick nicht bedient wird) Diesen muss man auf Low ziehen damit der Ausgang des Treiber zu ist. Ich habe mich mit dieser Aufgabe auseinander gesetzt und es mit einem if Statement ausprobiert, hatte damit aber leider keinen Erfolg. Leider reichen meine Skills auch nicht aus um diese Funktion hinzuzufügen. Somit hoffe ich dass ihr mir bei dem letzten Punkt weiterhelfen könnt.
Zum Testen und der Übersicht wegen habe ich das Projekt nur für einen Steppermotor aufgebaut. Der Rest ist ja quasi copy paste
Als schaltplan kann ich leider nur einen von Fritzing zeigen, obwohl dies ungern getan wird. Ich habe ihn trotzdem mal angehangen.
Ich ergänze dass ich den Strom für die Motoren auf 1.2A begrenzt habe.
Und das Microstepping habe ich auf 1/32 gestellt.
(Den Code habe ich von dem Youtuber Brainy Bits)
Projekt:
https://www.brainy-bits.com/post/arduino-nema-stepper-control-with-joystick-and-limit-switches
Info zum Treiber:
https://www.pololu.com/product/2133
Retinomax Kalibriervorrichtung final_Schaltplan.pdf (3.3 MB)
#define step_pin 3 // Pin 9 connected to Steps pin on EasyDriver
#define dir_pin 2 // Pin 8 connected to Direction pin
#define slp 5 // Pin 12 connected to SLEEP pin
#define X_pin A0 // Pin A0 connected to joystick x axis
#define button 4 // Pin 4 connected to joystick switch
#define Limit01 6 // Pin 2 connected to Limit switch out
#define Limit02 7 // Pin 3 connected to Limit switch out
int step_speed = 1; // Speed of Stepper motor (higher = slower)
void setup() {
Serial.begin(9600);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(slp, OUTPUT);
pinMode(Limit01, INPUT);
pinMode(Limit01, INPUT);
pinMode(button, INPUT);
digitalWrite(slp, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { // If Joystick switch is clicked
delay(500); // delay for deboucing
switch (step_speed) { // check current value of step_speed and change it
case 1:
step_speed = 250; // medium speed
break;
case 250:
step_speed = 500; // slow speed
break;
case 500:
step_speed = 1; // fast speed
break;
}
}
if (analogRead(X_pin) > 712) { // If joystick is moved Left
if (!digitalRead(Limit01)) {} // check if limit switch is activated
else { // if limit switch is not activated, move motor clockwise
digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delayMicroseconds(step_speed);
digitalWrite(step_pin, LOW);
delayMicroseconds(step_speed);
}
}
if (analogRead(X_pin) < 312) { // If joystick is moved right
if (!digitalRead(Limit02)) {} // check if limit switch is activated
else { // if limit switch is not activated, move motor counter clockwise
digitalWrite(dir_pin, HIGH); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delayMicroseconds(step_speed);
digitalWrite(step_pin, LOW);
delayMicroseconds(step_speed);
}
}
}