Steppermotor en tellen van steps

Arduino specifieke Software
Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Steppermotor en tellen van steps

Berichtdoor snewpers » 14 Nov 2015, 00:00

Hoi
Ik heb bijna alles binnen om eindelijk aan de camera slider te beginnen (ander project zijn ook nog spullen onderweg) en heb ondertussen een poging gedaan om me te verdiepen met steppers. Leek redelijk helder maar het verrast me soms toch nog wel :D

Ik wil bv het aantal steps tellen wanneer ik een motor met buttons links of rechts draai. Ik heb de sketch zo gemaakt dat een var als een counter werkt (++ of --) dat werkt prima want vermeerderen en verminderen gaat prima. Maar wat is het nu precies wat ik zie? Ik heb nu stepper1.move(1); in de loop zitten en uiteraard is dat +1 in de counter, maar hoeveel is dat op de stepper?

Ik heb NEMA17's besteld en die zijn 200 steps per rev, en met de EasyDriver is dat dan * 8, dus 1600 stappen per rotatie. Wil dat dan dadelijk zeggen dat de teller op 1600 staat als ik 1 rotatie heb gedaan? Zo ja, is de Arduino daar snel genoeg voor om bv 9600 (micro)steps of meer per minuut te doen en dit correct in de var op te slaan?

Advertisement

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

Re: Steppermotor en tellen van steps

Berichtdoor shooter » 14 Nov 2015, 21:20

60000 stappen per minuut is geen probleem dus prima.
je hoeft geen teller bij te houden die zit in accelstepper.
en ja je 1600 stappen klopt wel, maar je zult geen verschil zien tussen 8 en 4.
paul deelen
shooter@home.nl

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Steppermotor en tellen van steps

Berichtdoor snewpers » 14 Nov 2015, 23:54

Bedankt!

Ik had begrepen dat er een teller in AccelStepper zit, maar ik moet het aantal stappen weten vanaf een (handmatig) nulpunt waarbij ik met en CW/CCW button de motor naar een ander punt stuur, bv 12 rotaties. Dat aantal stappen moet in een var komen zodat ik de stepper van 0 tot var kan laten gaan. Zover ik begrepen heb houdt de AccelStepper inderdaad het aantal stappen bij maar ik begrijp dan even niet hoe ik die kan uitlezen? Misschien een hint?

Geen verschil tussen 4 en 8 (of zelf standaard, 4 en 8 toch) omdat de snelheid niet anders is, maar ik neem aan dat dat wél belangrijk is als ik bv maar een 1/4 stap per minuut wil uhm... 'steppen'.

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

Re: Steppermotor en tellen van steps

Berichtdoor shooter » 15 Nov 2015, 15:50

currentposition is jouw teller,
eerst ga je naar het nulpunt met move (ik heb daar een microswitch zitten die dan de motor stopt en de position op nul zet.
dan met je drukknop of met een joystick naar de andere kant.
die currentposition zet je in een variabele, de snelheid goed zetten op de rest drukken en het gaat allemaal vanzelf dan.

als je meerdere steppers hebt die synchroon moeten lopen kijk dan naar multistepper.
op een nano heb ik 3 steppers, 3 microswitches, 3 uitgangen, een achteruitrijpieper, een vrijgave voor bewegen, een signaal klaar met bewegen een leddisplay met drukknoppen en nog niet alles gebruikt.
paul deelen
shooter@home.nl

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Steppermotor en tellen van steps

Berichtdoor snewpers » 15 Nov 2015, 23:50

Nice!

De currentposition (vanaf 0) dus in een var zetten en dan moveto(var) om van 0 naar einde te gaan... helder! Soms denk ik te moeilijk. Dit is nog steeds voor m'n cameraslider (timelapse). Ik heb nu een menu klaar voor twee motoren met 0 punt en teller. Die teller ga ik dus vervangen door de currentposition en niet als een loop van Steps++ en dan per step move(1). Al komt het wel op hetzelfde neer denk ik?

Ik heb aardig wat pins vol zitten op m'n uno. 2 keer een leverswitch om begin/einde te registreren, 4 voor twee EasyDrivers, 2 voor de LCD, 3 voor start, mode en setknop en 4 L-R / CW-CCW knoppen... 15 nu dus... hehe zelfs nog ruimte voor een LED of 2 :)

Thanks!

ps. joystick is natuurlijk ook gaaf... maar dat is dan voor V2 :)

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Steppermotor en tellen van steps

Berichtdoor snewpers » 25 Nov 2015, 15:21

Vervolgvraag... Ik kan niet vooruit omdat de EasyDrivers te licht zijn voor de motoren welke ik wilde hebben dus nu andere onderweg.

Maar mijn vraag is eigenlijk de onderstaande code goed gaat lopen?

cpp code
void loop() {

... meer code hier, vars en init van buttons etc...

// ### OPNAMES STARTEN :)
if(StartState == LOW && ModeWaarde==0 && Programm==0) // Begin met opnemen
{lcd.clear();lcd.setCursor(0,0); lcd.print("Start TimeLapse");
// stepper snelheden instellen voor *snel* naar 0-positie
stepper1.setSpeed(1000);stepper2.setSpeed(1000); stepper1.setAcceleration(100);stepper2.setAcceleration(100);
// beide steppers naar 0 positie
stepper1.moveTo(S1Startpos);stepper2.moveTo(S2Startpos);
// snelheden instellen voor echte opnames...
stepper1.setSpeed(SelectSpeed); // gekozen snelheid gebruiken
stepper2.setSpeed(S1Eindpos/S2Eindpos); // totale afstand in steps delen door stappen voor rotaie.
stepper3.setSpeed(TijdTussenShots*SelectSpeed); // [OPTO] tijdtussenshots [8] * stappenPerseconde [2] = 16 stappen
// Nu rustig aan stappen maar.... hoop ik
stepper1.moveTo(S1Eindpos);
stepper2.moveTo(S2Eindpos);
stepper3.moveTo(S1Eindpos);

lcd.clear();return;}


stepper1.run();stepper2.run();stepper3.run();

} // einde functies




Dit staat in de void loop. Maar ik vraag me eigenlijk af AccelStepper zelf zorgt voor de +1 in steps of dat ik een FOR statement moet maken voor het optellen. Ik *dacht* van niet omdat ik de motoren een x aantal stappen (eindpositie) laat bewegen. Ik kan het helaas niet testen omdat ik de drivers en motoren nog niet heb, maar aangezien dit code is weer iemand wellicht of ik iets overheen hoofd zie...

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Steppermotor en tellen van steps

Berichtdoor snewpers » 26 Nov 2015, 17:52

Ik kan de vorige post niet meer bewerken zie ik, dus dan maar hier... Volgens mij kan wat er in de vorige post niet omdat er niets is wat de laatste IF zou uitvoeren nadat de StartState button is gedrukt. Is geen schakelaar maar een button dus die IF zou maar één of enkele keren gedaan worden. Ik heb nu een var gebruikt met waarde 1 of 0 om aan te geven dat de slider mag bewegen. Ik gebruik het Blink without delay principe om niet te blocken zodat er een 'annuleer' knopje kan worden toegevoegd.

Het compileert allemaal foutloos, maar zou iemand willen kijken of het ook wel klopt? Het is een behoorlijk lange sketch (voor een n00b) dus ik heb alleen het stukje er in gezet waar het om gaat.

cpp code
//  ### OPNAMES STARTEN :)
if(StartState == LOW && StartWaarde==0 && ModeWaarde==0 && Programm==0) // Alles standy, dus starten met sequence...
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Start TimeLapse ");
StartWaarde=1;
delay(1500);
} // Start begonnen... blink without delay is next...


// ### Programma uitvoeren met interval... dus nog een keer op start drukken (ofzo) is stoppen.
unsigned long currentMillis = millis();
if(((currentMillis - previousMillis) >= interval) && StartWaarde==1) // routine van 1000ms, maar alleen als start ook 1 is!
{
previousMillis = currentMillis;
// stepper snelheden instellen voor *snel* naar 0-positie
stepper1.setSpeed(1000);
stepper2.setSpeed(500);
stepper1.setAcceleration(100);
stepper2.setAcceleration(100);
// beide steppers naar 0 positie
stepper1.moveTo(S1Startpos);
stepper2.moveTo(S2Startpos);
// snelheden instellen voor echte opnames...
stepper1.setSpeed(SelectSpeed); // gekozen snelheid gebruiken
stepper2.setSpeed(S1Eindpos/S2Eindpos); // totale afstand in steps delen door stappen voor rotatie.
stepper3.setSpeed(TijdTussenShots*SelectSpeed); // [OPTO] tijdtussenshots [8] * stappenPerseconde [2] = 16
// Nu rustig aan stappen maar.... hoop ik
stepper1.moveTo(S1Eindpos);
stepper2.moveTo(S2Eindpos);
stepper3.moveTo(S1Eindpos);
stepper1.run();
stepper2.run();
stepper3.run();}

// ### OPNAMES STOPPEN :)
if(StartState == LOW && StartWaarde==1 && ModeWaarde==0 && Programm==0) // Nu stoppen met opnames!
// nog toevoegen dat ook de eind-switches de dolly kunnen stoppen!
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Stop TimeLapse ");
StartWaarde=0;delay(1500);
} // Doorgaan geannuleerd


Thanks!

@aangepast door Nico Verduin
Ik weet dat schermruimte duur is, maar je mag wat meer lucht zetten tussen de statements. Oftewel 1 (een) statement per regel. Zo ook voor de open en sluit accolades. En zet de open en sluit op dezelfde afstand van de kant lijn. Je kan dan ook beter controleren of het nog wel klopt. Tenslotte heb ik wat extra haakjes gezet in een de if statement waar je millis aftest. Door gebruik van haakjes geef je duidelijk aan wat eerst gedaan moet worden. Net als wiskunde/rekenen vroeger.

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

Re: Steppermotor en tellen van steps

Berichtdoor shooter » 26 Nov 2015, 20:52

Doe in een aparte functie de code schrijven om naar de startpositie te gaan.
in die routine dus lopen tot de schakelaar bedient is.
dan is stappen zetten tot de schakelaar weer vrij is, dat is je nulpositie.
dan wachten op een startcommando in de loop
die dan dus weer naar een andere functie springt om te beginnen met de opname.
deel het geheel op in functies dan kun je makkelijker foutzoeken en kun je zien wat er fout gaat.

probeer elke functie ook de loop etc op een pagina te houden en als het langer wordt, dan opdelen in functies.
paul deelen
shooter@home.nl

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

Re: Steppermotor en tellen van steps

Berichtdoor nicoverduin » 26 Nov 2015, 21:20

Ter aanvulling, maar je niet eerst de move tot 0 aflopen en dan pas weer naar de nieuwe positie gaan? Nu ga je eerst naar nul. daarna naar een andere positie en daarna pas voer je de run uit.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Steppermotor en tellen van steps

Berichtdoor snewpers » 26 Nov 2015, 22:19

bedankt Nico en Paul :)

ik heb eind-schakelaars toegevoegd welke het einde van de track aangeven, maar dat is alleen geldig voor het slide gedeelte. De rotatie is onbeperkt, maar zal in praktijk niet over 180° gaan. Wat ik nu heb gedaan is een (handmatig) beginpunt instellen voor beide motoren, dus niet persé het begin van de track en de rotatie-stepper kan dan bv op 30° staan. Dan de slider verplaatsen naar een eindpunt en ook de rotatie aanpassen. Dan gaat de slider over bv 10000 stappen van rechts naar links en de camera gaat bv 45° roteren over de gehele loopafstand. Dat is eigenlijk de reden waarom ik motoren terug laat gaan naarste nulpunt.

Het deel van de code wat hier staat heeft dus al een handmatig begin en eindpunt voor beide motoren maar moet eerst terug naar het begin om te kunnen starten. Vandaar ook dat ik ze beide 'snel' naar nul laat gaan om ze vervolgens de juiste routine te laten doen.

Als ik de volledige track steeds zou gebruiken dan is het gebruiken van de eind-switches veel logischer, maar dat is niet altijd het geval. De track krijgt (als alles goed gaat) een lengte van 3 meter :)

Thanks!

edit: Nico, ik ga eerst (snel) naar de startposities die ik eerder al had ingegeven, en dan gaan de motoren met de juiste snelheid naar de eindposities. Of zie ik iets over het hoofd nu?

Heb even een filmpje gemaakt... maakt het wellicht iets duidelijker... http://racezone.nl/SAMPLE/sample.m4v

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 81 gasten