PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bewegung zweier Motoren mit unterschiedlicher Geschwindigkeit mit AccelStepper



Yoink
13.07.2018, 11:01
Hallo zusammen,
ich bin noch ziemlich neu im Gebiet der Programmierung, habe mich aber mittlerweile etwas damit beschäftigt und komme nun nicht mehr weiter und hoffe auf eure Hilfe.

In meinem Projekt, zwei Motoren zu bewegen, soll MotorA immer hin und her fahren und nach einer Gewissen Anzahl an Bewegungen stoppen (was auch schon funktioniert) und MotorB immer weiter in eine Richtung (was nicht funktioniert). Dabei soll sich der MotorB mit einer anderen Geschwindigkeit bewegen, in diesem Fall einfach mal die doppelte und dabei die entsprechende Strecke zurücklegen (also ebenfalls die doppelte). Planmäßig sollten dann beide Motoren zur selben Zeit die Endposition erreichen. MotorA fährt dann wieder zurück und MotorB nullt sich und fährt wieder von 0 bis 3200.

Da ich zurzeit nur einen Motor habe, lese ich die Positionen über Serial.println() aus, dabei zählt MotorA von 0 bis 1600 und wieder zurück. MotorB bleibt einfach bei 0 stehen. Warum?
Das zweite Problem besteht im setzen der Geschwindigkeit. Wenn ich Max.Speed() benutze, wird dann auch "garantiert" diese Geschwindigkeit erreicht, so dass ich bei doppeltem Wert auch die doppelte Strecke in der gleichen Zeiteinheit schaffe?

Ich bin für jede Hilfe dankbar!



#include <AccelStepper.h>

#define MOTOR_A_ENABLE_PIN 8
#define MOTOR_A_STEP_PIN 4
#define MOTOR_A_DIR_PIN 7

#define MOTOR_B_ENABLE_PIN 8
#define MOTOR_B_STEP_PIN 3
#define MOTOR_B_DIR_PIN 6

AccelStepper motorA(1, MOTOR_A_STEP_PIN, MOTOR_A_DIR_PIN);
AccelStepper motorB(1, MOTOR_B_STEP_PIN, MOTOR_B_DIR_PIN);


boolean Start = true;

int Pos=0;
int pos1=0;
int pos2=1600;
int Lagen=0;


void setup(){

Serial.begin(9600);

//Motordaten
motorA.setMaxSpeed(500);
motorA.setAcceleration(3200);

motorB.setMaxSpeed(1000); //doppelte Geschwindigkeit wie MotorA
motorB.setAcceleration(3200);
}

void loop(){

if (Start == true){

Pos = motorA.currentPosition(); //schreibe aktuelle Position in Pos
if (Pos==pos1) //wenn die aktuelle Position Pos des MotorsA gleich der Startposition Pos1 ist, dann bewege Motor zur Position 2 (Endposition)
{
motorA.moveTo(pos2);
motorB.moveTo(3200); //Bewege auch MotorB zur Position 3200
delay(50);
Lagen++; //Zähle pro Fahrt eine Lage hoch
}
if (Pos==pos2) //wenn Position 2 erreicht, bewege Motor zurück zur Startposition 1
{
motorB.setCurrentPosition(0); //wenn Position 2 erreicht, nulle aktuelle Position MotorB
motorA.moveTo(pos1); //MotorA soll wieder von 1600 zurück zu 0 fahren
motorB.moveTo(3200); //starte MotorB wieder von 0 bis 3200
delay(50);
Lagen++;
}
motorA.run();
if (Lagen==4) //wenn 4 Durchläufe gelaufen sind, setze Start auf false und beende If-Schleife
{
Start=false;
}

Serial.println(motorB.currentPosition()); //Ausgabe aktuelle Position MotorB
}
}