Schrittmotor einfach drehen- Arduino?
Seid gegrüßt,
Ich möchte über einen PS2 Controller einfach einen Schrittmotor ansteuern, also sprich ich drücke eine Taste und er dreht solange in diese Richtung, wie die Taste gehalten wird. Nur mit zwei Tasten, für 2 Richtungen, vor und zurück.
Eigentlich Frage: Wie code ich das am Besten?
Also etwa so (mal so erklärend):
if(ps2x.ButtonPressed(PSB_L1)) {
for (drehe dich vorwärts)
solange vorwärts drehen, wie die Taste gehalten wird
}
if(ps2x.ButtonPressed(PSB_R1)) {
for (drehe dich rückwarts)
solange rückwarts drehen, wie Taste gedrückt wird
}
Soweit, so gut. Danke für alle Antworten!
MFG Alex
Hier mein aktueller Code dafür: (ganz unten ist der Part, wo später das mit dem Motor hin soll....)
#include <PS2X_lib.h>
PS2X ps2x;
//right now, the library does NOT support hot-pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;
int magenta=2;
int gruen=3;
int blau=4;
int rot=5;
// Stepper Bibliothek hinzufügen
#include <Stepper.h>
// Anzahl der Schritte pro interner Motorumdrehung
const float STEPS_PER_REV = 32;
// Betrag der Untersetzung
const float GEAR_RED = 64;
// Anzahl der Schritte pro Getriebeausgangrotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
// Number of Steps Required
int StepsRequired;
// PIN BELEGUNG
// Benutze PINs 8,9,10,11 des Arduinos
// und verbinde diese mit ULN2003 Motor Driver In1, In2, In3, In4
// Pins, die in der Sequenz 1-3-2-4 für die richtige Schrittsequenzierung eingegeben wurden
Stepper steppermotor(STEPS_PER_REV, 7, 6, 5, 4);
void setup(){
Serial.begin(9600);
error = ps2x.config_gamepad(13,11,10,12, true, true); //GamePad(clock, command, attention, data, Pressures?, Rumble?)
if(error == 0){
Serial.println("Found Controller, configured successful");
Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
type=1;
error=0;
pinMode(2,OUTPUT);
pinMode(3, OUTPUT); //gruen
pinMode(4, OUTPUT); //blau
pinMode(5, OUTPUT); //rot
}
void loop(){
/
error=0;
type=1;
if(error == 1)
return;
if(type == 2){
ps2x.read_gamepad(); //read controller
}
else {
ps2x.read_gamepad(false, vibrate); //Ab hier beginnt der eigentliche loop, davor nur weil es auch type 2- Controller gibt, hier für den richtigen
if(ps2x.ButtonPressed(PSB_L1){
--->Hier Motor...
}
delay(50);
}
}
1 Antwort
Oh man... Packe bitte den Code immer in die Quellcode-Box... Das ist übersichtlicher (Hab das mal bearbeitet und zur Änderung eingeschickt)...
Du brauchst ja eig nur abfragen, ob der Taster gedrückt ist, und den Code ausführen, damit der Motor sich weiter dreht. Du brauchst keine For-Schleife...
If(Buttonpressed=true){
Schrittmotor 10 Schritte weiter drehen
}
Sobald der Taster nicht mehr gedrückt wird, wird auch der Motor nicht mehr 10 Schritte weiter gedreht... Ohne Delay ect, sollte theoretisch so passen... Hab allerdings noch nie nen Schrittmotor angesteuert... Ist nur aus der Überlegung heraus...
So lange die If(gedrückt) erfüllt ist, solange wird der Code dahinter ausgeführt. Wenn der Code nur heißt, drehe 10 Schritte, wird in jedem Zyklus 10 Schritte weiter gedreht. Ist der Taster nicht mehr gedrückt, werden auch die 10 Schritte nicht mehr ausgeführt. Da der Controller pro ms einige Zyklen schafft, wird der Code also ununterbrochen ausgeführt. Also dreht der Motor solange, wie der Taster gedrückt wird.
Quellcode kannst Du im Texteingabefeld aktivieren. Du hast beim schreiben dieses Tt im Kasten rechts. Da gibt es div Funktionen wie Fett schreibe, Schräg gstellt, Zitieren, Unterstrichen ect... Und eben auch Quelltext </> ist das Symbol für die Quelltextbox...
Sollte es tatsächlich so sein, das die PS2X-Bibliothek den Buttonpressed nur einmal auswertet und kurz als Impuls setzt, würde ich eine Variable mit Buttonpressed auf "true" setzen und mit Buttonreleased auf "false" setzen und diese Variable in der If abfragen, die den Motor weiter dreht... Das ist dann vom Veralten der PS2X-Bibliothek abhängig. Wobei ich mir das fast nicht vorstellen kann, das der Controller so verarbeitet wird, das man sich die Statusänderungen immer speichern muss...
Nochmal ich... Wenn ich das Beispiel richtig verstehe, das bei der Bibliothek bei ist, dann ist die Abfrage "ps2x.Button" solange wahr, so lange die Taste gedrückt ist, die Abfrage "ps2x.ButtonPressed" nur beim drücken einmal, und die Abfrage "ps2x.ButtonReleased" nur beim los lassen einmal... Du kannst entsprechend dann auf "ps2x.Button" prüfen, so lange also die Taste gedrückt ist, wird das folgende immer wieder ausgeführt...
Es gibt noch "ps2x.ButtenNewState" was sowohl beim drücken, wie auch beim loslassen einmal ein HIGH raus gibt.. Also Statusänderungen in jede Richtung als Impuls erfasst...
Danke, dir. Ich werde das mal ausprobieren... Falls es nicht fkt., kann es sein das ich erst in den nächsten Tagen antworte, dann wäre es cool, wenn du dir dann nochmal Zeit nehmen könntest. :D
Ok, habe jetzt einiges ausprobiert, bin zum Entschluss gekommen, dass es am coolsten ist, wenn ich, das über die Analog Sticks mache. Problem: Habe absolut keine Ahnung, wie man die programmiert und damit die SG90 Servos steuert. Ich will halt letzten Endes meinen Analog Stick nach links bewegen und der Servo dreht sich solange in die Richtung bis ich loslassen, dann soll er stehen bleiben. Hast du eine Ahnung, wie man das machen kann? Also ist egal, welcher Stick am Controller, ob linker oder Rechter, nur ein kleine Idee (loop- Teil mit if oder for Bedingung??? ) wäre nett. Bis dann! 🖖 Danke an dich, falls du antwortest, scheinst ja viel Ahnung zu haben.
Also kein Schrittmotoe mehr, sondern jetzt ein Servo.
Ui, soll der Stick also auch analog eingelesen werden, so das sich der Servo verschieden schnell dreht? Oder nur eine Geschwindigkeit, egal wie weit der Stick in die Richtung gedrückt wird? Und der Servo soll in der Position bleiben, wenn Du wieder los lässt, wo er gerade ist, also nicht automatsich wieder mit dem Stick in Nullstellung gehen...
Wäre immer noch eine If... Ohne Geschwindigkeitsabhängigkeit den Stick einlesen, ob er nach rechts oder links gedrückt wurde.
Der Servo wird mir der Servolibrary in Winkel angesprichen. Also 0-180, 90 ist Mittelstellung...
Du musst also nur über eine If, den Winkel hoch/runter zählen...
If(Sticklinks && Winkel >= 0){
Winkel=Winkel-1;
Delay 20;
}
If(Stickrechts && Winkel <= 180){
Winkel=Winkel+1;
Delay 20,
}
servo(Winkel)
Entsprechend dann die richtigen Abfragen, variablen ect einsetzen...
servo ist dann der Befehl, den Servo anzusteuern, und die If sind verknüpft mit den Endanschlägen, damit nicht ins negative oder über 180 raus gezählt wird... 20ms Verzögerung, um eine gewisse Zeit reinzubekommen, dmait der nicht direkt auf 180 oder 0 zählt... So ein Arduino ist schnell in der Abarbeitung... :)
Ok, habe ich verstanden, möchte nur, dass ich den Stick z. B. nach links bewege, der Servo sich dreht und dann dort bleibt. (Ich steuere damit /will damit später einen Roboterarm steuern.). Gilt hoffentlich wieder gleiches, ich probiere mal alles und du könntest mir dann später auf Probleme antworten. Hat mir bisher sehr weitergeholfen, aber noch nicht bis zu dem Punkt, wo ich hinwill. Danke, hoffe auf weitere Antworten. :D
Dankeschön für deine Mühe, soweit hilfreich, aber ich will ja sagen, er soll sich solange drehen, wie ich gedrückt halte und nicht nur um bestimmte Schritte.
Außerdem wenn man das so schreibt, heißt es drehe dich um 10 Schritte, wenn der Knopf gedrückt ist, also dreht er sich weiter bis halt die 10 Schritte durch sind, auch wenn nur einmal gedrückt wurde, oder nicht?
:D Bitte darauf antworten.