Accelstepper.h gebruiken om 2 stepper motoren aan te sturen

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 2
Geregistreerd: 06 Mrt 2018, 00:28

Accelstepper.h gebruiken om 2 stepper motoren aan te sturen

Berichtdoor Kumalix » 06 Mrt 2018, 00:47

Hi,

Ik ben druk bezig met het bouwen van een machine zoals in de schets hieronder.
Hij is hardware matig al bijna zover.
Ook software matig. Alleen ben ik nog eea aan het fijn tunen en stuit ik tegen problemen aan die ik zelf niet meer kan oplossen.

Nu kom ik dus tegen het volgende probleem aan over dit stukje code (uit de hele code):
if (startButtonState == 0 && homePin2StateA == 1 && crashButtonPressed == false)
{
digitalWrite(enableL, LOW);
stepperL.setMaxSpeed(250);
stepperL.setAcceleration(100);
stepperL.moveTo(1300); //set to 1300
//stepperL.setSpeed(250);


if (stepperL.distanceToGo() == 0)
{ stepperL.setMaxSpeed(100);
stepperL.setAcceleration(200);
stepperL.moveTo(2380); //set to 2380
}
}
stepperL.run();

Ik wil ervoor zorgen dat de stepperL onderweg naar positie (1300) snelheid heeft van (250) en acceleratie van (100).
Wanneer de stepper op positie (1300) is (of in de buurt), moet hij niet stoppen, maar zijn snelheid verlagen naar (100) en acceleratie naar (200) en vervolgens met die criteria doorgaan naar positie (2380).
Terwijl de stepper bezig is aan zijn verlaagde snelheid run zal deze worden onderbroken door een switch. Elke keer als de switch wordt ingedrukt zal de stepper abrupt moeten stoppen om vervolgens weer langzaam met acceleratie door te gaan.
Alleen krijg ik dit dus niet voor elkaar met de bovenstaande code. De stepper blijft in de zelfde lage snelheid lopen.

Hopelijk kan iemand me helpen.Ik heb al vele obstakels genomen maar deze lukt me niet alleen.

Alvast bedankt
N


De gehele code:
[code]//DRV8825 VREF voltage NEMA 17= 0,65V can be 0.8V
//DRV8825 VREF voltage NEMA 23= 0,6AV can be 0.6V
#include <AccelStepper.h>

//NEMA 17 (Actuator)
AccelStepper stepperA(AccelStepper::DRIVER, 3, 4); // (DRIVER, Step, Directon)
int enableA = 2;

//NEMA 23 (Linear motion)
AccelStepper stepperL(AccelStepper::DRIVER, 7, 8); // (DRIVER, Step, Directon)
int enableL = 11;
//_____________________________________________________________
unsigned long currentMillis;
unsigned long endFirstRunMillis;
const long interval = 2000;
enum motorStateENUM {
WAITING,
FIRSTRUN,
BETWEENRUNS,
SECONDRUN,
SECONDRUNDONE,
THIRDRUN,
FINISHED,
};
motorStateENUM motorState = WAITING;
//_______________________________________________________________
//productCrashPin
const int crashPin1 = 6;
int crashPin1State;
boolean crashButtonPressed = false;

//ACTUATOR
const int homePinA = 10;
int homePin2StateA;


//STARTBUTTON
const int startButton = 9;
int startButtonState = 0; //1 = open->not pressed
//STRATBUTTON TOGGLE
int startButtonReading; // the current reading from the input pin
int previouStartButtonReading = 0; // the previous reading from the input pin

//LINEAR MOTION MOTOR
const int homePinL = 5;
int homePinStateL;

boolean atStartPosition = false;

void setup() {//================================================================
stepperA.setMaxSpeed(2500);
stepperA.setAcceleration(15000);
pinMode(crashPin1, INPUT_PULLUP);
pinMode(startButton, INPUT_PULLUP);
pinMode(homePinA, INPUT_PULLUP);
pinMode(homePinL, INPUT_PULLUP);
pinMode(enableA, OUTPUT);
pinMode(enableL, OUTPUT);
//digitalWrite(enableA, HIGH);
// digitalWrite(enableL, HIGH);
Serial.begin(115200);
delay(200);

///////////////////////////STEPPERS GET BACK TO START POSITION\\\\\\\\\\\\\\\\\\\\\\

while (atStartPosition == false)
{
homePin2StateA = digitalRead(10);
homePinStateL = digitalRead(homePinL);
//_______________________________\\

if (homePin2StateA == 0 ) // 0 = not at his start position - 1 = at his position
{ //Serial.println (homePin2StateA);
digitalWrite(enableA, LOW);
stepperA.setSpeed(-1900); //set to -1900
stepperA.runSpeed();
}
if (homePin2StateA == 1)
{
stepperA.setCurrentPosition(0);
}


if (homePinStateL == 1 )
{ digitalWrite(enableL, LOW);
stepperL.setMaxSpeed(250);
stepperL.setAcceleration(300);
stepperL.moveTo(-2500);
stepperL.run();
}
if (homePinStateL == 0 )
{
stepperL.setCurrentPosition(0);
}

if (stepperA.currentPosition() == 0 and stepperL.currentPosition() == 0 )
{
(atStartPosition = false);
delay(200);
digitalWrite(enableA, HIGH);
digitalWrite(enableL, HIGH);
break;
}

}
///////////////////////////STEPPERS AT START POSITION////////////////////////////////

}
void loop() {//=========================================================
//Serial.println (homePin2StateA);
//Serial.println (digitalRead(startButton));
crashPin1State = digitalRead(crashPin1);
homePin2StateA = digitalRead(10);



if (crashPin1State == 0) {
crashButtonPressed = true;
}
////////////////////////////////////////////////////////////////////////
startButtonReading = digitalRead(startButton);
if (startButtonReading == 1 && previouStartButtonReading == 0)
{ if (startButtonState == 1)
startButtonState = 0;
else
startButtonState = 1;
}
/////////////////////////////////////////////////////////////////////////


if (startButtonState == 0 && homePin2StateA == 1 && crashButtonPressed == false)
{
digitalWrite(enableL, LOW);
stepperL.setMaxSpeed(250);
stepperL.setAcceleration(100);
stepperL.moveTo(1300); //set to 1300
//stepperL.setSpeed(250);


if (stepperL.distanceToGo() == 0)
{ stepperL.setMaxSpeed(100);
stepperL.setAcceleration(200);
stepperL.moveTo(2380); //set to 2380
}
}
stepperL.run();


if (startButtonState == 0 and crashButtonPressed == true)
{ digitalWrite(enableL, HIGH);
digitalWrite(enableA, LOW);

// Serial.print(" Crash Pin1 state voor While = ");Serial.println (crashButtonPressed);


while (crashButtonPressed == true)
{
currentMillis = millis();

//Serial.print(" Crash Pin1 state in the While = ");Serial.println (crashButtonPressed);

if (motorState == WAITING) {
stepperA.moveTo(4000); // set to 4500
//stepperA.setSpeed(2000);
motorState = FIRSTRUN;
//Serial.println("first run");
}

if (motorState == BETWEENRUNS) {
if (currentMillis - endFirstRunMillis >= interval)
{
// Serial.println("second run");
//stepperA.setMaxSpeed(2800);
//stepperA.setAcceleration(15000);
//stepperA.setSpeed(2800);
stepperA.moveTo(8000); // set to 9000
motorState = SECONDRUN;
}
}

if (motorState == SECONDRUNDONE) {
//Serial.println("second run done");
stepperA.moveTo(0);
motorState = THIRDRUN;
}

if (stepperA.distanceToGo() == 0 ) {
if (motorState == FIRSTRUN) {
endFirstRunMillis = currentMillis;
motorState = BETWEENRUNS;
//Serial.println("between runs");
}

if (motorState == SECONDRUN) {
motorState = SECONDRUNDONE;
//Serial.println("at the end");
}

if (motorState == THIRDRUN) {
motorState = WAITING;

//Serial.println("finished");
crashButtonPressed = false;
digitalWrite(enableA, HIGH);

}
}

// stepperA.runSpeed();
stepperA.run();

}
}


previouStartButtonReading = startButtonReading;
}
[/code]
Bijlagen
2018-03-03 16.59.33.jpg
2018-03-03 16.59.33.jpg (15.18 KiB) 6887 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Accelstepper.h gebruiken om 2 stepper motoren aan te stu

Berichtdoor Koepel » 06 Mrt 2018, 01:07

Kun je een link geven naar de AccelStepper library die jij gebruikt ?
Er is maar één origineel en vele kopieën/afgeleidden.

Die library heeft als basis het aantal stappen. Dus ik neem aan dat je de snelheid en acceleratie kunt wijzigen terwijl hij bezig is.

Normaal gesproken geef je een positie op waar hij naar toe moet gaan. De uiteindelijke positie is 2380. Volgens mij geeft je dat eenmalig als eindpositie op. Vervolgens kun je de positie opvragen met stepper.currentPosition(), en als je die groter of gelijk aan 1300 is dan eenmalig de snelheid en acceleratie wijzigen.

Je kunt niet testen op 1300, want precies die ene stap zie je misschien niet, en misschien wordt die ene stap meerdere keren terug gegeven. Daarom kun je een variabele toevoegen om te onthouden of je de snelheid en acceleratie al hebt aangepast.

Er zal best iemand zijn die AccelStepper gebruikt om de snelheid uit een tabel te halen en die runtime te wijzigen terwijl de stappenmotor bezig is. Helaas kan ik zo iets niet vinden.

Wat dacht je van een finite state machine ? https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine/

Berichten: 2
Geregistreerd: 06 Mrt 2018, 00:28

Re: Accelstepper.h gebruiken om 2 stepper motoren aan te stu

Berichtdoor Kumalix » 06 Mrt 2018, 01:24

hi, dank voor de uitleg. dat is idd iets waar ik naar toe moet.
Dit is de link: http://www.airspayce.com/mikem/arduino/ ... f995ba4fb4

Hoop dat je me iets verder kunt helpen..
Alvast bedankt

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Accelstepper.h gebruiken om 2 stepper motoren aan te stu

Berichtdoor Koepel » 06 Mrt 2018, 10:10

Dat is de goede site voor AccelStepper.

Begrijp je mijn uitleg ?
Heb je gekeken naar de finite state machine ?

Ik heb wat moeite om even snel je code te doorgronden.
Je gebruikt bijvoorbeeld de 'crashButtonPressed' niet alleen om te kijken of die knop is ingedrukt, maar ook als een 'state' om je programma een bepaalde richting op te sturen. Dan gaan er dingen door elkaar lopen.
Daardoor zie ik teveel spaghetti voor me, en het lukt me niet om je sketch te fijn tunen. Wanneer ik probeer om je sketch met een paar kleine wijzigingen aan te passen dan gaan er teveel dingen door elkaar lopen.
Om de kijken naar 'stepper.currentPosition()' is het nodig om te weten of de stappenmotor bezig is met die 1300 en 2380. Om dat te weten is het nodig de sketch te wijzigen. Mijn voorstel is om de onderliggende structuur duidelijker te maken.

Kun je de beweging naar 1300 en 2380 bij 'motorState' onderbrengen ? Of zijn dat verschillende dingen ?
Als dat verschillende dingen zijn, dan komt er een state bij. Een state die aangeeft in welke fase het zich bevindt (stil staan of snel tot 1300 of langzaam tot 2380).

Het eerste deel van de loop() is goed. Lees daar alle knoppen en zet die in variabelen om later te gebruiken.
Zou je ook de "previouStartButtonReading = startButtonReading;" daarbij willen zetten ? Dan staat dat allemaal netjes bij elkaar. Die regel staat nu eenzaam onderin de loop().

Het middelste deel van loop() met de beweging naar 1300 en 2380 onderbrengen in een finite state machine.

Het laatste deel in de loop() kan volgens mij dan ook ondergebracht worden in diezelfde finite state machine.


Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten