Hi Ich bins nochmal ![]()
Wiedereinmal sitze ich fragen vor meinem Computer und zwar hab ich folgendes Problem ich möchte 2 Stepper unabhängig von einander drehen lassen mit Nachträglich einstellbarer Geschwindigkeit z.B.
Stepper 1 macht 200 Schritte mit Geschwindigkeit x und stoppt dann.
Stepper 2 macht 300 Schritte mit Geschwindigkeit y und stoppt dann.
Zusätzlich sollen sie dann per Joystick gesteuert werden können aber das ist erstmal 2 Rangig.
Ich hab aus dem Netz schon ein Programm was so funktioniert allerdings laufen sie da nur hin und her ich war nicht in der Lage es umzuschreiben wie gewollt das Problem ist ich komme nicht so ganz hinter die Logik....
Ich hab schon ein wenig drin herumgepfuscht hoffe man kann es trotzdem lesen
void setOutput(byte index, byte state);
struct toyStepper_t {
byte bluePin; byte pinkPin; byte yellowPin; byte orangePin;
unsigned long stepDelay; bool clockwise; byte curState;
unsigned int steps2go; unsigned long lastStepMicros;
};
toyStepper_t stepper[2] = { //Array für 2 Schrittmotoren Pinbelegung
{5, 6, 8, 9, true, 0, 0, 0 }, //Motor 2 PAN (360° drehen)
{13, 12, 11, 10, true, 0, 0, 0 }, //Motor 1 Tilt 50-120° drehen
};
const int sens = A1; //Potentiometer für die Einstellung der Geschwindigkeit (Wert:0-1023) an AnalogPin A0
int valsens = 0; //Normalwert des Potis
const int NUMSTEPPERS = sizeof(stepper) / sizeof(toyStepper_t);
const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; //Ansteuerung für Motoren
unsigned long altMillisPrint, now; //Zahlenspeicher 0-4.294.967.295
unsigned long startzeit;
void updateStepper(byte index, long nowMicros) //Steuercode für Stepper (Drehrichtung)
{
if (stepper[index].steps2go == 0) return;
if (nowMicros - stepper[index].lastStepMicros >= stepper[index].stepDelay)
{
stepper[index].lastStepMicros = nowMicros;
stepper[index].steps2go--;
if (stepper[index].clockwise)
{
if (stepper[index].curState > 0) stepper[index].curState--; else stepper[index].curState = 7;
}
else
{
if (stepper[index].curState < 7) stepper[index].curState++; else stepper[index].curState = 0;
}
setOutput(index, stepper[index].curState);
}
}
void setup() {
for (int i = 0; i < NUMSTEPPERS; i++) //Zählt solange bis I < NUMSTEPPERS
{
pinMode(stepper[i].bluePin, OUTPUT); //legt Pins als OUTPUT fest
pinMode(stepper[i].pinkPin, OUTPUT);
pinMode(stepper[i].yellowPin, OUTPUT);
pinMode(stepper[i].orangePin, OUTPUT);
setOutput(i, stepper[i].curState);
}
}
const unsigned int stepsPerRevolution = 10;
void loop() {
valsens=analogRead(sens); //valsens ist gleich gemessener Wert an sens (Poti für Geschwindigkeit)
//Stepper Geschwindigkeit
stepper[0].stepDelay = 1000L * valsens/4; //Motor 1 Tilt 50-120° drehen
stepper[1].stepDelay = 4000L * valsens/5; //Motor 2 PAN (360° drehen)
now = micros(); //now ist gleich Microsekunden
startzeit=millis(); //startzeit ist gleich Millisekunden
for (int i = 0; i < NUMSTEPPERS; i++)
{
updateStepper(i, now);
if (stepper[i].steps2go == 0)
{
stepper[i].clockwise = !stepper[i].clockwise; //ist Anzahl der von einer Umdrehung erreicht dreht Motor in die andere Richtung
stepper[i].steps2go = stepsPerRevolution;
}
}
}
void setOutput(byte index, byte state) //OUTPUT für Schrittmotor
{
digitalWrite(stepper[index].bluePin, bitRead(lookup[state], 1));
digitalWrite(stepper[index].pinkPin, bitRead(lookup[state], 0));
digitalWrite(stepper[index].yellowPin, bitRead(lookup[state], 3));
digitalWrite(stepper[index].orangePin, bitRead(lookup[state], 2));
}