Schrittmotoren vibiren manchmal.

Hallo,
ich habe da eine Frage zu einem Schrittmotor. Ich habe diesen jetzt so programmiert, dass sich der Schlitten einmal über die Abeitfläche bewegt. Am Ende Wird diese Funktion aufgerufen:
if(Stepper3.run() == false)
{
digitalWrite(8,HIGH);
delay(400ß);
digitalWrite(8,LOW):
}

Leider wackeln dann alle drei Motoren plötlich rum. Wie kann ich dass umgehen?

Das Fragment ist zur Beantwortung Deiner Frage nutzlos und würde auch nicht kompilieren.

Gruß Tommy

Welchen Schrittmotor?
Welchen Treiber?

Hallo,

was ist denn am pin8 dran und was ist delay(400ß)

Heinz

Tut mir leid hatte wenig Zeit...
Also ich habe einen A4988 Treiber Modul an einem Nema 17 Motor angeschlossen.
Auf Pin 8 lliegt eine Pumpe welche mit 3.3V betrieben wird,
Für den Code benutze ich die AccelStepper Libary

Hallo
dann zeige den ganzen Sketch, damit wir dir helfen können.

#include <AccelStepper.h>
#include <MultiStepper.h>

//general data;
String data;
int dataCounter = 0;
long  positions[2];

//pumps
int pump1 = 8;
int pump2 = 9;
int pump3 = 10;
int pump4 = 11;
int pump5 = 12;
int pumpComs = 0;

//coordinates



//stepper
AccelStepper Stepper1(1,3,2);
AccelStepper Stepper2(1,5,4);
AccelStepper Stepper3(1,7,6);


 void setup() {
  Serial.begin(9600);
  Serial.print("\nArduino has started!\n----------------\n");
  Serial.print("Current Pins:\nPump No.1 => ");
  Serial.print(pump1);
  Serial.print("\nPump No.2 => ");
  Serial.print(pump2);
  Serial.print("\nPump No.3 => ");
  Serial.print(pump3);
  Serial.print("\nPump No.4 => ");
  Serial.print(pump4);
  Serial.print("\nPump No.5 => ");
  Serial.print(pump5);
  Serial.print("\n--------------------\n\nData:\n");
  pinMode(pump1,OUTPUT);
  pinMode(pump2,OUTPUT);
  pinMode(pump3,OUTPUT);
  pinMode(pump4,OUTPUT);
  pinMode(pump5,OUTPUT);
  Stepper1.setSpeed(150);
  Stepper1.setAcceleration(60);
  Stepper1.setMaxSpeed(150);
  
  Stepper2.setSpeed(150);
  Stepper2.setAcceleration(60);
  Stepper2.setMaxSpeed(150);

  Stepper3.setSpeed(150);
  Stepper3.setMaxSpeed(150);
  Stepper3.setAcceleration(60);   
  
  Stepper1.move(-745);
  Stepper2.move(-745);
  Stepper3.move(-970);
  pumpComs = 1;
}


void loop() {
  
  Stepper1.run();
  Stepper2.run();
  Stepper3.run();

  
  if(Stepper3.run() == false && pumpComs == 1) 
  {
    Serial.print("Pump");
    digitalWrite(pump1,HIGH);
    digitalWrite(3,LOW);
    digitalWrite(5,LOW);
    digitalWrite(7,LOW);
    delay(4000);
    digitalWrite(pump1,LOW);
    digitalWrite(3,HIGH);
    digitalWrite(5,HIGH);
    digitalWrite(7,HIGH);
    pumpComs = 0;
  }

  
  
if(Serial.available() > 0) 
{
  data = Serial.readString();

//Mix 1
if(data == '01') 
{
    Stepper2.run();
  Stepper1.run();
Serial.print("\nStarted Mix:\n  Size: 100ml\n  Mix: Bottel 1 + Bottel 2\n\nStates:\n");

//moveToSlot1
Serial.print("  Move to First Position...\n");
  


if(Stepper3.run() == false) 
{
  Serial.print("  Arrived at Position!");
  Serial.print("\n");
  Serial.print("  Start filling!\n");
  digitalWrite(pump1,HIGH);
}

Serial.print("  Move to next Position...\n");
//moveToSlot2
  positions[0] = 10;
  positions[1] = 20;


if(Stepper3.run() == false) 
{
  Serial.print("  Arrived at Position!");
  Serial.print("\n");
  Serial.print("  Start filling...\n");
}
} 




if(data == '2')
{
  
}

if(data == '3')
{
  
}

if(data == '4')
{
  
}

if(data == '5')
{
  
}
  
}}

Data kommt über ein Bluethoot Modul.
Ich benutze aber gerade einfach zum Testen beim Setup einen Stepper.move Befehl und im Loop eine Run Funktion.
Die If Schleife soll ausgeführt werden, wenn der Motor (Stepper3) sein Ziel erreicht hat.

Hallo
ich habe mir den Sketch angeschaut. Leider kann ich nicht nachvollziehen wann, wo, was, wie und warum läuft oder aucht nicht.
Mir fehlen die Kommentare bzw beschreibene Variablenamen um helfen zu können.

benny001:
Die If Schleife soll ausgeführt werden, wenn der Motor (Stepper3) sein Ziel erreicht hat.

Es gibt keine if-Schleifen. Was meinst Du also damit?

Du solltest mal ein paar Kommentare in deinen Sketch schreiben, damit man weis, was da jeweils passieren soll, und eine ordentliche Formatierung würde auch bei der Übersicht helfen ( Ctrl-T hilft dabei :wink: ).

Was mir auffällt, dass außer im Setup wonirgends mehr eine move-Aufruf für die Stepper vorkommt. Wie sollen die sich da bewegen?
Ausserdem ist delay() im Zusammenhang mit der AccelStepper ziemlich tötlich, weil in dieser Zeit keine Steps mehr erzeugt werden können.

Ok, hier sind jetzt alle Informationen:
Ich habe drei Stepper Motoren, die via einem A4988 Treiber Modul angeschlossen sind:

AccelStepper Stepper1(1,3,2);[color=#222222][/color]
AccelStepper Stepper2(1,5,4);[color=#222222][/color]
AccelStepper Stepper3(1,7,6);[color=#222222][/color]

Hier werden dann die Geschwindigkeiten festgelegt:

Stepper1.setSpeed(150);[color=#222222][/color]
  Stepper1.setAcceleration(60);[color=#222222][/color]
  Stepper1.setMaxSpeed(150);[color=#222222][/color]
 [color=#222222][/color]
  Stepper2.setSpeed(150);[color=#222222][/color]
  Stepper2.setAcceleration(60);[color=#222222][/color]
  Stepper2.setMaxSpeed(150);[color=#222222][/color]
[color=#222222][/color]
  Stepper3.setSpeed(150);[color=#222222][/color]
  Stepper3.setMaxSpeed(150);[color=#222222][/color]
  Stepper3.setAcceleration(60);

Dann wird im Setup ein Move Befehl ausgeführt, also der Befehl so und so viele Schritte zu machen:

Stepper1.move(-745);[color=#222222][/color]
  Stepper2.move(-745);[color=#222222][/color]
  Stepper3.move(-970);

Dann wird in der Loop Funktion immer ein mal ein Run Befehl für jeden Motor ausgeführt:

Stepper1.run();[color=#222222][/color]
  Stepper2.run();[color=#222222][/color]
  Stepper3.run();[color=#222222][/color]

Dann soll in einer If-Abfrage getestet werden, ob der Schrittmotor Nr3 fertig ist.

f(Stepper3.run() == false && pumpComs == 1)[color=#222222][/color]
  {[color=#222222][/color]
    Serial.print("Pump");[color=#222222][/color]
    digitalWrite(pump1,HIGH);[color=#222222][/color]
    delay(4000);[color=#222222][/color]
    digitalWrite(pump1,LOW);[color=#222222][/color]
    pumpComs = 0;[color=#222222][/color]
  }

Alles darunter wird im Moment nicht ausgeführt und ist nur für weitere Zwecke.

Was sollen die unsinnigen color-Angaben?
Außerdem ist das immer noch kein compilierfähiger Sketch.

Gruß Tommy

Tommy56:
Was sollen die unsinnigen color-Angaben?
Außerdem ist das immer noch kein compilierfähiger Sketch.

Gruß Tommy

Die Color angabe sind Irgendwie dazu gekommen bitte einfach ignorieren.
Was meinst du mit compilerfaiger Sketch Arduino IDE gibt keine Fehlermeldung

Die sind nicht irgendwie dazu gekommen, sondern die kommen von Dir. Lass die also in Zukunft weg.
Du wirfst uns nur Fragmente vor, mit denen keiner etwas anfangen kann. Da wird es wohl eng mit Hilfe werden.

Gruß Tommy

benny001:
Ok, hier sind jetzt alle Informationen:

Den reinen Code brauchst du nicht erklären, das sehen wir auch so. Wichtig wäre, was das von der Logik her bedeuten soll. Wieso die move-Anweisungen nur im setup()? Sollen sich die Motore nur einmal bewegen, und dann nie wieder?

benny001:
Alles darunter wird im Moment nicht ausgeführt und ist nur für weitere Zwecke.

Warum sollte das nicht ausgeführt werden? Natürlich werden auch die folgenden Anweisungen alle ausgeführt. Ob das in deinem Sinne ist, ist eien andere Frage.

Deshalb nochmal: Was erwartest Du bei deinem Sketch was passieren soll und was passiert tatsächlich.

Hallo,

hab mich auch über die color gewundert. Kann es sein das die aus dem Webeditor stammen. ?

Mach doch erst mal ein ganz einfaches Beispiel mit nur einem Motor. Den lässt Du auf eine bestimmte Anzahl stepps laufen und wenn das fertig ist machst Du eine LED an. Am besten nimmst Du noch einen Taster dazu damit Du das dann immer wieder neu starten kannst. Und alles im loop.

ich weiss auch nicht was passiert wenn man Stepper.run() merfach aufruft, zum laufen lassen und zur Abfrage. ? Schau dir mal die Doku an
link da findest Du auch noch die methode distanceToGo().

Heinz

Rentner:
hab mich auch über die color gewundert. Kann es sein das die aus dem Webeditor stammen. ?

Eher nicht. Jedenfalls nicht, wenn am PC gearbeitet wird. Gerade ausprobiert:
Webeditor: Copy. Forum: Paste.
Da wird nur der "reine" Code eingefügt. Mag natürlich sein, dass es ev. auch vom Browser abhängt. Habe es jedenfalls probiert mit Chrome und Firefox. Gleiches Verhalten.

Tablet/Phone weiß ich nicht.

benny001:
Ok, hier sind jetzt alle Informationen:
Ich habe drei Stepper Motoren, die via einem A4988 Treiber Modul angeschlossen sind:

AccelStepper Stepper1(1,3,2);[color=#222222][/color]

AccelStepper Stepper2(1,5,4);
AccelStepper Stepper3(1,7,6);




Hier werden dann die Geschwindigkeiten festgelegt:


Stepper1.setSpeed(150);
 Stepper1.setAcceleration(60);
 Stepper1.setMaxSpeed(150);

 Stepper2.setSpeed(150);
 Stepper2.setAcceleration(60);
 Stepper2.setMaxSpeed(150);

 Stepper3.setSpeed(150);
 Stepper3.setMaxSpeed(150);
 Stepper3.setAcceleration(60);




Dann wird im Setup ein Move Befehl ausgeführt, also der Befehl so und so viele Schritte zu machen:


Stepper1.move(-745);
 Stepper2.move(-745);
 Stepper3.move(-970);




Dann wird in der Loop Funktion immer ein mal ein Run Befehl für jeden Motor ausgeführt:


Stepper1.run();
 Stepper2.run();
 Stepper3.run();




Dann soll in einer If-Abfrage getestet werden, ob der Schrittmotor Nr3 fertig ist.


f(Stepper3.run() == false && pumpComs == 1)
 {
   Serial.print("Pump");
   digitalWrite(pump1,HIGH);
   delay(4000);
   digitalWrite(pump1,LOW);
   pumpComs = 0;
 }



Alles darunter wird im Moment nicht ausgeführt und ist nur für weitere Zwecke.

Hallo
und wofür ist die Bedingung

pumpComs == 1

gedacht ?

Rentner:
ich weiss auch nicht was passiert wenn man Stepper.run() merfach aufruft, zum laufen lassen und zur Abfrage. ? Schau dir mal die Doku an
link da findest Du auch noch die methode distanceToGo().

distanceToGo() wird am Ende von run() aufgerufen. Aber ich finde auch klarer, wenn man für die Abfrage, ob der Stepper das Ziel erreicht hat, distanceToGo() nimmt.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.