Tässä osassa käytetään Arduino-seteistä usein löytyvää 5 voltin askelmoottoria 28BYJ-48 sekä ohjauspiiriä ULN2003.
Askelmoottoreita löytyy useimmiten esimerkiksi paperitulostimista, 3D-tulostimista, CNC-koneista, roboteista sekä erilaisista teollisuuden ja automaation sovelluksista. Askelmoottorin hienous on siinä, että sitä on suhteellisen yksinkertainen ohjata ja se liikkuu tarkasti haluttuun asentoon ilman lisäantureita. Askelmoottori myös pitää itsensä paikallaan silloin, kun siihen ohjataan virtaa, mutta sitä ei ajeta/askelleta.
Askelmoottoria ohjataankin yleensä open-loop periaatteella, joka tarkoittaa sitä, että askelmoottorin ottamien askelien määrää ei varmisteta esimerkiksi enkooderilla tai potentiometrillä tai jollakin muulla tavalla. Toisin sanoen, open-loop ohjaimessa ei voida aina olla varmoja siitä, että moottori liikkui halutun matkan verran.
Mikäli askelmoottori ei saa liikkua tietämättä, tarvitsee moottorinohjain takaisinkytkennän, minkä avulla liikkeen määrä voidaan selvittää. Tällä kertaa jätämme kuitenkin pois takaisinkytkennän ja keskitymme ohjaamaan askelmoottoria em. open-loop -periaatteella.
Ennen itse asiaa pari sanaa askelmoottorista ja sen ohjauksesta.
Askelmoottorin 28BYJ-48 tiedot
Alla olevasta kuvasta poiketen käytetty moottori on 5V DC merkinnällä varustettu muuten samanlainen moottori.
Kun tarkastellaan moottorin datoja hieman tarkemmin, huomataan että kohdassa "Speed Variation Ratio" on merkintä 1/64 (kuva alla). Tämä tarkoittaa sitä, että moottorirungosta ulos tuleva akseli ei ole suorassa yhteydessä itse moottoriin, vaan moottorin tuottama voima välittyy hammasrattaiden avulla pyörivälle akselille.
Tätä menetelmää kutsutaan välitykseksi tai vaihteistoksi ja oikeampi termi tämänkaltaiselle moottorille olisikin vaihteistoaskelmoottori. No olipa nimi mikä hyvänsä, niin 1/64 välitys tarkoittaa sitä, että kun vaihteistomoottorin sisällä oleva moottori pyörii 64 kierrosta, niin rungosta ulos tuleva akseli pyörii yhden kerran - ja sama toisinpäin. Moottorin suhdeluku akseliin nähden on siis 64.
Vaihteistolla moottorista saadaan enemmän vääntöä, vaikka hyötysuhde hieman laskeekin, mutta toisaalta vaihteistojen avulla ei tarvitse käyttää niin suuria moottoreita ja ovat näin ollen halvempia.
Moottorin voima
Datoista huomataan, että moottori jaksaa vetää 300 "gram-force / centimeter" yksikköä. Tämä tarkoittaa suomeksi sanottuna sitä, että senttimetrin pituisella varrella moottori jaksaa nostaa 300 grammaa.
Kun yksikkö muutetaan SI-järjestelmän mukaiseksi, saadaan 0.02942 N/m (Newton metriä) tai 2.942 N/cm (Newton senttimetriä). (Muunnoksen voi tehdä esim. osoitteessa: http://www.convert-me.com/en/convert/torque/gfcm.html).
Newton (N) on voiman yksikkö ja moottoreissa usein käytetty merkintä N/cm tarkoittaa sitä, että kyseinen moottori jaksaa tuottaa senttimetrin pituisella varrella 2.942 Newtonin voiman. Kun tämän muuttaa grammoiksi tai kiloiksi, saadaan jo mainittu 300 g tai 0,3 kg.
Moottorin askeleet
Kohdasta "Stride Angle" nähdään merkintä 5,625°/64. Tämä tarkoittaa sitä, että moottorin jokainen askel on 5,625 astetta. Moottori tarvitsee siis 64 askelta pyörähtääkseen yhden kerran, koska ympyrän asteluku on 360° ja 360/5,625 = 64. MUTTA tämä ei vielä tarkoita, että moottorin rungosta ulostuleva askel olisi pyörähtänyt yhden kierroksen. Jos muistat, niin moottorin pitää pyöriä 64 kierrosta, jotta akseli pyörähtää yhden kierroksen niin askelia tarvitaankin 64 x 64 = 4096.
Ehkä hieman sekavasti selitetty, mutta alla olevat kaavat auttavat selvittämään moottorin tarvitsemat askeleet yhden akselin kierrosta varten:
Moottorin askeleet (per kierros) = 360° / 5,625° = 64
Stepperimoottorin askeleet = Moottorin askeleet • Moottorin suhdeluku akseliin = 64 • 64 = 4096.
Luku 4096 pätee silloin, kun askelmoottoria ohjataan 8:n askeleen moodissa, joten jos ohjaus on 4-askelinen, niin luku on tietenkin puolet 4096:sta eli 2048.
Nyt kun tiedossa on montako askelta tarvitaan, että moottorin akseli pyörähtää yhden kerran, voidaan tutkia kuinka askelmoottoria pitää ohjata, siispä eteenpäin.
Askelmoottorin ohjaaminen
Askelmoottori (tai steppimoottori, engl. "stepper" tai "step motor"), on DC-ohjattu moottori jonka pyörimisnopeutta ja -määrää voidaan ohjata. Moottori toimii askeltaen, eli moottorin rotaattori tai akseli pyörähtää pienen matkan kun sen käämit energisoidaan. Moottorin pyörimä askellus ilmaistaan asteina per askel ja esimerkiksi 3D-tulostimissa käytetyissä NEMA 17 moottoreissa askellus on 1,8 astetta/askel kun taas tässä esimerkissä käytetty moottori on eri asteluvulla kääntyvä. Kannattaakin aina tarkistaa, millaista moottoria olet ohjaamassa.
Moottorissa on useampia käämejä eli keloja, joiden avulla moottorin sisälle saadaan aikaiseksi magneettikenttä, joka puolestaan pyörittää moottoria. Kun näitä keloja/käämejä energisoidaan vuorotellen, saadaan moottori pyörimään haluttuun suuntaan sen verran kun tarvitsee. Alla oleva animaatio selkeyttää hienosti askelmoottorin toimintaperiaatetta:
Askelmoottorin... askeleet?
Moottorin pyörimisnopeutta ja suuntaa voidaan säätää askelmoottoriohjaimella, joka voidaan rakentaa erillisistä transistoreista tai käyttää jotakin moottorin ohjaamiseen tarkoitettua piiriä. Askelmoottorin ohjaamisessa on tärkeää energisoida moottorin käämit eli kelat oikeassa järjestyksessä ja tästä juontuukin termi askellus.
Yleisesti ottaen käytetään joko 4-askeleen tai 8-askeleen tai jopa 16-askeleen ohjaussekvenssiä. Ohjaussekvenssi voidaan toteuttaa ohjelmallisesti tai siitä voi huolehtia erillinen piiri tai järjestelmä.
Kun moottoria halutaan pyörittää johonkin suuntaan, täytyy moottoria askeltaa alla olevan taulukon esittämällä tavalla.
Ajurin LED | Moottorin johdin | Väri | Askel 1 | Askel 2 | Askel 3 | Askel 4 | Askel 5 | Askel 6 | Askel 7 | Askel 8 |
---|---|---|---|---|---|---|---|---|---|---|
4-askellusta | 1 | 2 | 3 | 4 | ||||||
8-askellusta | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
+++ | 5 | pun. | + | + | + | + | + | + | + | + |
D | 4 | oranssi | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
C | 3 | kelt. | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
B | 2 | v.pun. | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
A | 1 | sininen | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
Taulukkoa luetaan niin, että kun käytetään 4-askeleen ohjausta, niin askelkuvio on:
AB - BC - CD - AD
Olen korostanut taulukkoon punaisella 4-askeleen moodin. Numerot tarkoittavat siis sitä, missä järjestyksessä moottorin kelat ohjataan päälle ja pois. 1 on luonnollisesti päällä ja 0 pois päältä. Kun katsot ylempänä olevaa animaatiota yhdessä taulukon kanssa, niin voit huomata kuinka kelat ohjataan päälle ja pois vuorotellen taulukon mukaisessa järjestyksessä.
ULN2003 ohjauspiirin kytkentä
Ohjainpiiri ULN2003 on hyvin yleisesti käytössä oleva darlington-transistoriohjain. Ohjain koostuu seitsemästä NPN-transistoriparista (kanavasta) ja kunkin kanavan läpi voidaan ohjata 0,5 A virtaa. Kanavia voidaan yhdistellä esimerkiksi niin, että saadaan 1,5A virtaa kuljetettua piirin läpi, kun tarpeeksi monta kanavaa kytketään rinnakkain. Tällöin tulee kuitenkin ottaa huomioon komponentissa syntyvä tehohäviö, elikkäs maallisemmin sanottuna hukkalämpö, ettei piiri ylikuumene. Toisin sanoen kanavien rinnakkainkytkentä saattaa tarvita jäähdytyksen ULN2003-piirille.
Kukin lähtö sisältää ns. clamp-diodin, eli diodin joka suojaa ohjainpiirejä korkeilta jännitteiltä moottorin ohjauksen aikana. Ilman clamp-diodeja ne täytyisi ulkoisesti lisätä piirin suojaksi, mutta nyt niitä ei tarvita.
Piiri kestää myös varsin korkeita käyttöjännitteitä, jopa 50 volttia. Tässä tapauksessa käytämmekin kuitenkin vain 5:n voltin jännitelähdettä, sillä moottori on tehty 5 voltin jännitteelle.
Piirin COM-nasta kytketään moottorin käyttöjännitteeseen ja E-nasta kytketään maahan. Neljä input-nastaa 1B-4B kytketään Arduinolle ja moottorille kytketään johtimet alla olevan kuvan mukaisesti.
Kytkentäkaaviona moottorin kytkentä on kuvassa alla (kuvaa klikkaamalla se aukeaa suuremmaksi):
Arduinon koodi
Kun kytkentä on tehty, voidaan ohjauskoodi kirjoittaa. Aluksi ohjelmaan luodaan pari vakiota määrittelemään aiemmin lasketut moottorin askeleet. Sen jälkeen alustetaan moottoriohjain hyödyntämällä stepperi-kirjastoa. Kirjaston voit ottaa käyttöön valikosta Sketch -> Include Library -> Stepper, kuten kuvassa alla:
Ohjelma pyörittelee moottoria 90 asteen kulmassa edestakaisin, joten kyseessä on varsin yksinkertainen sovellus. Voit muokata ja leikkiä koodilla haluamallasi tavalla.
#include <Stepper.h> #define MOOTTORIN_ASKELEET 64 #define MOOTTORIN_SUHDELUKU 64 #define STEPPERIMOOTTORIN_ASKELEET MOOTTORIN_ASKELEET * MOOTTORIN_SUHDELUKU // Luodaan stepperi, huomaa numerojärjestys! Stepper munStepperi(STEPPERIMOOTTORIN_ASKELEET,8,10,9,11); int askeleet = 4096 / 8; // Stepper-kirjasto käyttää 4-step askellusta, // joten 2048 on kokonainen kierros 1024 puolikas jne. signed int suunta = 0; void setup() { // Alustetaan sarjaportti Serial.begin(115200); Serial.print("Stepperin askeleet ="); Serial.println(STEPPERIMOOTTORIN_ASKELEET,DEC); munStepperi.setSpeed(50); } void loop() { while(askeleet > 0) { askeleet--; if(suunta == 0) { munStepperi.step(1); } else { munStepperi.step(-1); } delay(4); } delay(1000); askeleet = 4096 / 8; if(suunta == 0) { suunta = -1; Serial.println("Taakse..."); } else { suunta = 0; Serial.println("Eteen..."); } }
Loppuun vielä kuva kytkennästä:
Ongelmia ja havaintoja
Mikäli askelmoottori ei liiku laisinkaan, mutta eräänlainen surina siitä kuuluu, niin tarkista että johtimien kytkennät ovat oikein.
Lisäksi kannattaa tarkistaa, että stepperin luomiskoodissa (konstruktorissa) on pinnien numerojärjestys oikein. Mikäli ne ovat väärin, ei stepperin sekvensointi onnistu oikealla tavalla ja moottori liikkuu oudosti tai ei liiku ollenkaan tai liikkuu vain yhteen suuntaan.
Seuraava osa: servomoottorin ohjaus.
Lähteitä ja linkkivinkkejä:
http://www.prenta.fi/shop/
https://en.wikipedia.org/wiki/Stepper_motor
https://fi.wikipedia.org/wiki/Askelmoottori
http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/
https://arduino-info.wikispaces.com/SmallSteppers
https://learn.adafruit.com/adafruit-arduino-lesson-16-stepper-motors/arduino-code
http://cyaninfinite.com/tutorials/moving-the-28byj-48-stepper-motor/