Probleme bei meinem Schrittmotor zu reagieren auf meine Schaltfläche sensor im Arduino-sketch
Ich bin mit der AccelStepper
Bibliothek kann meinen Schrittmotor, und ich habe Schwierigkeiten, herauszufinden, wie man meinen motor zu stoppen, wenn my button gedrückt wird.
Bekomme ich den motor zu stoppen, sobald es schließt seine gesamte Bewegung von der moveTo
Befehl, aber ich kann nicht ankommen es zu beenden, bevor es endet. Ich habe versucht, mit einer if-Anweisung geschachtelt innerhalb der while-Schleife verwende ich um den motor zu laufen, aber keine Würfel.
Der code, wie es steht, ist wie folgt:
#include <AccelStepper.h>
const int buttonPin=4; //number of the pushbutton pin
int buttonState=0;
int motorSpeed = 9600; //maximum steps per second (about 3rps /at 16 microsteps)
int motorAccel = 80000; //steps/second/second to accelerate
int motorDirPin = 8; //digital pin 8
int motorStepPin = 9; //digital pin 9
int state = 0;
int currentPosition=0;
//set up the accelStepper intance
//the "1" tells it we are using a driver
AccelStepper stepper(1, motorStepPin, motorDirPin);
void setup(){
pinMode(buttonPin,INPUT);
stepper.setMaxSpeed(motorSpeed);
stepper.setSpeed(motorSpeed);
stepper.setAcceleration(motorAccel);
stepper.moveTo(-12000); //move 2000 steps (gets close to the top)
}
void loop(){
while( stepper.currentPosition()!=-10000)
stepper.run();
//move to next state
buttonState = digitalRead(buttonPin);
currentPosition=stepper.currentPosition();
//check if the pushbutton is pressed.
//if it is, the buttonState is HIGH:
//if stepper is at desired location
if (buttonState == HIGH ){//need to find a way to alter current move to command
stepper.stop();
stepper.runToPosition();
stepper.moveTo(12000);
}
if(stepper.distanceToGo() == 0)
state=1;
if(state==1){
stepper.stop();
stepper.runToPosition();
stepper.moveTo(12000);
}
//these must be called as often as possible to ensure smooth operation
//any delay will cause jerky motion
stepper.run();
}
InformationsquelleAutor MikePinnell | 2013-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich drei Probleme in deinem code:
wenn Sie den Knopf drücken, dessen Zustand gesetzt werden
HIGH
die ganze Zeit Sie drücken, und es können mehrere Schleifen. Sollten Sie besser mit einem state-variable, Trigger, was Sie tun möchten, auf den button drücken, nur einmal.suchen Sie in der Dokumentation, die Sie verwenden
stepper.runToPosition()
, die Blöcke, bis Sie erreicht das Ziel. So dass die mehr Sie klicken, desto mehr könnte es gesperrt werden. Sollten Sie besser nur diestepper.moveTo()
undstepper.run()
Methode, die es ermöglicht, verwenden Sie ein paar Zyklen für Interaktionen.am Anfang deiner Schleife, einen code-block bis
stepper.currentPosition
bekommt-10000
. Damit Sie sicher sind blockiert, bis er dort ankommt, entfernen Sie alle Reaktivität auf jedenloop()
iteration.können Sie besser arbeiten Sie
loop()
Funktion wie folgt:uhuh... ich sah Ihren Kommentar und habe vergessen zu posten, eine Antwort, sorry :-s Die
while loop()
war ein Tippfehler, habe ich korrigiert.InformationsquelleAutor zmo
Ich weiß nicht, ob Sie gedacht haben es schon raus, aber ich stolperte über diesen thread und bemerkt etwas, das möglicherweise oder möglicherweise nicht Ihr problem lösen. Ich arbeite mit accelstepper auch im moment.
Ich habe das Gefühl, dass obwohl Sie .stop, um den motor, du bist immer noch die Zuweisung einer neuen destination (stepper.moveTo(12000)), nach der du noch laufen die stepper.die run () - Befehl an der Unterseite, wodurch der Schrittmotor 'run in Richtung 12000 Schritte". Vielleicht versuchen?
Ich weiß nicht, ob es funktionieren wird, aber auf diese Weise, wenn die Taste gedrückt wird, wird der button_state variable soll verhindern, dass der Schrittmotor ausgeführt, wenn es auf 1.
Hoffe, das hilft,
Nur eine Weitergabe von Schüler -
InformationsquelleAutor CKYong