Stappenmotor aansturen met EasyDriver

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 1
Geregistreerd: 24 Nov 2020, 22:36

Stappenmotor aansturen met EasyDriver

Berichtdoor FransStraat » 25 Nov 2020, 22:01

Ben bezig om met 3 of 4 stappenmotoren (NEMA 4), opgebouwd op Fischertechniek, verschillende bewegende creaties, zoals kranen etc. te laten bewegen.
Zelf ben ik 72 jaar, en heb in m'n werkzame leven, veel met stappenmotoren gewerkt, opgebouwd op regelkleppen. (www.rexa.com).
Ik ben bijzonder gecharmeerd door deze motoren, omdat de snelheid, acceleratie, en looptijd, eenvoudig te programmeren is.
2 NEMA 4 motoren heb ik op dit moment aangesloten op een Uno, en stuur ze aan via 2 EasyDrive drivers.
Sketches voor de deze driver heb ik van het internet, van de bouwer van deze driver. Een van deze voorbeelden, is een sketch, om 2 stappers aan te sturen. Alles werkt prima.
Zie onder:

#include <AccelStepper.h>

// Define two steppers and the pins they will use
AccelStepper stepper1(AccelStepper::DRIVER, 9, 8);
AccelStepper stepper2(AccelStepper::DRIVER, 7, 6);

int pos1 = 3600;
int pos2 = 5678;

void setup()
{
stepper1.setMaxSpeed(3000);
stepper1.setAcceleration(1000);
stepper2.setMaxSpeed(2000);
stepper2.setAcceleration(800);
}

void loop()
{
if (stepper1.distanceToGo() == 0)
{
pos1 = -pos1;
stepper1.moveTo(pos1);
}
if (stepper2.distanceToGo() == 0)
{
pos2 = -pos2;
stepper2.moveTo(pos2);
}
stepper1.run();
stepper2.run();
}

Probleem waar ik mee zit, is dat ik de motoren niet in serie kan laten werken. Wat ik wil, is dat ik b.v. motor 1 laat lopen naar pos 1=3600, daarna laat stoppen, en dan motor 2 start, en die b.v. laat lopen naar pos 2=5678. En daarna in omgekeerde richting weer terug.
Van alles geprobeerd, met delay op verschillende plaatsen, echter zonder resultaat. Heeft iemand dit al eens aan de hand gehad, of heeft iemand hier een kant en klare sketch voor liggen?
Al vast bedankt,

Frans

Advertisement

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

Re: Stappenmotor aansturen met EasyDriver

Berichtdoor Koepel » 26 Nov 2020, 01:09

De Arduino loop() wordt heel vaak uitgevoerd, misschien wel duizenden keren per seconde.
Daar maakt de AccelStepper library gebruik van, want de stepper.run() functies doen al het werk.
Zodra een delay() wordt gebruikt, dan hapert de AccelStepper omdat stepper.run() niet wordt uitgevoerd.

Je kunt stepper.distanceToGo() gebruiken of stepper.isRunning()
Omdat je vier verschillende dingen wilt doen, is er een variabele nodig die bijhoudt in welke toestand de sketch is. In het Engels: "state".
Bijvoorbeeld:
state = 0: in rust, doe niets
state = 1: motor 1 loopt
state = 2: motor 2 loopt
state = 3: motor 2 loopt terug
state = 4: motor 1 loopt terug

Het is (voor mij) gemakkelijker om meteen naar een Finite State Machine te gaan: https://majenko.co.uk/blog/finite-state-machine.
Een "Finite State Machine" is een moeilijke naam voor wat ik hierboven al beschreef.

Lijkt je dat wat ?
Zit er bij de voorbeelden van de AccelStepper misschien zo iets ?
Misschien weten anderen een kortere en eenvoudige oplossing.

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

Re: Stappenmotor aansturen met EasyDriver

Berichtdoor shooter » 28 Nov 2020, 20:34

Code: Alles selecteren
{
stepper1.setMaxSpeed(3000);
stepper1.setAcceleration(1000);
stepper2.setMaxSpeed(2000);
stepper2.setAcceleration(800);
}

void loop()
{
if (stepper1.distanceToGo() == 0)
{pos2 = -pos2;
stepper2.moveTo(pos2);

}
if (stepper2.distanceToGo() == 0)
{pos1 = -pos1;
stepper1.moveTo(pos1);

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

om maar een voorbeeld te geven, je kunt dus ook de snelheid aanpassen en de positie, het is zelfs mogelijk om beide motoren (of meer ook tegelijk te laten draaien
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 13 gasten