Arduino / Accelstepper Hilfe
-
Guten Abend miteinander ,
Ich bin neue hier im Forum und komme gleich mit einem Riesen Problem !!!Erst mal ich heiße Patrick bin Noch 29 und Schlossermeister von Beruf.
Ich habe mir eine Cocktailmaschine gebaut.
Der Controller ist ein Arduino die Motoren sind Nema 17!
Soweit so gut im groben und Ganzen funktioniert auch erst mal alles!
Ich arbeite mit der accelstepper lib.Nun hier mein Problem
Erst mal mache ich mit drei Achsen eine Referenzfahrt, eine nach der anderen! Das funktioniert auch soweit.
Nun will ich mit X und Y positionieren, dann mit Z aus der Flasche mein Getränk holen.
Und da beginnen auch schon die Fehler einmal fährt er zur Flasche A und holt sich dreimal ein Getränk, dann fährt er zur Flasche B Und holt kein Getränk sondern fährt sofort wieder zur A und holt sich einmal ein Getränk dann fährt er wieder zu Flasche E und holt sich dreimal ein Getränk!!!!!!Theoretisch ist aber programmiert das er zu Flasche A fahren soll Getränke abholen, Dann zur Flasche B und dort ein Getränk abholen!!!
Kann mir bei dieser Sache irgend jemand helfen bin am verzweifeln und komme einfach nicht mehr weiter!!!
Nun die große Überraschung ich habe am 12. Juli Geburtstag und wollte mich damit Selbst beschenken!!!
-
@patrick_sucko ```
... #include "AccelStepper.h"#define home_switchX 52
#define home_switchY 50
#define home_switchZ 48// AccelStepper Setup
AccelStepper stepperX(1,12,13); // 1 = Easy Driver interface
// UNO Pin 2 connected to STEP pin of Easy Driver
// UNO Pin 3 connected to DIR pin of Easy DriverAccelStepper stepperY (1,3,4);
AccelStepper stepperZ(1, 6, 7); // 1 = Easy Driver interface
// UNO Pin 5 connected to STEP pin of Easy Driver
// UNO Pin 6 connected to DIR pin of Easy Driver// Stepper Travel Variables
long TravelX; // Used to store the X value entered in the Serial Monitor
long TravelY;
long TravelZ; // Used to store the Z value entered in the Serial Monitorint move_finishedX=1;
int move_finishedY=1;
int move_finishedZ=1; // Used to check if move is completed
int move_finishedXY=1;
int move_finishedZZ=1;
int sicherheit=1;
int sicherheit2=2;long initial_homingX=-1;
long initial_homingY=-1;
long initial_homingZ=-1;//---------------------------------------
//void cola () {
// p2 ();
// CL1 ();
// p3 ();
// CL1 ();
// p4 ();
// CL1();//}
void p2 (void){
while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){
sicherheit=0;
move_finishedXY=0; // Set variable for checking move of the SteppersstepperX.moveTo(65); // Set new move position for X Stepper
stepperY.moveTo(570); // Set new move position for Z Stepper}
// Check if the Steppers have reached desired position
if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0))
{
stepperX.run(); // Move Stepper X into position
stepperY.run(); // Move Stepper Y into position
}// If move is completed display message on Serial Monitor
if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
move_finishedXY=1; // Reset move variable
move_finishedZ=3;
sicherheit=3;
delay(500);
}}
void p3 (void){
while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){
sicherheit=0;
move_finishedXY=0; // Set variable for checking move of the SteppersstepperX.moveTo(200); // Set new move position for X Stepper
stepperY.moveTo(400); // Set new move position for Z Stepper}
// Check if the Steppers have reached desired position
if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0))
{
stepperX.run(); // Move Stepper X into position
stepperY.run(); // Move Stepper Y into position
}// If move is completed display message on Serial Monitor
if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
move_finishedXY=1; // Reset move variable
move_finishedZ=3;
sicherheit=3;
delay(500);
}}
void p4 (void){
while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){
sicherheit=0;
move_finishedXY=0; // Set variable for checking move of the Steppers// Set Max Speed and Acceleration of each Steppers
stepperX.moveTo(3800); // Set new move position for X Stepper
stepperY.moveTo(3950); // Set new move position for Z Stepper
delay (1000);}
// Check if the Steppers have reached desired position
if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() !=0))
{
stepperX.run(); // Move Stepper X into position
stepperY.run(); // Move Stepper Z into position
}// If move is completed display message on Serial Monitor
if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) {
move_finishedXY=1; // Reset move variable
sicherheit=1;
move_finishedZ=3;
delay(500);
}
}//----------------------------------------------------
void CL1 (void){
while(( move_finishedZ == 3) && (sicherheit == 3)){
sicherheit=0;
move_finishedZ=0; // Set variable for checking move of the SteppersstepperZ.moveTo(7000); // Set new move position for X Stepper
delay(1000);
}if ((stepperZ.distanceToGo() != 0) )
{
stepperZ.run(); // Move Stepper X into position
}// If move is completed display message on Serial Monitor
if ((move_finishedZ == 0) && (stepperZ.distanceToGo() == 0) ) {
move_finishedZ=2; // Reset move variable
sicherheit=1;
delay(500);
}while(( move_finishedZ == 2 ) && (sicherheit ==1 )){
sicherheit=0;
move_finishedZ=10; // Set variable for checking move of the Steppers// Set Max Speed and Acceleration of each Steppers
stepperZ.moveTo(20); // Set new move position for X Stepper
}// Check if the Steppers have reached desired position
if ((stepperZ.distanceToGo() != 0) )
{
stepperZ.run(); // Move Stepper X into position
}// If move is completed display message on Serial Monitor
if ((move_finishedZ == 10) && (stepperZ.distanceToGo() == 0) ) {
move_finishedZ=1; // Reset move variable
sicherheit=1;
move_finishedXY=1;
sicherheit2=2;
delay(500);
}
}//---------------------------------------------------------------------
//void cola () {
// p2 ();
// CL1 ();
// p4 ();
// CL1();
//
//
//}void setup() {
Serial.begin(9600); // Start the Serial monitor with speed of 9600 Bauds
pinMode (home_switchX,INPUT_PULLUP); pinMode (home_switchY,INPUT_PULLUP); pinMode (home_switchZ,INPUT_PULLUP);
delay (5);
Serial.println("Homing . . . .");// Set Max Speed and Acceleration of each Steppers
stepperX.setMaxSpeed(900.0); // Set Max Speed of X axis
stepperX.setAcceleration(500.0); // Acceleration of X axisstepperY.setMaxSpeed(400.0); // Set Max Speed of X axis
stepperY.setAcceleration(500.0);stepperZ.setMaxSpeed(1600.0); // Set Max Speed of Z axis slower for rotation
stepperZ.setAcceleration(600.0); // Acceleration of Z axis//X auf Endschalter fahren while (!digitalRead(home_switchX)) { // Make the Stepper move CCW until the switch is activated stepperX.moveTo(initial_homingX); // Set the position to move to initial_homingX--; // Decrease by 1 for next move if needed stepperX.run(); // Start moving the stepper delay(4); } //Y auf Endschalter fahren while (!digitalRead(home_switchY)) { // Make the Stepper move CCW until the switch is activated stepperY.moveTo(initial_homingY); // Set the position to move to initial_homingY--; // Decrease by 1 for next move if needed stepperY.run(); // Start moving the stepper delay(4); } //Z auf Endschalter fahren while (!digitalRead(home_switchZ)) { // Make the Stepper move CCW until the switch is activated stepperZ.moveTo(initial_homingZ); // Set the position to move to initial_homingZ--; // Decrease by 1 for next move if needed stepperZ.run(); // Start moving the stepper delay(4); } //X vom endschalter runter und 0 setzen while (digitalRead(home_switchX)) { // Make the Stepper move CW until the switch is deactivated stepperX.moveTo(initial_homingX); stepperX.run(); initial_homingX++; delay(5); } stepperX.setCurrentPosition(0); //Y vom endschalter runter und 0 setzen while (digitalRead(home_switchY)) { // Make the Stepper move CW until the switch is deactivated stepperY.moveTo(initial_homingY); stepperY.run(); initial_homingY++; delay(5); } stepperY.setCurrentPosition(0); //Z vom endschalter runter und 0 setzen while (digitalRead(home_switchZ)) { // Make the Stepper move CW until the switch is deactivated stepperZ.moveTo(initial_homingZ); stepperZ.run(); initial_homingZ++; delay(5); } stepperZ.setCurrentPosition(0); Serial.println("Homing Completet"); // Set Max Speed and Acceleration of each Steppers
}
void loop()
{ p2();
CL1();
p4();
CL1();
}...
-
wenn mir jetzt noch jemand sagen kann wie ich Bilder einfüge, dann würde ich euch mal meine Arbeit zeigen
-
"Einfügen" garnicht. Lass einfach einen Link darauf da.
Würdest Du bitte Deinen Beitrag bearbeiten und
```
über und```
unter Deinen Code schreiben? Alternativ markiere Deinen Code und klicke auf</>
.
-
Fotos kannst du hier nicht einfügen, du kannst aber die Links zu einem externen Bildhoster posten (picload.org etc.).
Auch kannst du deinen ersten Post noch einmal editieren und Codetags verwenden (Code markieren und oben auf </> klicken.Ein cooles Projekt ist es aber auf jeden Fall.
Um zumindest noch etwas Sinnvolles zu schreiben:
move_finishedXY=1; move_finishedZ=3; sicherheit=3; delay(500);
Was genau die einzelnen Werte bedeuten, weiß man selber nicht mehr, wenn man sich den Code nach ein paar Monaten noch einmal anschaut (Leser, die diesen Code zum ersten Mal sehen, erst recht nicht). Besser ist es, gleich diese Konstanten sinnvoll zu benennen (per define, const int oder enum).
stepperX.moveTo(65); // Set new move position for X Stepper stepperY.moveTo(570); // Set new move position for Z Stepper
Wenn diese Werte gar von der Flaschenform (bspw.) abhängen, sollten sie gar nicht im Code vorkommen, sondern aus einer Datei eingelesen werden, sodass nicht jedes Mal kompiliert werden muss.
Das eigentlich Problem solltest du noch einmal genauer eingrenzen: Was erwartest du von einem bestimmten Stück des gezeigten Codes und was genau kommt dabei [fälschlicheweise] heraus.
-
#include "AccelStepper.h" #define home_switchX 52 #define home_switchY 50 #define home_switchZ 48 // AccelStepper Setup AccelStepper stepperX(1,12,13); // 1 = Easy Driver interface // UNO Pin 2 connected to STEP pin of Easy Driver // UNO Pin 3 connected to DIR pin of Easy Driver AccelStepper stepperY (1,3,4); AccelStepper stepperZ(1, 6, 7); // 1 = Easy Driver interface // UNO Pin 5 connected to STEP pin of Easy Driver // UNO Pin 6 connected to DIR pin of Easy Driver // Stepper Travel Variables long TravelX; // Used to store the X value entered in the Serial Monitor long TravelY; long TravelZ; // Used to store the Z value entered in the Serial Monitor int move_finishedX=1; int move_finishedY=1; int move_finishedZ=1; // Used to check if move is completed int move_finishedXY=1; int move_finishedZZ=1; int sicherheit=1; int sicherheit2=2; long initial_homingX=-1; long initial_homingY=-1; long initial_homingZ=-1; //--------------------------------------- //void cola () { // p2 (); // CL1 (); // p3 (); // CL1 (); // p4 (); // CL1(); //} void p2 (void){ while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){ sicherheit=0; move_finishedXY=0; // Set variable for checking move of the Steppers stepperX.moveTo(65); // Set new move position for X Stepper stepperY.moveTo(570); // Set new move position for Z Stepper } // Check if the Steppers have reached desired position if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0)) { stepperX.run(); // Move Stepper X into position stepperY.run(); // Move Stepper Y into position } // If move is completed display message on Serial Monitor if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) { move_finishedXY=1; // Reset move variable move_finishedZ=3; sicherheit=3; delay(500); } } void p3 (void){ while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2==2)){ sicherheit=0; move_finishedXY=0; // Set variable for checking move of the Steppers stepperX.moveTo(200); // Set new move position for X Stepper stepperY.moveTo(400); // Set new move position for Z Stepper } // Check if the Steppers have reached desired position if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() != 0)) { stepperX.run(); // Move Stepper X into position stepperY.run(); // Move Stepper Y into position } // If move is completed display message on Serial Monitor if ((move_finishedXY == 0) && (stepperX.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) { move_finishedXY=1; // Reset move variable move_finishedZ=3; sicherheit=3; delay(500); } } void p4 (void){ while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){ sicherheit=0; move_finishedXY=0; // Set variable for checking move of the Steppers // Set Max Speed and Acceleration of each Steppers stepperX.moveTo(3800); // Set new move position for X Stepper stepperY.moveTo(3950); // Set new move position for Z Stepper delay (1000); } // Check if the Steppers have reached desired position if ((stepperX.distanceToGo() != 0) || (stepperY.distanceToGo() !=0)) { stepperX.run(); // Move Stepper X into position stepperY.run(); // Move Stepper Z into position } // If move is completed display message on Serial Monitor if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) { move_finishedXY=1; // Reset move variable sicherheit=1; move_finishedZ=3; delay(500); } } //---------------------------------------------------- void CL1 (void){ while(( move_finishedZ == 3) && (sicherheit == 3)){ sicherheit=0; move_finishedZ=0; // Set variable for checking move of the Steppers stepperZ.moveTo(7000); // Set new move position for X Stepper delay(1000); } if ((stepperZ.distanceToGo() != 0) ) { stepperZ.run(); // Move Stepper X into position } // If move is completed display message on Serial Monitor if ((move_finishedZ == 0) && (stepperZ.distanceToGo() == 0) ) { move_finishedZ=2; // Reset move variable sicherheit=1; delay(500); } while(( move_finishedZ == 2 ) && (sicherheit ==1 )){ sicherheit=0; move_finishedZ=10; // Set variable for checking move of the Steppers // Set Max Speed and Acceleration of each Steppers stepperZ.moveTo(20); // Set new move position for X Stepper } // Check if the Steppers have reached desired position if ((stepperZ.distanceToGo() != 0) ) { stepperZ.run(); // Move Stepper X into position } // If move is completed display message on Serial Monitor if ((move_finishedZ == 10) && (stepperZ.distanceToGo() == 0) ) { move_finishedZ=1; // Reset move variable sicherheit=1; move_finishedXY=1; sicherheit2=2; delay(500); } } //--------------------------------------------------------------------- //void cola () { // p2 (); // CL1 (); // p4 (); // CL1(); // // //} void setup() { Serial.begin(9600); // Start the Serial monitor with speed of 9600 Bauds pinMode (home_switchX,INPUT_PULLUP); pinMode (home_switchY,INPUT_PULLUP); pinMode (home_switchZ,INPUT_PULLUP); delay (5); Serial.println("Homing . . . ."); // Set Max Speed and Acceleration of each Steppers stepperX.setMaxSpeed(900.0); // Set Max Speed of X axis stepperX.setAcceleration(500.0); // Acceleration of X axis stepperY.setMaxSpeed(400.0); // Set Max Speed of X axis stepperY.setAcceleration(500.0); stepperZ.setMaxSpeed(1600.0); // Set Max Speed of Z axis slower for rotation stepperZ.setAcceleration(600.0); // Acceleration of Z axis //X auf Endschalter fahren while (!digitalRead(home_switchX)) { // Make the Stepper move CCW until the switch is activated stepperX.moveTo(initial_homingX); // Set the position to move to initial_homingX--; // Decrease by 1 for next move if needed stepperX.run(); // Start moving the stepper delay(4); } //Y auf Endschalter fahren while (!digitalRead(home_switchY)) { // Make the Stepper move CCW until the switch is activated stepperY.moveTo(initial_homingY); // Set the position to move to initial_homingY--; // Decrease by 1 for next move if needed stepperY.run(); // Start moving the stepper delay(4); } //Z auf Endschalter fahren while (!digitalRead(home_switchZ)) { // Make the Stepper move CCW until the switch is activated stepperZ.moveTo(initial_homingZ); // Set the position to move to initial_homingZ--; // Decrease by 1 for next move if needed stepperZ.run(); // Start moving the stepper delay(4); } //X vom endschalter runter und 0 setzen while (digitalRead(home_switchX)) { // Make the Stepper move CW until the switch is deactivated stepperX.moveTo(initial_homingX); stepperX.run(); initial_homingX++; delay(5); } stepperX.setCurrentPosition(0); //Y vom endschalter runter und 0 setzen while (digitalRead(home_switchY)) { // Make the Stepper move CW until the switch is deactivated stepperY.moveTo(initial_homingY); stepperY.run(); initial_homingY++; delay(5); } stepperY.setCurrentPosition(0); //Z vom endschalter runter und 0 setzen while (digitalRead(home_switchZ)) { // Make the Stepper move CW until the switch is deactivated stepperZ.moveTo(initial_homingZ); stepperZ.run(); initial_homingZ++; delay(5); } stepperZ.setCurrentPosition(0); Serial.println("Homing Completet"); // Set Max Speed and Acceleration of each Steppers } void loop() { p2(); CL1(); p4(); CL1(); }
-
https://www.dropbox.com/sh/qhyfihemsbxc6rc/AAAXk9TvcHnJwt1WpAhTqtxoa?dl=0
Hier ein paar Bilder des Vorhabens.
Wie man auf den Bildern sehen kann will ich...
-X und Y unter Flasche A positionieren
-Mit Z einen Hub machen um den Dosierer zu leeren
-X kleine Bewegung nach Links oder Rechts ( muss, sonst tut sich der Dosierer nicht wieder Füllen )
-Z wieder den Hub nach unten
-X und Y wieder unter Flasche B positionieren- usw ……
Im Code ist die kleine X Ausweichbewegung noch nicht programmiert.
Fehler ist: wie man in der loop sieht fahre ich Flasche A (p2) an und mache dann den Hub (CL1) fahre dann zu Flasche B (p4) und mache dann wieder den Hub (CL1)
Tatsächliche Programmabfolge:
mal p2,CL1,CL1,CL1,p4,CL1, p2, p4
mal p2, CL1, p4, CL1, p2, p4, p2, CL1, CL1genauer gesagt, es gibt keine Abfolge, obwohl sie für meine begriffe klar und fest vorgegeben wurde.
Bitte helft mir um einen glücklichen Geburtstag mit meinen Gästen feiern zu können.
P.S das programmierte Setup funktioniert einwandfrei.
mit freundlichen Grüßen Patrick Sucko
-
Was sollen die
while
-Schleifen bewirken?while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){ sicherheit=0; move_finishedXY=0; // Set variable for checking move of the Steppers // Set Max Speed and Acceleration of each Steppers stepperX.moveTo(3800); // Set new move position for X Stepper stepperY.moveTo(3950); // Set new move position for Z Stepper delay (1000); }
Logisch gesehen würde hier eine 'if'-Anweisung reichen, denn du setzt ja sofort die beiden Variablen (so daß die Schleife danach sowieso direkt abgebrochen wird).
Ich kenne mich zwar nicht so genau mit den Arduino-Funktionen aus, aber erst durch ein 'stepperX.run()' wird doch der Stepper bewegt?! Also macht das 'delay()' nach den
moveTo
-Funktionen keinen Sinn, denn damit setzt du ja nur die neue Position.Und auch die direkte Abfrage mittels
if ((move_finishedXY == 0) && (stepperX.distanceToGo () == 0) && (stepperY.distanceToGo () == 0)) { // ... }
direkt nach der
run
-Funktion macht m.E. keinen Sinn (denn z.B. die Variable 'move_finishedXY' hat sich ja nicht wieder geändert).Mir kommt also die Logik deines Programm eigenartig vor und daher ist es kein Wunder, daß der Stepper sich nicht so bewegt, wie du es dir vorstellst...
-
void p4 (void){ while((move_finishedXY==1)&&(sicherheit==1)&&(sicherheit2=2)){
Die 3. Bedingung ist falsch und ein typischer Anfängerfehler.
-
Ja, das habe ich auch schon bemerkt das die 3. Bedingungen falsch ist! Mir sind auch noch weitere Fehler aufgefallen, die ich heute mal beheben und testen will! Heute widme ich mich wieder etwas dem Projekt, und werde später einen aktualisierten Code wieder einstellen!
Überhaupt freue ich mich dass mir jemand helfen will, danke schon mal im Voraus
-
Ups, da habe ich ja den passenden Code-Ausschnitt zitiert (denn in den anderen Funktionen ist zumindestens syntaktisch diese Abfrage richtig).