6 minute read

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

U ovom ćemo nastavku naučiti kako povezati mali servomotor na razvojnu pločicu Shield-B, te kako programima pisanima u programskim jezicima Bascom-AVR i Arduino IDE upravljati njegovim radom.

Servomotori se znatno razlikuju od “običnih” istosmjernih elektromotora kojima smo se do sada bavili. Zapravo, DC-motor je tek jedan od sastavnih dijelova svakog servomotora. Pored njega, u kućište su još ugrađeni zupčani prijenos (zbog kojega se osovina servomotora vrti sporije od osovine pogonskog DC-motora) i odgovarajući elektronički sklop. Sastavni dijelovi jednog tipičnog servomotora prikazani su na Slici 13.

Advertisement

Slika ujedno prikazuje i kako servomotor spajamo na napon napajanja. Nazivni napon većine malih modelarskih servomotora iznosi 5 V, a potrošnja im nije prevelika, pa ih slobodno možemo direktno povezati na razvojni sustav Shield-B i koristiti isti izvor kojim napajamo i Arduino Uno. No, servomotor neće proraditi ako ga samo spojimo na napon napajanja: da bismo ga pokrenuli, potrebno mu je na treći priključak (žute ili bijele boje) trajno dovoditi odgovarajuće upravljačke impulse. Ti se impulsi trebaju ponavljati svakih 20 ms (drugim riječima, impulsi trebaju biti frekvencije 50 Hz) i trajati između 700 i 2300 µs. Ponašanje motora ovisi upravo o trajanju upravljačkih impulsa.

Napomenimo još kako postoje dvije izvedbe servomotora:

• servomotori čija se osovina može trajno vrtjeti u jednom ili u drugom smjeru (ovakvi motori su pogodni za pogon robota) i

• servomotori čija se osovina može zakrenuti samo za 180° (ovakvi motori su pogodni za postavljanje dijelova robota u željeni položaj, kao i za upravljanje smjerom njegovog kretanja).

Osovina prve izvedbe vrtjet će se u jednom smjeru kada je trajanje upravljačkih impulsa kraće, a u suprotnom smjeru ako je trajanje upravljačkih impulsa duže od 1500 µs. Motor će se zaustaviti kada su upravljački impulsi trajanja oko 1500 µs. U užem području oko 1500 µs moguće je upravljati i brzinom vrtnje servomotora, ali motor brzo postigne maksimalnu brzinu vrtnje, koja onda više ne ovisi o daljnjem smanjenju ili povećanju trajanja impulsa.

Mi ćemo se baviti drugom izvedbom, čija se osovina može od srednjeg položaja zakrenuti za po 90° u oba smjera. Slika 14. prikazuje kako zakret osovine ovisi o trajanju upravljačkih impulsa. Na slici su prikazani samo srednji i krajnji položaji, ali ovom vrstom servomotora moguće je i vrlo precizno upravljati. Tako će, na primjer, impulsi trajanja 1450 µs zakrenuti osovinu samo malo “ulijevo“ od srednjeg položaja, impulsi trajanja 1400 µs još malo više ulijevo itd. Napomena: Smjer zakretanja osovine koji je prikazan na Slici 14. odnosi se na Hitec HS-422; kod drugih tipova servomotora osovina se može zakretati u suprotnom smjeru od prikazanog!

Kako bi se mogla osigurati pouzdana ovisnost položaja osovine u odnosu na trajanje impulsa, u ovakve servomotore ugrađuje se potenciometar povezan s osovinom motora (taj potenciometar nije vidljiv na Slici 13.). Klizač potenciometra elek- troničkom sklopu u svakom trenutku “javlja” položaj osovine servomotora pa će on moći odraditi potrebne korekcije čim ustanovi da položaj osovine ne odgovara trajanju upravljačkih impulsa.

Dosad smo kao dozvoljeni raspon trajanja impulsa navodili vrijednosti od 700 do 2300 µs. Ovisno o izvedbi motora, taj raspon može biti i malo veći (npr. 500‒2500 µs, kao kod HS-422) ili manji (npr. 900‒2100 µs). Treba provjeriti dokumentaciju korištenog motora ili pažljivo ispitati unutar kojeg se raspona osovina nekog motora slobodno zakreće. Moramo jako paziti da trajanje impulsa ne izađe izvan dopuštenog raspona! Dovođenje impulsa prekratkog ili predugog trajanja, kao i dovođenje impulsa čija frekvencija znatnije odstupa od nazivnih 50 Hz, rezultirat će pokušajem postavljanja osovine u nedozvoljeni položaj, preko graničnika. Servomotor će

“zablokirati” pri čemu se mogu oštetiti njegovi zupčanici!

Slika 15. prikazuje kako povezati dva servomotora na razvojni sustav Shield-B, verzija v1.2. Povezivanje ne bi trebalo predstavljati problem, jer su izvodi na konektorima obojani istim bojama kao i priključni vodovi servomotora. Prvi servomotor, S1, spajamo na konektor J5, preko kojega motor dobiva i napon napajanja i upravljačke impulse. Drugi servomotor, S2, spajamo na konektor S8 (ovaj konektor, kao i ostale komponente koje su na shemi ucrtane plavom bojom, ne postoji u osnovnoj izvedbi razvojnog sustava, v1.1, pa je na toj verziji na pločicu moguće spojiti samo jedan servomotor).

Kako je sva potrebna “elektronika” ugrađena u sam servomotor, upravljački priključci (SIG) su na razvojnom sustavu Shield-B povezani direktno s pinovima mikroupravljača. Dodali smo samo LE-diode D8 i D10, koje će svijetliti proporcionalno širini upravljačkih impulsa: tako ćemo imati vizualnu kontrolu impulsa koje mikroupravljač prosljeđuje servomotorima.

5. programski zadatak: Za sklop prema shemi na Slici 15. napisati program kojim ćemo, pomoću potenciometara RV1 i RV2, upravljati položajem servomotora S1 i S2.

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

Nakon uvodnih konfiguracijskih naredbi, koje se odnose na korišteni mikroupravljač i uvjete u kojima on radi, dimenzionirat ćemo varijable Rv1 i Rv2 i prikladno konfigurirati pretvarač A/D:

Dim Rv1 As Word , Rv2 As Word

Config Adc = Single , Prescaler = Auto , Reference = Avcc

U varijable ćemo pospremati očitanja napona klizača potenciometara RV1 i RV1. Bascom-AVR ima gotove rutine za upravljanje radom do 10 servomotora. U konfiguracijskoj naredbi definiramo koliko servomotora imamo i koje ćemo pinove mikrokontrolera koristiti za upravljanje njihovim radom. U našem primjeru imamo dva serva, kojima upravljamo preko pinova PB1 i PB2:

Config Servos = 2 , Servo1 = Portb.1 , Servo2 = Portb.2 , Reload = 7

Još moramo upravljačke pinove PB1 i PB2 konfigurirati kao izlazne i omogućiti prekide (o prekidima ćemo više nekom drugom prilikom):

Config Portb.1 = Output

Config Portb.2 = Output

Enable Interrupts

Bascom-AVR će definirati dvije varijable, Servo(1) i Servo(2), a parametar Reload određuje učestalost provjere njihovog sadržaja, odnosno, finoću kojom možemo postaviti osovinu servomotora, ali i frekvenciju upravljačkih impulsa. Vrijednost parametra Reload = 7 je odabrana pokusom; uz nju je frekvencija upravljačkih impulsa blizu optimalnih 50 Hz, a potreban raspon upravljačkih impulsa (700‒2300 µs) dobit ćemo upisom vrijednosti u rasponu 70‒230 u varijable Servo(1) ili Servo(2)

U glavnoj programskoj petlji najprije očitavamo napon na klizaču potenciometra RV1:

Do Rv1 = Getadc(0)

Ovisno o položaju klizača, očitanje će biti u rasponu 0‒1023. Množenjem s faktorom 21/134 taj raspon najprije ćemo smanjiti na 0‒160, a zatim rezultatu dodati 70. Tako smo dobili broj u rasponu 70‒230, koji upisujemo u varijablu Servo(1):

Rv1 = Rv1 * 21

Rv1 = Rv1 / 134

Servo(1) = 70 + Rv1 ‚70-230

Ostatak će za nas odraditi “nevidljiva” rutina

Bascom-AVR-a, koja će instruirati mikroupravljač kako na osnovu upisane vrijednosti proizvesti upravljačke impulse širine 700‒2300 µs.

Program za drugi servomotor je identičan; i ovdje očitavamo napon na klizaču potenciometra RV2 i zatim očitanje sabijamo u raspon 0‒160:

Rv2 = Getadc(1)

Rv2 = Rv2 * 21

Rv2 = Rv2 / 134

Ovdje smo upis u varijablu Servo(2) prekrojili na način da zakreće osovinu u suprotnom smjeru:

Servo(2) = 230 - Rv2 ‚230-70

Loop

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

Razvojno okruženje Arduino IDE ima biblioteku pod nazivom Servo koja koristi Timer1 i može istovremeno upravljati radom do 12 servomotora. Biblioteka Servo omogućuje jednostavno upravljanje malim servomotorima definiranjem objekta i korištenjem pripadajućih funkcija. Koristit ćemo dvije funkcije: attach() za definiranje na koji pin je spojen servomotor te funkciju write() pomoću koje definiramo kut zakreta servomotora od 0 do 180 stupnjeva.

Program ćemo započeti navođenjem biblioteke koju ćemo koristiti:

#include <Servo.h>

Zatim za svaki servomotor definiramo vlastiti objekt:

Servo S1; Servo S2;

U funkciji setup() za svaki ćemo objekt definirati pin koji koristi. Kako smo servomotor 1 spojili na pin 9, objektu S1 pridružit ćemo taj pin pomoću funkcije attach(). Za servomotor 2 koristit ćemo pin 10: void setup() {

S1.attach(9);

S2.attach(10);

U funkciji loop() prvo očitavamo napon na klizaču potenciometra RV1: void loop() { int Rv1 = analogRead(A0);

Ovisno o položaju klizača RV1, očitanje će biti u rasponu 0‒1023. Stoga je potrebno taj raspon pretvoriti u raspon 0‒180 pomoću funkcije map():

Rv1 = map(Rv1, 0, 1023, 0, 180);

Sada nam još preostaje pretvorenu vrijednost proslijediti funkciji write() objekta S1 i time zakrenuti osovinu servomotora S1:

S1.write(Rv1);

Isti postupak ponovimo za klizač Rv2 i servomotor S2, ali u ovom ćemo slučaju definirati zakretanje osovine u drugom smjeru također korištenjem funkcije map(): int Rv2 = analogRead(A1);

Rv2 = map(Rv2, 0, 1023, 180, 0);

S2.write(Rv2);

Kako brzina zakreta servomotora nije jako velika, na kraju funkcije loop() napravit ćemo pauzu od 15 ms i time dati servomotoru vremena da završi sa zadanim zakretom osovine: delay(15);

} // kraj loop()

Napomene: Programe Shield-B_5.bas i Shield-B_5.ino možete besplatno dobiti od uredništva časopisa ABC tehnike! Programi su napisani za dva servomotora spojena na verziju v1.2 razvojnog sustava Shield-B. Ispravno će raditi i na verziji v1.1, na koju možemo spojiti samo jedan servomotor, S1! Koliko ćemo motora moći spojiti, ovisi i o njihovoj potrošnji. Mikroservomotori, poput SG90, pod opterećenjem troše oko 270 mA, neopterećeni znatno manje. Zbog toga će napajanje preko USB-kabla biti dostatno i kad provjeravamo rad programa s dva ovakva servomotora. Međutim, radna struja HS-422 i sličnih servomotora je oko 150 mA, a pod opterećenjem može porasti i do 800 mA. Koristimo li dva servomotora ovog tipa, nužno je osigurati napajanje preko mrežnog adaptera napona 7,5‒9 V i maksimalne struje od najmanje 1 A. Adapter ne uključujemo u Shield-B, nego u Arduino Uno!

Vladimir Mitrović, Robert Sedak