![]() | ![]() |
![]() |
| ![]() |
| ||||||||||||||||||
Skečevi druge vrste
Arduino IDE
Kada završimo sa pisanjem skeča (engl. scatch, naziv programa pisanih za Arduino), potrebno je da proverimo da li sintaksa ima greške uz pomoć opcije Verify. Ukoliko nema grešaka, na dnu prozora će se pokazati podaci o zauzeću memorije za pohranjivanje programa i koliko je bajtova otišlo na podatke u RAM. U prošlom broju smo pisali da Arduino Uno ima 32 kilobajta programske memorije i dva kilobajta SRAM, tako da je potrebno ekonomično upravljanje sa ovim resursom. Opcija Upload kompajlira kod i prebacuje ga na mikrokontroler. Da bismo skeč pokrenuli na našem uređaju, potrebno je da prethodno iz menija Tools: Board izaberemo model koji trenutno koristimo. Osim toga je iz menija Tools: Port potrebno izabrati serijski port koji je dodeljen našem USB adapteru preko koga vršimo programiranje Arduina. Već smo pominjali da je za ovu platformu napisan veliki broj programskih biblioteka koje uveliko olakšavaju korišćenje svakojakih hardverskih modula koje možemo uključiti u naše projekte. Umesto da se sami mučimo sa realizacijom neke funkcije (recimo, želimo da crtamo po displeju) jednostavno se poslužimo sa gotovom bibliotekom koju su neki dobri ljudi napisali pre nas. Ukoliko želimo da dodamo biblioteku koja nam je potrebna, to je najlakše obaviti preko menija Sketch: Import Library. U istom meniju ćemo videti sve biblioteke koje već postoje na našem sistemu. Izborom neke od njih u program će biti automatski dodata sva neophodna zaglavlja preko #include <> direktiva. Iz tona C Osnovni programski jezik koji se koristi na platformi Arduino je svojevrsna pojednostavljena varijanta jezika C. Tačnije, iz jezika su sklonjene neke kompleksnije stvari i uvedena je C/C++ biblioteka zvana Wiring, koja je preuzeta iz pomenute platforme Processing. Upravo iz činjenice da je Processing pisan za jezik Java, a Wiring za C/C++ proizilaze i nevelike razlike u njihovoj sintaksi. Iako C važi za jedan od težih jezika za savladavanje, ovde je to teško primetiti. Kostur svakog Arduino programa kreiranog uz pomoć razvojnog okruženja Arduino IDE izgleda ovako: void setup() { // put your setup code here, to run once: }
void loop() { // put your main code here, to run repeatedly: } Kao što vidimo, reč je o dve funkcije od kojih je prva (setup) zadužena za inicijalizaciju parametara programa i izvodi se samo jednom na početku, dok funkcija loop predstavlja beskonačnu petlju koja se ponavlja tokom rada programa. Pošto se radi o varijanti jezika C, mnogi će se upitati šta je sa nezaobilaznom funkcijom main()? Da bi pojednostavili rad, autori su rešili da je prosto sakriju, tako da ona i dalje obavlja svoj posao iza scene. U stvarnosti, osnovni skelet Arduino skeča izgleda ovako: int main() { init(); //inicijalizuj USB setup(); //početne postavke while(1){loop();} //beskonačna petlja } Funkcija init() reguliše neke parametre vezane za USB port. Sledi pozivanje funkcije setup() za koju smo pisali da je namenjena izvođenju operacija koje se obavljaju samo jednom na početku programa. Posle toga ulazimo u beskonačnu petlju koja će stalno pozivati funkciju loop()sve do prestanka rada, a u našem slučaju to znači do prekida dotoka električne energije ili pritiska na reset taster.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } Unutar funkcije setup(), digitalnom U/I pinu broj 13 funkcijom pinMode() dodeljujemo funkciju izlaza. To je potrebno zbog toga što U/I pinovi mogu obavljati kako funkciju ulaza, tako i izlaza. Iako su svi U/I pinovi inicijalno postavljeni u režim rada INPUT, moguće ih je koristiti bez pozivanja funkcije pinmode() ukoliko preko njih očekujemo prijem podataka. Ipak, toplo se savetuje da se u cilju izbegavanja nesporazuma ta funkcija uvek eksplicitno koristi. Unutar beskonačne petlje loop(), pomoću funkcije digitalWrite() na pinu 13 postavljamo stanje takozvane logičke jedinice uz pomoć konstante HIGH, što dovodi do uključi-vanja LED lampice. Logička jedinica i nula predstavljaju opsege gornjeg i donjeg napona sa kojim funkcioniše neka komponenta. Generalno, kod modela UNO i MEGA2560 ona predstavlja napon od dva do pet volti, dok logička nula predstavlja napon u opsegu od nula do jedan volt. Kod modela koji rade na 3,3 volta sa HIGH predstavljamo naponsko stanje od dva do 3,3 volta, dok je LOW jednako naponu u opsegu od nula do 0,8 volta. U praksi su ovi opsezi nešto uži, recimo, u slučaju TTL kola gornji napon je u oblasti 2,7-5 volti, dok je donji 0-0,4 volti. Umesto konstanti HIGH i LOW mogli smo da koristimo brojeve 0 i 1 kako bismo označili u kakvom se logičkom stanju trenutno nalazi ukazani pin, ali je ipak elegantnije raditi sa njima. Nakon što smo uključil LED lampicu, mikrokontroler izvršava funkciju delay(1000) koja pravi pauzu od 1000 milisekundi, odnosno jedne sekunde. Sledeći korak je izvođenje funkcije digitalWrite() sa kojom na digitalni izlaz 13 šaljemo stanje logičke nule, koje izaziva isključenje lampice i to u intervalu od 1000 milisekundi nakon čega nas beskonačna petlja ponovo vraća na početak. Rezultat rada programa je smenjivanje perioda kada dioda svetli i kada ne emituje svetlost.
Na anodu LE diode (poznaje se po dužoj nožici i maloj izbočini na plastici) dovodimo signal sa pina 10 preko otpornika od 220 oma (zavisi od vrste diode koja se koristi, u najvećem broju slučajeva će poslužiti otpornici od 160-600 oma) koji je štiti od pregorevanja. Na katodu (kraća nožica) dovodimo uzemljenje sa pina GND (na ilustraciji uzemljenje prvo dovodimo na liniju uzemljenja prototipske ploče pa odatle na katodu). Pin broj 10 Arduina Uno (kao i pinovi 3, 5, 6, 9 i 11) ima funkciju pretvaranja digitalnog signala u analogni ekvivalent tako što emituje 256 različitih nivoa napona u opsegu nula do pet volti. Pa da vidimo kako se to ostvaruje programski: int svetlost=0; // intenzitet LED svetla void setup() { pinMode(10, OUTPUT); // pin 10 je PWM izlaz } void loop() { for (svetlost=0;svetlost<255;svetlost++) { analogWrite(10, svetlost); delay(10); // kratka pauza } for (svetlost=255;svetlost>0;svetlost--) { analogWrite(9, svetlost); delay(10); // kratka pauza } delay(2000); // duža pauza } Nivo osvetljenosti LE diode koji želimo da zadamo se nalazi u varijabli svetlost koju preko for-next petlje šaljemo na pin 10, povećavajući je do maksimalne vrednosti 255, da bismo zatim na isti način tu vrednost smanjivali do nule. Između svakog koraka pravimo pauzu od 20 milisekundi kako bi bio vidljiv efekat postepenog uključivanja i isključivanja lampice. Iza svakog ciklusa uključivanja i isključivanja imamo pauzu od dve sekunde. Primer je suštinski dosta sličan prethodnom sa jednom razlikom da ovde umesto funkcije digitalWrite koristimo analogWrite, pošto ova prva ima mogućnost prikazivanja samo dva stanja: uključeno i isključeno. Cela priča vezana za Arduino programiranje se uglavnom vrti oko čitanja i upisivanja analognih i digitalnih vrednosti, a ona je zahvaljujući konceptu platforme Wiring izvedena na jednostavan i razumljiv način. Od ostalih stvari koje inicijalno dolaze u ovoj varijanti jezika C/C++, na raspolaganju su nam više-manje standardne funkcije za konverziju među različitim tipovima podataka (byte(), char(), int(), word(), long(), float()), matematičke funkcije (min(), max(), abs(), sqrt() i tako dalje), trigonometrijske (sin(), cos(), tan()), vremenske (delay(), millis(), micros()) za generisanje slučajnih brojeva (random(), randomseed())... Što se tiče manipulacije sa tekstom, izvorno je podržan rad sa baznim nizovima alfanumeričkih karaktera, ali nam je na raspolaganju i klasa String koja sa sobom donosi niz naprednih metoda za rad sa tekstom. Sa jedne strane, rad sa tipom podataka String i metodima istoimene klase pruža programeru moćno sredstvo za obradu ove vrste podataka, dok sa druge strane generiše dosta više koda, pa je potreban oprez u situacijama kada nemamo mnogo resursa na raspolaganju. Ovaj pregled nije rađen sa namenom da bude udžbenik programiranja na platformi Arduino, već da posluži kao demonstracija jednostavnosti implementacije jednog dosta kompleksnog jezika kao što je C. Postoji mnogo udžbenika i tutorijala na temu savladavanja tog programskog jezika, pa vam, ukoliko ne poznajete njegovu sintaksu, toplo savetujemo da pročitate neki od njih. Svi oni koji poseduju veštinu rada sa nekim od programskih jezika izvedenih iz C (Java, JavaScript, C#...) sasvim sigurno će u vrlo kratkom roku biti u stanju da pišu skečeve za Arduino. Lov na bube Dobar debager para vredi, to zna svako ko je pisao iole složeniji program na računaru. Nažalost, mikrokontroleri ugrađeni u najveći broj Arduino modela nemaju hardversku podršku za analizu koda u realnom vremenu. Da bi se dobila mogućnost debagovanja na Atmel mikrokontrolerima, optimalno rešenje je hardverski uređaj pod nazivom AVR Dragon, čija se cena kreće oko 50 dolara. Mogu se nabaviti i neki jeftiniji (kao i skuplji) modeli koji omogućavaju debagovanje, ali treba voditi računa ukoliko je vaš Arduino baziran na mikrokontroleru Atmega328 da ti dibageri podržavaju protokol debugWIRE, pošto je to jedini put za analizu koda na ovim uređajima. Postoje i softverska rešenja koja emuliraju funkciju analize koda od kojih je najpoznatije ono pod nazivom Visual Micro koji funkcioniše kao dodatak za MS Visual Studio, ali je nažalost reč o proizvodu čija je cena 25 dolara. Pošto je teško očekivati da neko ko je za Arduino platio nekoliko evra ulaže dosta više novca u stvari bez kojih se nekako može živeti, onda mu preostaje da koristi ono što omogućava kakvu-takvu funkcionalnost u praćenju izvršavanja koda. Mogućnost te „kakve-takve” kontrole stanja promenljivih ostvariva je preko ugrađene klase pod nazivom Serial, koja je namenjena razmeni podataka putem serijskog interfejsa. Priključivanjem Arduina preko USB porta mi ostvarujemo serijsku komunikaciju između računara i uređaja. U okviru radnog okruženja u meniju Tools postoji opcija pod nazivom Serial Monitor koja omogućuje slanje i prikaz informacija preko serijske veze (prečica je ikonica u gornjem desnom uglu prozora). Pošto Arduino u baznoj varijanti nema nikakav oblik displeja, ova opcija nam pruža mogućnost da prikažemo rezultate izvršenja programa na mikrokontroleru. Uzmimo na primer kako bi izgledao kod koji računa vrednost hipotenuze preko Pitagorine teoreme. #include "math.h" int kata=5; //fiksna vrednost katete A int katb; //promenljiva kateta B float hipotenuza; void setup() { Serial.begin(9600); // brzina serijskog porta Serial.println("Pitagorina teorema"); for (katb=3;katb<11;katb++) { Serial.println("-----------"); Serial.print("kateta a ="); Serial.println(kata); Serial.print("kateta b = "); Serial.println(katb); hipotenuza = sqrt(kata*kata+katb*katb); Serial.print("hipotenuza = "); Serial.println(hipotenuza); } } void loop(){} Kao što pratimo vrednosti promenljivih u navedenom primeru, na isti način možemo „loviti” vrednosti koje bi ukazivale na grešku. Recimo, moguće je unutar prethodnog koda zadati proveru uz pomoć If-Then konstrukcije koja bi se aktivirala u slučaju pojave neke specifične ili nedozvoljene vrednosti: if (hipotenuza>10) { Serial.println("dužina hipotenuze veća od 10"); }
U gornjem delu ovog prozora se nalazi ekranski taster Send i polje za unos alfanumeričkih karaktera koji se šalju na uređaj i koji se mogu koristiti u okviru našeg programa. Jednostavan primer slanja podataka bi izgledao od prilike ovako: char karakter=""; // varijabla za prihvatanje karaktera void setup() { Serial.begin(9600); // brzina serijskog porta } void loop() { if (Serial.available()>0) { // tekst unesen? karakter=Serial.read(); // čitamo ga Serial.println(karakter); // ispis } } • • • To bi bilo, u najkraćem, ono što bismo mogli da napišemo o programiranju za Arduino. Ukoliko posedujete određeno znanje iz programiranja vrlo brzo ćete se adaptirati na specifične aspekte ovog okruženja i početi da pišete upotrebljive skečeve. Ukoliko spadate u totalne početnike, lepota Arduino platforme je u tome da će vam kroz praksu upravljanja hardverskim uređajima omogućiti progresivno učenje programiranja koje ćete posle moći iskoristiti za savladavanje velikog broja programskih jezika zasnovanih na jeziku C. Programiranje za Arduino zaista nije teško i sa malo koda možemo postići vrlo zanimljive rezultate. Igor S. RUŽIĆ |
| ||||||||||||||||||||
![]() | |
![]() | ![]() |
Home / Novi broj | Arhiva • Opšte teme | Internet | Test drive | Test run | PD kutak | CeDeteka | WWW vodič • Svet igara Svet kompjutera Copyright © 1984-2018. Politika a.d. • Redakcija | Kontakt | Saradnja | Oglasi | Pretplata • Help • English | |
SKWeb 3.22 |