Hulp nodig met AccelStepper

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 17 Mei 2015, 09:33

ik zag een init met motormove maar dat moet dus eigenlijk motormove1 zijn want je noemt motor1 ook 1 dat is logischer.
cpp code
int motorMove;
int motorPos;
int motorSpeed;
int motorAccel;

verder zag ik heel veel herhaling, geen idee waar dat voor nodig is, want je kunt beter vragen of de stepper op positie is ipv vragen of er verschil bestaat tussen pos en move.

cpp code
if (forward1 && forward2 && forward3 && forward4 && forward5){
for (int motorPos =0; motorPos <= motorMove; motorPos++){
stepper1.moveTo(motorMove);
stepper2.moveTo(motorMove2);
stepper3.moveTo(motorMove3);
stepper4.moveTo(motorMove4);
stepper5.moveTo(motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();


for (int motorPos2 =0; motorPos2 <= motorMove2; motorPos2++){
stepper1.moveTo(motorMove);
stepper2.moveTo(motorMove2);
stepper3.moveTo(motorMove3);
stepper4.moveTo(motorMove4);
stepper5.moveTo(motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();
}
for (int motorPos3 =0; motorPos3 <= motorMove3; motorPos3++){
stepper1.moveTo(motorMove);
stepper2.moveTo(motorMove2);
stepper3.moveTo(motorMove3);
stepper4.moveTo(motorMove4);
stepper5.moveTo(motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();

}
for (int motorPos4 =0; motorPos4 <= motorMove4; motorPos4++){
stepper1.moveTo(motorMove);
stepper2.moveTo(motorMove2);
stepper3.moveTo(motorMove3);
stepper4.moveTo(motorMove4);
stepper5.moveTo(motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();

}
for (int motorPos5 =0; motorPos5 <= motorMove5; motorPos5++){
stepper1.moveTo(motorMove);
stepper2.moveTo(motorMove2);
stepper3.moveTo(motorMove3);
stepper4.moveTo(motorMove4);
stepper5.moveTo(motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();


}
}

}

else {
for (int motorPos =0; motorPos <= motorMove; motorPos--){
stepper1.moveTo(-motorMove);
stepper2.moveTo(-motorMove2);
stepper3.moveTo(-motorMove3);
stepper4.moveTo(-motorMove4);
stepper5.moveTo(-motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();
}
for (int motorPos2=0; motorPos2 <= motorMove2; motorPos2--){
stepper1.moveTo(-motorMove);
stepper2.moveTo(-motorMove2);
stepper3.moveTo(-motorMove3);
stepper4.moveTo(-motorMove4);
stepper5.moveTo(-motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();


}
for (int motorPos3=0; motorPos3 <= motorMove3; motorPos3--){
stepper1.moveTo(-motorMove);
stepper2.moveTo(-motorMove2);
stepper3.moveTo(-motorMove3);
stepper4.moveTo(-motorMove4);
stepper5.moveTo(-motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();

}
for (int motorPos4=0; motorPos4 <= motorMove4; motorPos4--){
stepper1.moveTo(-motorMove);
stepper2.moveTo(-motorMove2);
stepper3.moveTo(-motorMove3);
stepper4.moveTo(-motorMove4);
stepper5.moveTo(-motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();

}
for (int motorPos5=0; motorPos5 <= motorMove5; motorPos5--){
stepper1.moveTo(-motorMove);
stepper2.moveTo(-motorMove2);
stepper3.moveTo(-motorMove3);
stepper4.moveTo(-motorMove4);
stepper5.moveTo(-motorMove5);
stepper1.run();
stepper2.run();
stepper3.run();
stepper4.run();
stepper5.run();



}
}
}

waar is deze code voor?
en zijn wel erg veel geneste for loops dus waarom
daar moet je de motorrun weghalen. want die hoort alleen maar in de loop te staan. of daar zelfs in een functie steppersrun.


in de loop zelf geen serial commandos gebruiken , maar die in een sub zetten want anders wordt het erg traag en je ziet niks meer op je scherm want dat gaat te snel.

cpp code
if (stepper1.currentPosition()== motorMove && stepper2.currentPosition()== motorMove2 && stepper3.currentPosition()== motorMove3 && stepper4.currentPosition()== motorMove4 && stepper5.currentPosition()== motorMove5){
stepper1.stop();
stepper2.stop();
stepper3.stop();
stepper4.stop();
stepper5.stop();

niet nodig want de motoren staan al stil als positie is bereikt.
wellicht wel gebruiken voor volgende positie. maar dan is atpos veel slimmer.

cpp code
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
stepper2.disableOutputs();
stepper2.setCurrentPosition(0);
stepper3.disableOutputs();
stepper3.setCurrentPosition(0);
stepper4.disableOutputs();
stepper4.setCurrentPosition(0);
stepper5.disableOutputs();
stepper5.setCurrentPosition(0);

disableOutputs kan wel maar, doe dat alleen als robot al 1 seconde stil staat want anders heb je geen rem.
setcurrent0 alleen doen als robot in nulpositie staat want anders heb je geen idee meer waar de armen zijn.
je moet van positie naar positie gaan, en niet zwaaien van - naar +

cpp code
(stepper1.currentPosition()== -motorMove && stepper2.currentPosition()== -motorMove2 && stepper3.currentPosition()== -motorMove3 && stepper4.currentPosition()== -motorMove4
&& stepper5.currentPosition()== -motorMove5)
dit zou nooit waar zijn want je stuurt de stepper naar +motormove.
paul deelen
shooter@home.nl

Advertisement

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 21 Mei 2015, 20:09

Goedeavond,

Bedankt voor de tips in je vorige bericht! De code is aangepast. Werkt prima, en ik heb 2 functies toegevoegd. De home functie, en een array functie.

Alleen het probleem zit nu in de array functie. Want die wil bij mij niet werken. Array gaat niet verder dan 0 :?:

Ik heb de array die ik aan het begin van dit onderwerp maakte, overgetypt (en 2 avonden het probleem geprobeerd te verhelpen).

st1Ar << stepper1Array0,1,2,3 etc: had ik eerder geprobeerd i.p.v runStep1 zoals:

Serial.print("Motor 1 Move(2) input ");
while (Serial.available() == 0) { }
st1Ar0 = Serial.parseInt();

en dan:

st1.move(st1Move[st1Ar0];
st1Ar0++

Dit werkte ook niet voor mij.
int runStep1; < deed niks
int runStep1 = 0; 1 stap

Kunt u mij vertellen wat ik kan doen om tot een oplossing te komen.



groeten Ivan




cpp code
#include <AccelStepper.h>




AccelStepper st1(AccelStepper::HALF4WIRE, 30, 32, 34, 36);
AccelStepper st2(AccelStepper::HALF4WIRE, 22, 24, 26, 28);
AccelStepper st3(AccelStepper::HALF4WIRE, 46, 48, 50, 52);
AccelStepper st4(AccelStepper::HALF4WIRE, 38, 40, 42, 44);
AccelStepper st5(AccelStepper::HALF4WIRE, 39, 41, 43, 45);

int functionNumber;


int motorMove1;
int motorMove2;
int motorMove3;
int motorMove4;
int motorMove5;

int runStep1 = 0;
int runStep2;
int runStep3;
int runStep4;
int runStep5;

int st1Move[4];
int st2Move[4];
int st3Move[4];
int st4Move[4];
int st5Move[4];

int st1Ar0;
int st1Ar1;
int st1Ar2;
int st1Ar3;
int st1Ar4;






void setup() {
Serial.begin(9600);

st1.setAcceleration(250);
st1.setMaxSpeed(400);
st2.setAcceleration(700);
st2.setMaxSpeed(1600);
st3.setAcceleration(800);
st3.setMaxSpeed(1400);
st4.setAcceleration(800);
st4.setMaxSpeed(2000);
st5.setAcceleration(700);
st5.setMaxSpeed(1500);
info();



}




void command() {




st1.moveTo(motorMove1);
st2.moveTo(motorMove2);
st3.moveTo(motorMove3);
st4.moveTo(motorMove4);
st5.moveTo(motorMove5);



}


void info() {




Serial.println(" ");
Serial.print("Function Number input ");
while (Serial.available() == 0) { }
functionNumber = Serial.parseInt();
Serial.println(functionNumber);

if (functionNumber == 1) {

//stepper1 setup
Serial.print("Motor 1 Move input ");
while (Serial.available() == 0) { }
motorMove1 = Serial.parseInt();
Serial.println(motorMove1);

// stepper2

Serial.print("Motor 2 Move input ");
while (Serial.available() == 0) { }
motorMove2 = Serial.parseInt();
Serial.println(motorMove2);

// stepper3

Serial.print("Motor 3 Move input ");
while (Serial.available() == 0) { }
motorMove3 = Serial.parseInt();
Serial.println(motorMove3);

// stepper4

Serial.print("Motor 4 Move input ");
while (Serial.available() == 0) { }
motorMove4 = Serial.parseInt();
Serial.println(motorMove4);

// stepper5

Serial.print("Motor 5 Move input ");
while (Serial.available() == 0) { }
motorMove5 = Serial.parseInt();
Serial.println(motorMove5);


Serial.println("Loading.........");
delay(30);
}

else if (functionNumber == 3) {

Serial.print("Motor 1 Move(0) input ");
while (Serial.available() == 0) { }
st1Move[0] = Serial.parseInt();

Serial.println(st1Move[0]);

Serial.print("Motor 1 Move(1) input ");
while (Serial.available() == 0) { }
st1Move[1] = Serial.parseInt();

Serial.println( st1Move[1]);

Serial.print("Motor 1 Move(2) input ");
while (Serial.available() == 0) { }
st1Move[2] = Serial.parseInt();

Serial.println( st1Move[2]);

Serial.print("Motor 1 Move(3) input ");
while (Serial.available() == 0) { }
st1Move[3] = Serial.parseInt();

Serial.println( st1Move[3]);

Serial.print("Motor 1 Move(4) input ");
while (Serial.available() == 0) { }
st1Move[4] = Serial.parseInt();

Serial.println(st1Move[4]);

}
else {
command2();
}
}

void command2() {

st1.moveTo(0);
st2.moveTo(0);
st3.moveTo(0);
st4.moveTo(0);
st5.moveTo(0);

}


void command3() {


if (st1.distanceToGo() == 0) {

st1.move(st1Move[runStep1]);
runStep1++;
Serial.println(st1.currentPosition());

}
}
void loop() {

switch (functionNumber) {
case 1:
command();
if ( st1.currentPosition() == motorMove1 && st2.currentPosition() == motorMove2 && st3.currentPosition() == motorMove3 && st4.currentPosition() == motorMove4 && st5.currentPosition() == motorMove5) {
st1.stop();
st2.stop();
st3.stop();
st4.stop();
st5.stop();

st1.disableOutputs();
st2.disableOutputs();
st3.disableOutputs();
st4.disableOutputs();
st5.disableOutputs();

Serial.print("Stepper 1 position ");
Serial.println(st1.currentPosition());
Serial.print("Stepper 2 position ");
Serial.println(st2.currentPosition());
Serial.print("Stepper 3 position ");
Serial.println(st3.currentPosition());
Serial.print("Stepper 4 position ");
Serial.println(st4.currentPosition());
Serial.print("Stepper 5 position ");
Serial.println(st5.currentPosition());
info();
break;

case 2:
command2();
if ( st1.currentPosition() == 0 && st2.currentPosition() == 0 && st3.currentPosition() == 0 && st4.currentPosition() == 0 && st5.currentPosition() == 0) {
st1.stop();
st2.stop();
st3.stop();
st4.stop();
st5.stop();

st1.disableOutputs();
st2.disableOutputs();
st3.disableOutputs();
st4.disableOutputs();
st5.disableOutputs();

Serial.print("Stepper 1 position ");
Serial.println(st1.currentPosition());
Serial.print("Stepper 2 position ");
Serial.println(st2.currentPosition());
Serial.print("Stepper 3 position ");
Serial.println(st3.currentPosition());
Serial.print("Stepper 4 position ");
Serial.println(st4.currentPosition());
Serial.print("Stepper 5 position ");
Serial.println(st5.currentPosition());
info();

}

break;

case 3:
command3();
if (runStep1 > 3) {

st1.stop();
st1.disableOutputs();
Serial.println(st1.currentPosition());
info();
}
break;
}


}

st1.run();
st2.run();
st3.run();
st4.run();
st5.run();

}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 21 Mei 2015, 22:39

Goed bezig:
Volgende stap:
stappen array

(stapnummer,steppernummer,positie,staptijd)
stapnummer is niet echt nodig, maar straks wel want dan kun je subbewegingen maken en is handig als je de array vult.
steppernummer is de stepper waarvan je de gewenste positie wil veranderen.
positie is de gewenste positie
staptijd is de tijd alvorens de volgende stap in het programma gedaan moet worden.

uitleg
(1,1,100,1000)
stepper1 gaat naar pos 100.
na 1 seconde wordt de volgende stap gedaan.
bijv:
2,2,100,0)
stepper 2 ook naar 100
enzovoorts.
dus een functie maken met case steppernummer en dan de gewenste positie dus
st1.moveto(positie)
steptime=array[stepnumber].staptijd;

in de loop uiteraard die run dingen
en een timer:
currenttime=millis();
if currenttime-steptime>previoustime ){stepnumber+=1; functiecase(stepnumber)

je snapt het wel denk ik.

jij maakt een foutje door de rare manier van functiegebruik de ene is met () en de nadere met []
bovenstaand een algemene versie
paul deelen
shooter@home.nl

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 22 Mei 2015, 10:15

Goedemorgen,

de bedoeling is dat de positie van array gestuurd wordt via serialmonitor.
de voorbeeld die u hebt gegeven snap ik voor een deel.

Moet ik een nieuwe case maken ? Of kan het al in een bestaande functionNumber case gemonteerd worden.
Dit is weer een niveau hoger dan waar ik nu ben. Maar ik hoop met uw ondersteuning dit toch te realiseren.
Zodra de array klaar is plaats ik een Video van de robot op youtube!!

groeten ivan

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 22 Mei 2015, 19:43

Op dit moment ben ik er druk mee bezig en zit echt met mijn handen in het haar.

Want ik wil geen vaste posities, het moet gaan via Serial.monitor. Ik heb moeite om die currentmillis en steptime te begrijpen en hoe ze te verwerken in de case

Serial.print("Motor 1 Move(0) input ");
while (Serial.available() == 0) { }
st1Ar0 = Serial.parseInt();

Serial.println(st1Ar0);

switch (stNumber) {

case 1: st1.moveTo(st1Move[st1Ar0]);break;

case 2: st2.moveTo(st2Move[st2Ar0]);break;
}
st1Move is de array zelf
st1Ar0 is parseInt

dan dit

command3();
currenttime = millis();

if (currenttime-st1Ar0>previoustime) {

st1.stop();
st1.disableOutputs();
Serial.println(st1.currentPosition());
info();
}

wat bedoel je hier met previoustime en waar staat steptime voor. Waar moet dat gedeclareerd worden :|

Hoe kunnen ze zo tegelijk draaien. :(

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 22 Mei 2015, 20:09

nou dan moet je dus 5 keer getal binnenhalen, de gewenste positie.
die kun je gelijk naar moveto zetten voor het gemak. (zolang je geen run doet gaat dat prima.
als je ze alle 5 gedaan hebt. dan zet je de steppers aan en keer je terug naar je loop en daar staat dan die run commando's onder elkaar.

als alle motoren op positie zijn (if in de loop) dan steppers uitzetten en weer 5 posities intypen.
een positie mag natuurlijk gelijk zijn aan de vorige, dan beweegt de stepper niet.

een uitbreiding is als je zowel steppernummer als de positie opgeeft, dan ga je dus in die case instructie moveto zetten.

en je hebt gelijk hoor stap voor stap:

de logisch volgende is om een array in de software te zetten die telkens herhaald wordt. je moet dan wel telkens de tijd opgeven tot de volgende stap, want anders gaat het veel te snel daar is die stapnummer en staptijd voor.
je krijgt dan een lange lijst met commandos die achter elkaar verwerkt worden.




die zet je in een array (voor de toekomst even)
paul deelen
shooter@home.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 22 Mei 2015, 20:11

als je wil kunnen we skyopen hoor paul.deelen.
mijn vrouw is in het zwart getrouwd.
paul deelen
shooter@home.nl

Vorige

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 41 gasten