Hulp nodig met AccelStepper

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 29 Apr 2015, 19:30

Paul, ik wil graag foto's plaatsen. Maar kan niet meer dan 200kb uploaden hier. Mijn tel maakt gemmideld 1 mb per foto.
of is er een andere manier.

Advertisement

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

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 11 Mei 2015, 11:02

ja hoor de resolutie kleiner maken of alles in een zip zetten dat gaat ook.
en als het heel groot is dan kun je wetransfer gebruiken.
paul deelen
shooter@home.nl

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

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 14 Mei 2015, 23:28

Goede avond!

Ik ben druk bezig met de robot bekabeling en de foto's worden snel geplaatst. Vandaag ben ik druk geweest met het schrijven van een code, waarmee je de robot opdrachten kunt geven via de Serial monitor. Het werkt perfect met 1 motor, open serial monitor en toets in de waarden voor:

Snelheid
Positie
Richting
Acceleratie

Na het bereiken van de gegeven positie reset de motor de positie naar 0 en zet alle uitgangen op LOW.
Daarna kan je weer een positie opgeven etc.
Maar helaas een tweede of meerdere motoren erbij zit er niet in,


Code :









#include <AccelStepper.h>




AccelStepper stepper1(AccelStepper::HALF4WIRE, 30, 32, 34, 36);
AccelStepper stepper2(AccelStepper::HALF4WIRE, 22, 24, 26, 28);
AccelStepper stepper3(AccelStepper::HALF4WIRE, 46, 48, 50, 52);

int motorMove2;
int motorPos2 = 0;
int motorSpeed2;
int motorAccel2;
int Dir2;




int motorMove;
int motorPos = 0;
int motorSpeed;
int motorAccel;
int Dir;


void setup() {
Serial.begin(9600);
Serial.println("Test 6 Case 9 Robot");


}
void command2(boolean forward2){

if (forward2){
for (int motorPos2 =0; motorPos2 <= motorMove2; motorPos2++){
stepper2.moveTo(motorMove2);
stepper2.setMaxSpeed(motorSpeed2);
stepper2.setAcceleration(motorAccel2);
stepper2.run();
}
}
else {
for (int motorPos2=0; motorPos2 <= motorMove2; motorPos2--){
stepper2.moveTo(-motorMove2);
stepper2.setMaxSpeed(motorSpeed2);
stepper2.setAcceleration(motorAccel2);
stepper2.run();

}
}
}


void command(boolean forward){

if (forward){
for (int motorPos =0; motorPos <= motorMove; motorPos++){
stepper1.moveTo(motorMove);
stepper1.setMaxSpeed(motorSpeed);
stepper1.setAcceleration(motorAccel);
stepper1.run();
}
}
else {
for (int motorPos=0; motorPos <= motorMove; motorPos--){
stepper1.moveTo(-motorMove);
stepper1.setMaxSpeed(motorSpeed);
stepper1.setAcceleration(motorAccel);
stepper1.run();

}
}
}




void info(){

// stepper1 setup
Serial.print("Motor 1 Speed input "); //hier is de setup van de 2 motoren
while (Serial.available()==0){ }
motorSpeed = Serial.parseInt();
Serial.println(motorSpeed);
Serial.print("Motor Move input ");
while (Serial.available()==0){ }
motorMove = Serial.parseInt();
Serial.println(motorMove);
Serial.print("Direction ");
while (Serial.available()==0){ }
boolean forward = Dir;
Dir = Serial.parseInt();
Serial.println(Dir);
Serial.print("Motor Accel input ");
while (Serial.available()==0){ }
motorAccel = Serial.parseInt();
Serial.println(motorAccel);
//stepper2 setup
Serial.print("Motor 2 Speed input ");
while (Serial.available()==0){ }
motorSpeed2 = Serial.parseInt();
Serial.println(motorSpeed2);
Serial.print("Motor 2 Move input ");
while (Serial.available()==0){ }
motorMove2 = Serial.parseInt();
Serial.println(motorMove2);
Serial.print("Direction ");
while (Serial.available()==0){ }
boolean forward2 = Dir2;
Dir2 = Serial.parseInt();
Serial.println(Dir2);
Serial.print("Motor Accel input ");
while (Serial.available()==0){ }
motorAccel2 = Serial.parseInt();
Serial.println(motorAccel2);

delay(300);
Serial.println("Proccessing data"); //stoer
delay(500);
Serial.println("Data succesfully transfered");
}
void loop() {

command(Dir);
command(Dir2);
if (stepper1.currentPosition()== motorMove){
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);

stepper1.run();
}
else if (stepper1.currentPosition() == -motorMove){
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);

stepper1.run();
}
if (stepper2.currentPosition()== motorMove2){
stepper2.disableOutputs();
stepper2.setCurrentPosition(0);

stepper2.run();
}
else if (stepper2.currentPosition() == -motorMove2){
stepper2.disableOutputs();
stepper2.setCurrentPosition(0);

stepper2.run();
}
stepper1.run();
stepper2.run();
stepper1.enableOutputs();
stepper2.enableOutputs();

info();

}


Dit is een soort teach functie voor de robot. Na het fijn afstellen via de serial monitor kan ik makkelijk de waardes overschrijven en dat in een array verwerken. De bedoeling is zo:

Motornummer
Snelheid
Richting
Acceleratie

Nu mis ik alleen de motornummer, een int declareren als een "1" van stepper1 gaat ook niet.

Zoals

1.moveTo(motorMove); (1 is stepper1, 2 is stepper2 etc)

Dat gaat dus niet :(
Ik denk dat de loop te snel gaat voor alles tegelijk maar ik ben heel benieuwd naar DE oplossing


Help me

Met vriendelijke groeten

I

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

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 15 Mei 2015, 19:12

case switch werkt wel dus case motornummer en dan bij 1 alle stappen van motor1 eronder.
etc.
begin daar maar eens mee.
paul deelen
shooter@home.nl

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

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 15 Mei 2015, 23:08

Ik heb het nu in een case switch gemaakt.
Alleen wil stepper2 niet van richting veranderen ongeacht welke richting ik aangeef via de serial monitor het blijf FALSE.
En tegelijk besturen lukt me ook niet, alleen om de beurt. Hoe kan ik ze tegelijk laten draaien.

Hier is mijn code.



#include <AccelStepper.h>




AccelStepper stepper1(AccelStepper::HALF4WIRE, 30, 32, 34, 36);
AccelStepper stepper2(AccelStepper::HALF4WIRE, 22, 24, 26, 28);
AccelStepper stepper3(AccelStepper::HALF4WIRE, 46, 48, 50, 52);

int motorNumber;
int motorMove2;
int motorPos2;
int motorSpeed2;
int motorAccel2;
int Dir2;
int sw = 1;



int motorMove;
int motorPos;
int motorSpeed;
int motorAccel;
int Dir;


void setup() {
Serial.begin(9600);
Serial.println("Test 1 Case 1 Robot");
stepper1.setAcceleration(500);
stepper1.setMaxSpeed(700);
stepper2.setAcceleration(500);
stepper2.setMaxSpeed(700);
info();


}

void command2(boolean forward2){

if (forward2){
for (int motorPos =0; motorPos <= motorMove; motorPos++){
stepper2.moveTo(motorMove);

stepper2.run();
}
}

else {
for (int motorPos=0; motorPos <= motorMove; motorPos--){
stepper2.moveTo(-motorMove);

stepper2.run();

}
}

}


void command(boolean forward){

if (forward){
for (int motorPos =0; motorPos <= motorMove; motorPos++){
stepper1.moveTo(motorMove);


stepper1.run();



}

}

else {
for (int motorPos=0; motorPos <= motorMove; motorPos--){
stepper1.moveTo(-motorMove);

stepper1.run();

}
}

}

void checkStepper1(){


if (stepper1.currentPosition()== motorMove){
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
stepper1.run();
}
else if (stepper1.currentPosition()== -motorMove){
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
stepper1.run();


}
}


void info(){

// stepper1 setup


Serial.println(" ");
Serial.print("Motor Number input ");
while (Serial.available()==0){ }
motorNumber = Serial.parseInt();
Serial.println(motorNumber);
Serial.print("Motor Move input ");
while (Serial.available()==0){ }
motorMove = Serial.parseInt();
Serial.println(motorMove);
Serial.print("Direction ");
while (Serial.available()==0){ }
boolean forward = Dir;
Dir = Serial.parseInt();
Serial.println(Dir);


/* stepper2

Serial.print("Motor 2 Move input ");
while (Serial.available()==0){ }
motorMove2 = Serial.parseInt();
Serial.println(motorMove2);
Serial.print("Direction ");
while (Serial.available()==0){ }
boolean forward2 = Dir2;
Dir2 = Serial.parseInt();
Serial.println(Dir2);
*/

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

}
void loop() {

switch(motorNumber) {
case 1:
command(Dir);

if (stepper1.currentPosition()== motorMove){
stepper1.stop();
Serial.print(" Stepper 1 TRUE ");
Serial.println(motorMove);

stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();

}
else if (stepper1.currentPosition()== -motorMove){
stepper1.stop();
Serial.print(" Stepper 1 FALSE ");
Serial.println(motorMove);

stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();
}




break;

case 2:
command2(Dir2);
if (stepper2.currentPosition()== motorMove){
stepper2.stop();
Serial.print(" Stepper 2 TRUE ");
Serial.println(motorMove);

stepper2.disableOutputs();
stepper2.setCurrentPosition(0);
info();

}
else if (stepper2.currentPosition()== -motorMove){
stepper2.stop();
Serial.print("Stepper 2 FALSE ");
Serial.println(motorMove);

stepper2.disableOutputs();
stepper2.setCurrentPosition(0);
info();
}

break;
}

/*
if (stepper1.currentPosition()== motorMove){
stepper1.stop();
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();
}
else if (stepper1.currentPosition()== -motorMove){
stepper1.stop();
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();



*/
stepper1.enableOutputs();
stepper2.enableOutputs();
stepper2.run();

stepper1.run();


}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hulp nodig met AccelStepper

Berichtdoor nicoverduin » 16 Mei 2015, 14:16

eerst maar eens leesbaarder maken......
cpp code
#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::HALF4WIRE, 30, 32, 34, 36);
AccelStepper stepper2(AccelStepper::HALF4WIRE, 22, 24, 26, 28);
AccelStepper stepper3(AccelStepper::HALF4WIRE, 46, 48, 50, 52);

int motorNumber;
int motorMove2;
int motorPos2;
int motorSpeed2;
int motorAccel2;
int Dir2;
int sw = 1;

int motorMove;
int motorPos;
int motorSpeed;
int motorAccel;
int Dir;

void setup() {
Serial.begin(9600);
Serial.println("Test 1 Case 1 Robot");
stepper1.setAcceleration(500);
stepper1.setMaxSpeed(700);
stepper2.setAcceleration(500);
stepper2.setMaxSpeed(700);
info();

}

void command2(boolean forward2) {

if (forward2) {
for (int motorPos = 0; motorPos <= motorMove; motorPos++) {
stepper2.moveTo(motorMove);

stepper2.run();
}
}

else {
for (int motorPos = 0; motorPos <= motorMove; motorPos--) {
stepper2.moveTo(-motorMove);

stepper2.run();

}
}

}

void command(boolean forward) {

if (forward) {
for (int motorPos = 0; motorPos <= motorMove; motorPos++) {
stepper1.moveTo(motorMove);

stepper1.run();

}

}

else {
for (int motorPos = 0; motorPos <= motorMove; motorPos--) {
stepper1.moveTo(-motorMove);

stepper1.run();

}
}

}

void checkStepper1() {

if (stepper1.currentPosition() == motorMove) {
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
stepper1.run();
} else if (stepper1.currentPosition() == -motorMove) {
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
stepper1.run();

}
}

void info() {

// stepper1 setup

Serial.println(" ");
Serial.print("Motor Number input ");
while (Serial.available() == 0) {
}
motorNumber = Serial.parseInt();
Serial.println(motorNumber);
Serial.print("Motor Move input ");
while (Serial.available() == 0) {
}
motorMove = Serial.parseInt();
Serial.println(motorMove);
Serial.print("Direction ");
while (Serial.available() == 0) {
}
boolean forward = Dir;
Dir = Serial.parseInt();
Serial.println(Dir);

/* stepper2

Serial.print("Motor 2 Move input ");
while (Serial.available()==0){ }
motorMove2 = Serial.parseInt();
Serial.println(motorMove2);
Serial.print("Direction ");
while (Serial.available()==0){ }
boolean forward2 = Dir2;
Dir2 = Serial.parseInt();
Serial.println(Dir2);
*/

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

}
void loop() {

switch (motorNumber) {
case 1:
command(Dir);

if (stepper1.currentPosition() == motorMove) {
stepper1.stop();
Serial.print(" Stepper 1 TRUE ");
Serial.println(motorMove);

stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();

} else if (stepper1.currentPosition() == -motorMove) {
stepper1.stop();
Serial.print(" Stepper 1 FALSE ");
Serial.println(motorMove);

stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();
}

break;

case 2:
command2(Dir2);
if (stepper2.currentPosition() == motorMove) {
stepper2.stop();
Serial.print(" Stepper 2 TRUE ");
Serial.println(motorMove);

stepper2.disableOutputs();
stepper2.setCurrentPosition(0);
info();

} else if (stepper2.currentPosition() == -motorMove) {
stepper2.stop();
Serial.print("Stepper 2 FALSE ");
Serial.println(motorMove);

stepper2.disableOutputs();
stepper2.setCurrentPosition(0);
info();
}

break;
}

/*
if (stepper1.currentPosition()== motorMove){
stepper1.stop();
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();
}
else if (stepper1.currentPosition()== -motorMove){
stepper1.stop();
stepper1.disableOutputs();
stepper1.setCurrentPosition(0);
info();



*/
stepper1.enableOutputs();
stepper2.enableOutputs();
stepper2.run();

stepper1.run();

}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hulp nodig met AccelStepper

Berichtdoor nicoverduin » 16 Mei 2015, 14:18

Ik weet niet waar jij gedacht had dat je de richting zet voor motor2????
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 16 Mei 2015, 14:33

Ik heb het al opgelost, stepper2 richting ging via Dir2, maar moest zijn Dir. Nog steeds snap ik niet hoe ik ze allemaal tegelijk in 1 case kan proppen. 1motor per keer schiet niet op, maar het werkt wel!

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

Re: Hulp nodig met AccelStepper

Berichtdoor shooter » 16 Mei 2015, 21:35

Allereerst zorg dat in de loop die run commandos staan. dus stepper1.run en stepper2.run
en nergens anders, want dat heeft geen zin en is ook niet slim om parralel te draaien.
de case instructie gebruik je dan om motor1 en motor2 een nieuw commando te geven.
en niet motor.... en motor2.
in de loop schrijf je verder dat als de positie bereikt is de motoren uit mogen, stoppen doen ze toch wel want ze zijn tenslotte op positie.
hier kun je ook voorwaarden zetten zoals als motor1 en motor2 op positie zijn dan volgende stap of iets dergelijks al wat je wil.
dus een beetje structuur, verder ben je goed bezig hoor.
ik snap die for loop niet, en motorpos moet je terugvragen per motor en niet in een for loop werken want dat gaat niet.
je moet alleen de commandos met die case structuur verqwerken, en motor.run regelt zelf of er een motor moet lopen.
paul deelen
shooter@home.nl

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

Re: Hulp nodig met AccelStepper

Berichtdoor hazanovo » 17 Mei 2015, 00:24

Ik heb de code inmiddels klaar. Alle 5 motoren kunnen tegelijk draaien met verschillende posities die je onbeperkt kan sturen via de serial monitor!
De uiteindelijke posities kan ik overschrijven en in een array plaatsen.
Het was een interessante ervaring om het beestje voor het eerst te zien bewegen. Misschien heb ik sommige dingen onlogisch in de code geplaatst(wat jij zei over de for loop), die ga ik morgen weghalen. Het code is een beetje traag, maar het doet z'n werk :D
Voor diegene die het willen uitproberen download de zip je hebt alleen nog Accelstepper.h nodig.
Bijlagen
TeachFunction_2_steppers.rar
(1.3 KiB) 276 keer gedownload

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten