Hallo zusammen,
seit 3 Tagen hänge ich an dem Programm:
Nach dem Einschalten wird die Position auf Null gesetzt. Funzt.
beim Tastendruck soll der Motor auf Position (hier: oben) drehen, beim zweiten Tastendruck wieder zurück.
Eigentlich nichts schweres.
Stand:
homing funktioniert; kein Problem.
drücke ich jetzt den Taster dreht der Motor zur Position, aber 2 mal. und das ist das Problem.
ich finde nicht den Fehler.
weiß jemand Rat?
#include <AccelStepper.h>
#include <Bounce2.h>
AccelStepper Xaxis(1, 5, 2); // pin 5 = step, pin 2 = direction
Bounce entpreller = Bounce();
int drehzahl = 800;
int oben = 400; //umdrehungen des motors bis Position
const byte enablePin = 8;
const int stepsPerRevolution = 3200;
long initial_homing = -1; // Used to Home Stepper at startup
boolean iststatus; //Statusabfrage
#define home_switch 12 //hometaster pion 12
#define starttaster 10 //Taster für Drehbewegung
//////////////////////////////////////////////////////////
void setup()
{
pinMode(enablePin, OUTPUT);
pinMode(home_switch, INPUT_PULLUP);
pinMode(starttaster, INPUT_PULLUP);
digitalWrite(enablePin, LOW); //mit HGIH wird ausgeschaltet
iststatus = 1; // wird für if Bedingung benötigt
// ab hier homing, funktioniert
entpreller.attach(home_switch);
entpreller.interval(5);
delay(10); //wait to wakeup
Xaxis.setMaxSpeed(50);
Xaxis.setAcceleration(50);
while (digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is activated
Xaxis.moveTo(initial_homing); // Set the position to move to
Xaxis.run(); // Start moving the stepper
initial_homing--; // Decrease by 1 for next move if needed
delay(5);
}
Xaxis.setCurrentPosition(0);
Xaxis.setMaxSpeed(100);
Xaxis.setAcceleration(100);
initial_homing = 1;
while (!digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is activated
Xaxis.moveTo(initial_homing); // Set the position to move to
Xaxis.run(); // Start moving the stepper
initial_homing++; // Decrease by 1 for next move if needed
delay(5);
}
Xaxis.setCurrentPosition(0);
Xaxis.setMaxSpeed(600);
Xaxis.setAcceleration(600);
entpreller.attach(starttaster);
entpreller.interval(5);
}
// bis hier ist alles wie es soll
// in Loop: nach dem Drücken des Tasters dreht der Motor hin und her, genau 2 mal
void loop()
{
entpreller.update();
int wert = entpreller.read();
// wenn Taster gedrückt und iststatus 1 und nicht oben soll bis oben fahren
if (wert == LOW && iststatus == 1 && Xaxis.currentPosition() != oben)
{
while (Xaxis.currentPosition() != oben) {
Xaxis.setSpeed(drehzahl);
Xaxis.runSpeed();
}
iststatus = 0; //status wird auf 0 gesetzt
delay(5);
}
if (wert == LOW && iststatus == 0 && Xaxis.currentPosition() == oben)
{
while (Xaxis.currentPosition() != 0) {
Xaxis.setSpeed(-drehzahl);
Xaxis.runSpeed();
}
iststatus = 1;
}
}
Wer ist homing und welche der Positionen wäre Das?
Erkläre den Ablauf bitte mit den Worten, Die Du auch bei der Fehlerbeschreibung verwendest.
Uns ist nicht Alles klar, was Du Dir die letzten 3 Tage überlegt hast - für uns ist das Problem komplett neu.
homing:
nach dem Einschalten dreht der Schrittmotor zurück bis zum Endtaster "home_switch", pin 12, und setzt dann die Position auf 0. Das funktioniert ohne Probleme.
Wunsch:
2. Drücke ich jetzt den starttaster, pin10, soll der Motor von Pos. 0 bis "oben" drehen und stehen bleiben.
3. Drücke ich den Taster wieder, soll der Motor von "oben" zurück zu 0 drehen.
IST:
Motor dreht bis oben aber dann wieder zurückc auf 0, das ganze zwei mal.
lasse ich die zweite if Bedingung weg, dreht der Motor bis oben und bleibt stehen.
Bitte nicht falsch verstehen, aber in den letzten Tagen tauchen hier immer wieder Programme zur Schrittmotorsteuerung auf, die eine Bewegung innerhalb einer while-Schleife bewerkstelligen wollen.
"Ich habe das doch aus einem Beispiel!" dann finde ich das Beispiel schlecht!
Ich finde diesen Ansatz schlecht und möchte ihn nicht unterstützen!
Bitte verwende loop als die Schleife, verbunden mit einer Schrittkette.
Eine Hilfe könnten die Stepper-Beispiele Stepper_02 und Stepper_Slider der MobaTools sein.
folgend, nur zur Info, der gleiche Code jedoch umgemodelt auf eine IR-Fernbedienung. Auch mit der while-Schleife.
Mit der IR-Fernbedienung funktioniert das ohne Probleme, mit den Tastern will es nicht.
Hauptsache mit dem Projekt geht es weiter.
Danke für den Tipp mit der MobaTools Bibliothek, werde die mir mal bei Gelegenheit anschauen.
Gruß aus Gießen
Code:
#include <AccelStepper.h>
#include <Bounce2.h>
#include <IRremote.h>
AccelStepper Xaxis(1, 5, 2); // pin 5 = step, pin 2 = direction
Bounce entpreller = Bounce();
int drehzahl = 800;
int oben = 400; //umdrehungen des motors bis Position
const byte enablePin = 8;
const int stepsPerRevolution = 200;
long initial_homing = -1; // Used to Home Stepper at startup
decode_results results; // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.
#define home_switch 12 //hometaster pion 12
int RECV_PIN = 11; // Infrarotsensor die Daten ausgibt
IRrecv irrecv(RECV_PIN);
//////////////////////////////////////////////////////////
void setup()
{
pinMode(enablePin, OUTPUT);
pinMode(home_switch, INPUT_PULLUP);
digitalWrite(enablePin, LOW); //mit HGIH wird ausgeschaltet
irrecv.enableIRIn(); //Dieser Befehl initialisiert den Infrarotempfänger.
/////////////////// ab hier homing, funktioniert
entpreller.attach(home_switch);
entpreller.interval(5);
delay(10); //wait to wakeup
Xaxis.setMaxSpeed(50);
Xaxis.setAcceleration(50);
while (digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is activated
Xaxis.moveTo(initial_homing); // Set the position to move to
Xaxis.run(); // Start moving the stepper
initial_homing--; // Decrease by 1 for next move if needed
delay(5);
}
Xaxis.setCurrentPosition(0);
Xaxis.setMaxSpeed(100);
Xaxis.setAcceleration(100);
while (!digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is activated
Xaxis.moveTo(initial_homing); // Set the position to move to
Xaxis.run(); // Start moving the stepper
initial_homing++; // Decrease by 1 for next move if needed
delay(5);
}
Xaxis.setCurrentPosition(0);
Xaxis.setMaxSpeed(600);
Xaxis.setAcceleration(600);
///////homig abgeschlossen, keine Probleme
}
void loop()
{
if (irrecv.decode(&results)) {
if (results.value == 16738455) //Wenn der Infrarotempfänger die Zahl
//„16738455“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung) fährt bis oben
{
while (Xaxis.currentPosition() != oben) {
Xaxis.setSpeed(drehzahl);
Xaxis.runSpeed();
}
delay(5);
}
if (results.value == 16750695 && Xaxis.currentPosition() == oben) //Wenn der Infrarotempfänger die Zahl
//„16750695“ ausgelesen hat (Entsprechend der Taste“2“ der Fernbedienung), fährt von oben nach 0
{
while (Xaxis.currentPosition() != 0) {
Xaxis.setSpeed(-drehzahl);
Xaxis.runSpeed();
}
delay(5);
}
irrecv.resume();
}
}