maandag 7 oktober 2013

Stepper motor 28BYJ-48

This page is written in Dutch. The English version can be foud here.

Wellicht is dit de meest verkochte stappenmotor ter wereld onder de hobbyisten. Daar is maar één enkele, doch zeer goede reden voor: de prijs. Een echte stappenmotor die naam waardig kost al gauw 20€ zonder besturing. Als je die apart moet aanschaffen en de kosten van een degelijke goede voeding rekent, kom je al snel aan 50€.

Het spreekt voor zich dat het voor de meeste toepassingen die in de hobbysfeer zitten niet haalbaar is. Zeker niet als je meer dan één motor nodig hebt. Of als je zoveel plannen hebt dat je best een lot van tien stuks bestelt.



Op AliExpress.com kocht ik hier zo'n lot aan 2,5$ per motor, dat is inclusief het driverbordje.


Een datasheet kan je hier vinden. Dit is wel de 12V versie, maar buiten de spanning is er geen verschil tussen de motoren. Het leuke aan mijn 5V versie is dat ik ze mee op de batterijvoeding kan aansluiten die de microcontroller van spanning voorziet. Er bestaat ook een wiki pagina waar je alle details kan vinden. Die vind je hier

Je kan de motor via het driverbordje aansluiten op een Arduino of eender welke microcontroller. Het driverbordje bevat een ULN2003 chip. Het enige dat die doet is de vier kanalen meer stroom geven omdat een standaard uitgang van de Arduino slechts 40mA kan jeveren. Vier uitgangen van je Arduino sluit je aan op het bordje en die kan je dan één na één onder spanning zetten waardoor de motor één stapje zal maken in één richting. Doe je dit zo'n 500 keer na elkaar (niet exact 500, zie verder), dan heeft de motor één omwenteling gemaakt. Als je de volgorde omkeert, zal de motor in de andere richting draaien. Iets wat op 't eerste zicht erg simpel leek, bleek toch heel wat voeten in de aarde te hebben. Er zijn namelijk enkele manieren om dit soort motor (een unipolaire stappenmotor) te besturen.

Mijn buikgevoel zei dus om het op de manier die ik net beschreef te doen. Dat is wat men in deze tabel wave drive noemt. Voor deze motor is dat heel simpel: het werkt niet! Als de motor al enige moeite deed om te starten, dan gaf hij geen enkele kracht en hij was sowieso nutteloos met deze sturing.

Dan heb ik toch maar de manier gevolgd die in de datasheet staat. Half stepping is de derde in de tabel. Je gaat nu 8 stappen doen in plaats van 4. Het is de meest elegante manier om de motor te laten draaien. Als je even de draadjes A,B,C en D zou benoemen, ga je eerst A activeren, dan A en B samen, dan B, dan B en C samen, enzovoort. Je zal dus de helft van de tijd 2 draden onder spanning zetten en de andere helft van de tijd maar één draad. Omdat er nu acht stapjes zijn, zal de motor niet gemakkelijk schokken en de beweging is heel erg vloeiend. Maar op deze manier haal je niet de maximale kracht (koppel) uit de motor (70%).

Dat kan je wél met de tweede manier uit de tabel. Full stepping wil zeggen dat altijd twee van de vier draadjes onder spanning staan. Nu bereikt de motor zijn maximale koppel.

De vierde manier , Microstepping, vraagt dure elektronica om de motor te besturen, dus daar houden we ons zeker niet mee bezig.

Wat me nu vooral bezighield was toch wel de nauwkeurigheid en het koppel. Niet dat ik zo'n zware objecten in beweging wil zetten, maar de nachtmerrie bij het besturen van een stappenmotor is het feit dat ie stapjes overslaat omdat de belasting te groot is. Je merkt dat niet op het eerste gezicht, maar als je bijvoorbeeld de motor exact 46,7° wil draaien in één bepaalde richting, dan is dat van levensbelang. En de toepassing in mijn hoofd heeft nood aan zo'n nauwkeurigheid. Als dat met een onderdeel van 2,5$ zou kunnen, dan zou ik daar heel erg vrolijk van worden.

Vandaar de volgende testjes. De testjes in het filmpje gaan enkel over half stepping. Ik wou het echte koppel nameten met een test. En ik wou vooral weten met welke snelheid die kracht nog haalbaar is. Als de motor te snel draait, kan hij minder kracht verplaatsen. Dat zijn gegevens die ik nergens in datasheets kon terugvinden. Dit is het resultaat:



Eerst en vooral, en dat was voor mij belangrijk om weten, de motor verbruikt een stroom van rond de 120mA in half stepping. Bij full stepping zal dat in principe 160mA zijn, maar dat heb ik niet getest.

Maar het was hem te doen om de belasting en snelheid. Een koppel van 300 gcm kan je nameten door aan een hefboom op de motor een gewicht van 300g op één centimeter van het midden van de rotor de hangen. Als de motor dat aankan, is ie dus sterk genoeg om dat koppel te leveren. In de praktijk is dat te moeilijk, dus ik neem een hefboom van 10 cm en een gewicht van 30g.

300gcm haalde hij dus makkelijk, bij 350gcm begon de motor te sputteren (hij miste stappen). Dit gebeurde bij een snelheid van 333pps (pulses per second in sommige datasheets) of 3ms tussen de pulsen. Bij deze snelheid duurt één omwenteling 12,6 seconden.

Ik heb de snelheid opgedreven tot 500pps (2ms vertraging tussen de stappen), maar dan kon de motor ook niet meer volgen. De maximale snelheid zonder belasting was bij mij zo'n 800 pps (1,2 ms delay of 5,0 seconden voor één omwenteling). Bij hogere pulsen valt de motor helemaal stil.

Full stepping heb ik buiten beeld ook uitgetest, en het maximum koppel dat ik kon halen was 380gcm bij 333pps (3ms delay). Met deze laatste cijfers haal je dus het meeste kracht uit de motor, maar het is niet de aangeraden manier van besturen. Waarom precies weet ik niet, het staat gewoon zo in de datasheet.

Het aantal stappen per omwenteling is een beetje een mysterie. Ik vond verschillende waarden online terug, maar de testjes die ik deed gaven telkens 508 of 509 aan. Bij 508 haalt ie net geen volledige omwenteling, en 509 is dan weer iets meer dan 360°.

De waarheid ligt dus in 't midden, alleen is het vreemd dat dit niet op een geheel getal uitkomt. Het feit dat er een sterke vertraging ingebouwd zit, heeft er wellicht mee te maken. Er zijn blijkbaar ook verschillende versies van dit motortje te vinden, en de vertraging variëert van model tot model. Hier vond ik een topic dat dit vreemde gedrag aankaart.

Er komt nog een behoorlijk groot probleem bij, en dat is het feit dat ik een speling meet van wel 6° op de rotor. Dat komt natuurlijk door die tandwieltjes en daar kan je weinig aan veranderen. Ik ben van plan om dit softwarematig te omzeilen door slechts in één bepaalde richting te draaien om een juiste positie te bepalen. Als de motor toch een exacte positie moet innemen in de andere richting, laat ik hem eerst 10° terugdraaien om zo telkens in dezelfde draairichting de motor te stoppen.

Je kan hier mijn Arduino code bekijken. Er zijn vier functies voorzien die je kan kiezen in het hoofdprogramma loop() door ze uit commentaar te halen. De standaard functies voor half stepping heten forwards() en backwards(), de full stepping varianten heb ik forwardsFull() en backwardsFull() genoemd.

2 opmerkingen: