Hulp nodig met AccelStepper
27 berichten
• Pagina 3 van 3 • 1, 2, 3
Re: Hulp nodig met AccelStepper
ik zag een init met motormove maar dat moet dus eigenlijk motormove1 zijn want je noemt motor1 ook 1 dat is logischer.
cpp code
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
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
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
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
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()== -motorMove4dit zou nooit waar zijn want je stuurt de stepper naar +motormove.
&& stepper5.currentPosition()== -motorMove5)
paul deelen
shooter@home.nl
shooter@home.nl
Advertisement
Re: Hulp nodig met AccelStepper
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
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();
}
Re: Hulp nodig met AccelStepper
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
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
shooter@home.nl
Re: Hulp nodig met AccelStepper
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
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
Re: Hulp nodig met AccelStepper
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.
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.
Re: Hulp nodig met AccelStepper
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)
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
shooter@home.nl
Re: Hulp nodig met AccelStepper
als je wil kunnen we skyopen hoor paul.deelen.
mijn vrouw is in het zwart getrouwd.
mijn vrouw is in het zwart getrouwd.
paul deelen
shooter@home.nl
shooter@home.nl
27 berichten
• Pagina 3 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 40 gasten