6 minute read

Shield-B, razvojna pločica za Arduino Uno (7)

Next Article
Mali Ivica

Mali Ivica

U ovom ćemo nastavku upoznati koračne motore, pokazati kako ih možemo spojiti na razvojni sustav Shield-B i napisati programe Bascom-AVR i Arduino kojima ćemo ih pokrenuti. Koračni motori ne okreću se kontinuirano, nego skokovito (u “koracima”) i mogu se zaustaviti samo u određenim položajima. Ako su ti koraci dovoljno kratki, koračni ćemo motor moći vrlo precizno zakrenuti za željeni kut, što i je njegova najvažnija osobina.

Usporedite li bilo koje dvije susjedne skice u horizontalnom nizu na Slici 21., primijetit ćete kako se rotor među njima zakrenuo za 90°. Za takav motor kažemo da ima korak od 90°. Isti motor možemo učiniti dvostruko preciznijim ako ga pokrećemo polukorakom (Slika 22.): ovdje rotor naizmjenično privlače jedan statorski elektromagnet pa dva susjedna, zbog čega je korak prepolovljen na 45°. U oba slučaja korake ne smijemo preskakati, jer ćemo samo tako osigurati pouzdano upravljanje radom motora!

Advertisement

Slika 21. prikazuje unutrašnjost jednostavnog unipolarnog koračnog motora, koji se sastoji od permanentnog magneta (rotora) i četiri elektromagneta (statora). Rotor se zakreće prema onim polovima statora koji su u određenom trenutku magnetizirani. To može biti samo jedan pol, ili po dva susjedna, kako smo prikazali na slici. U gornjem redu prikazan je potreban redoslijed uključivanja statorskih elektromagneta kako bi se rotor zakretao u smjeru kazaljke na satu. U donjem redu prikazan je potreban redoslijed uključivanja statorskih elektromagneta kako bi se rotor zakretao u smjeru suprotnom od kretanja kazaljke na satu.

Za većinu primjena treba nam preciznija kontrola pomaka pa se koračni motori u praksi izvode s većim brojem statorskih namotaja od prikazanog, a korak im iznosi desetak ili manje stupnjeva. Dodatno se korak može smanjiti primjenom zupčanog ili pužnog prijenosa.

Fotografija na Slici 23. prikazuje dva takva motora: koračni motor s pužnim prijenosom izvađen je iz disketnog pogona osobnog računala, u kojem je korišten za precizno postavljanje glava za čitanje/pisanje, dok je na donjoj fotografiji prikazan 28BYJ-48, koji ćemo mi koristiti. 28BYJ48 ima 32 statora i, sukladno tome, potrebna su

32 koraka za puni krug osovine motora, koristimo li pomak s punim korakom. Dodatno, u motor je ugrađen zupčani prijenos prijenosnog omjera 64:1 pa će se izlazna osovina okretati 64 puta sporije. Drugim riječima, za jedan puni okret potrebna su 32 x 64 = 2048 koraka, odnosno, postižemo pomak od 0,176° po koraku.

Sve što treba znati o upravljanju radom unipolarnog servomotora 28BYJ-48, prikazano je na Slici 24. Motor ima pet izvoda, od kojih je crveni zajednički svim namotajima i spaja se na pozitivni pol napona napajanja. Slobodni krajevi statorskih namotaja povezani su na preostala četiri izvoda. Spajanjem nekog od ovih izvoda na negativni pol napona napajanja, magnetizirat će se oni dijelovi statora kroz čije je zavojnice potekla struja. Izvodi završavaju 5-pinskim konektorom, čiji raspored izvoda odgovara rasporedu pinova na konektoru J6 razvojnog sustava Shield-B.

Tablice prikazuju redoslijed kojim trebamo propuštati struju kroz pojedine zavojnice kako bi se koračni motor zakrenuo u željenom smjeru (oznaka “1” znači da kroz pripadajuću zavojnicu teče struja). Tablice u gornjem redu odgovaraju punom koraku, a tablice u donjem redu odgovaraju polukoraku. Ovdje smjer rotacije treba promatrati uvjetno, jer ovisi i o broju zupčanika u zupčanom prijenosu.

Shema na Slici 25. prikazuje kako unipolarni koračni motor 28BYJ-48 spajamo na razvojni sustav Shield-B. Otpor pojedinog namotaja motora je 27 Ω i kroz aktivirane namotaje teče struja oko 180 mA. Zbog toga priključne vodove ne možemo direktno spajati na pinove mikroupravljača, nego namotaje uključujemo pomoću tranzistorskih sklopki ugrađenih u integrirani krug ULN2003 (koristimo 4 od 7 raspoloživih sklopki). Sklopkama upravljamo promjenom logičkih stanja na pridruženim pinovima mikroupravljača, pri čemu logička jedinica uključuje sklopku, a nula je isključuje.

Plave LE-diode D4‒D7 svijetle kada je pojedina sklopka uključena; pomoću njih možemo provjeriti rad programa i bez priključenog motora.

Napomene: Umjesto navedenog, na Shield-B mogu se spojiti i drugi unipolarni motori sličnih karakteristika. Shield-B nije predviđen za upravljanje radom bipolarnih koračnih motora, kod kojih se zakretanje rotora postiže promjenom smjera struje kroz statorske zavojnice!

6. programski zadatak: Za sklop prema shemi na Slici 25. napisati program kojim ćemo upravljati radom koračnog motora na sljedeći način:

• dok je pritisnuto tipkalo SW2, motor se treba maksimalnom mogućom brzinom vrtjeti u jednom smjeru

• dok je pritisnuto tipkalo SW3, motor se treba maksimalnom mogućom brzinom vrtjeti u drugom smjeru.

Rješenje Bascom-AVR-a (program Shield-B_6. bas)

Nakon uvodnih konfiguracijskih naredbi, koje se odnose na korišteni mikroupravljač i uvjete u kojima on radi, dimenzionirat ćemo varijable

Step-korak i Step-i:

Dim Step_korak As Byte

Dim Step_i As Byte

Prva od njih sadržavat će binarnu kombinaciju trenutnog koraka, a druga je indeks u tablici

Step-tablica, koja sadrži definicije svih važećih koraka sa Slike 24. Tablicu definiramo na samom kraju programa:

Step_tablica:

Data &B1000

Data &B1100

Data &B0100

Data &B0110

Data &B0010

Data &B0011

Data &B0001

Data &B1001

Primjećujemo da tablica sadrži 8 definicija polukoraka. Ovisno o željenom smjeru rotacije, čitat ćemo je odozgo prema dolje ili u suprotnom smjeru. Istu tablicu koristimo i za kretanje punim korakom, u kojem slučaju čitamo svaki drugi zapis (odnosno, samo zapise u kojima postoje po dvije jedinice).

Na početku programa još moramo konfigurirati ulazne pinove PC2 i PC3:

Config Portc.2 = Input

Portc.2 = 1

Config Portc.3 = Input

Portc.3 = 1

Sve pinove koji upravljaju radom koračnog motora konfiguriramo kao izlazne:

Config Portd.2 = Output

Config Portd.4 = Output

Config Portd.7 = Output

Config Portb.0 = Output

Sada ćemo motor postaviti u početno stanje, koje odgovara gornjem lijevom crtežu na Slici 21. To se stanje nalazi u drugom retku tablice, pa ćemo u indeks upisati 1 (prvi redak tablice ima indeks 0) i pozvati potprogram Step_pomakni:

Step_i = 1

Gosub Step_pomakni

U njemu najprije osiguravamo da indeks ne bude veći od 7,

Step_pomakni:

Step_i = Step_i And &B00000111 čitamo indeksirani redak iz tablice

Step_korak = Lookup(step_i , Step_tablica) i zatim, bit po bit, postavljamo izlazne pinove u odgovarajuća stanja:

Portb.0 = Step_korak.3

Portd.7 = Step_korak.2

Portd.4 = Step_korak.1

Portd.2 = Step_korak.0

Return

U glavnoj programskoj petlji provjeravamo je li pritisnuto koje od tipkala, pa povećavamo ili smanjujemo indeks za dva (koristimo puni korak): Do

If Pinc.2 = 0 Then

Step_i = Step_i + 2

End If

If Pinc.3 = 0 Then

Step_i = Step_i - 2

End If

Svako pročitano stanje prenosimo na izlazne pinove, kako bi se osovina motora zakrenula u željenom smjeru za jedan korak.

Gosub Step_pomakni

Waitms 2

Loop

Naredba Waitms određuje vremensku razliku između dva koraka i tako utječe na brzinu vrtnje motora.

Rješenje Arduina (program Shield-B_6.ino)

Program ćemo početi deklariranjem varijabli step_korak i step_i, pri čemu im pridodajemo početne vrijednosti: byte step_korak = 0; byte step_i = 1;

Nakon njih definiramo niz od osam elemenata naziva step_tablica, koji sadrže definicije svih važećih koraka: byte step_tablica[8] = {0b1000, 0b1100, 0b0100, 0b0110, 0b0010, 0b0011, 0b0001, 0b1001};

U funkciji setup() definiramo pinove 2, 4, 7, i 8 kao izlazne pinove, void setup() { pinMode(2,OUTPUT); pinMode(4,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); a pinove A2 i A3 definiramo kao ulazne, s uključenim pull-up otpornikom: pinMode(A2, INPUT_PULLUP); pinMode(A3, INPUT_PULLUP);

Motor ćemo postaviti u početno stanje pozivanjem funkcije step_pomakni(): step_pomakni(); } // kraj setup()

U funkciji step_pomakni() najprije osiguravamo da indeks step_i ne bude veći od 7 korištenjem logičkog I operatora &; void step_pomakni() { step_i = step_i & 0b0000111; čitamo indeksirani element iz niza step_tablica: step_korak = step_tablica[step_i]; i zatim, bit po bit, postavljamo izlazne pinove u odgovarajuća stanja: digitalWrite(2, bitRead(step_korak, 3)); digitalWrite(4, bitRead(step_korak, 2)); digitalWrite(7, bitRead(step_korak, 1)); digitalWrite(8, bitRead(step_korak, 0));

} // kraj step_pomakni()

U glavnoj programskoj petlji loop() provjeravamo je li pritisnuto koje od tipkala, pa povećavamo ili smanjujemo indeks za dva (koristimo puni korak): void loop() { if (digitalRead(A2) == 0) { step_i = step_i + 2; } if (digitalRead(A3) == 0) { step_i = step_i - 2; step_pomakni(); delay(2);

Svako pročitano stanje prenosimo na izlazne pinove, kako bi se osovina motora zakrenula u željenom smjeru za jedan korak.

} // kraj loop()

Naredba delay() određuje vremensku razliku između dva koraka i tako utječe na brzinu vrtnje motora.

* * *

Naredbe Waitms u programu Bascom-AVR i delay() u programu Arduino određuju brzinu vrtnje koračnog motora. Što je kašnjenje kraće, motor će se vrtjeti brže, i obratno. Kašnjenje od 2 ms određeno je pokusom i kod njega se motor vrtio najvećom mogućom brzinom, kod još manjih kašnjenja je stao. Taj pojam najveće brzine treba shvatiti s ogradom: zbog velikog stupnja prijenosa, izlazna osovina je za jedan puni krug trebala oko 4 s. No, koračne motore niti ne koristimo tamo gdje je potrebna velika brzina vrtnje, nego tamo gdje je potrebna velika preciznost!

Za radoznale: Povećajte vremensku razliku s 2 ms na 200 ms, promatrajte što se događa s LE-diodama i usporedite ponašanje LE-dioda s pokretanjem osovine motora!

Napomene: Programe Shield-B_6.bas i Shield-B_6.ino možete besplatno dobiti od uredništva časopisa ABC tehnike!

Vladimir Mitrović, Robert Sedak

This article is from: