LAKI PINGVINI
Programiranje na platformi Arduino
Igor S. RUŽIĆ
1. novembar 2016.

Tajna velike popularnosti Arduino platforme leži u činjenici da ona po svojoj koncepciji uveliko pojednostavljuje tradicionalni proces konstruisanja elektroničkih sklopova. Zahvaljujući mnoštvu gotovih modula koji se jednostavno dodaju u projekat, stvoreni su uslovi da i apsolutni početnici u svetu elektronike mogu u roku od nekoliko minuta formirati sklopove koji obavljaju dovoljno kompleksne zadatke. Naravno, nećemo daleko odmaći bez poznavanja osnovnih pojmova kao što je Omov zakon ili kakva je funkcija otpornika, kondenzatora i tranzistora, ali rad sa modulima omogućava početnicima da na najbezbolniji mogući način savladaju filozofiju funkcionisanja strujnih kola. Ali to nije sve. Uporedo sa jednostavnim korišćenjem hardvera, kreatori Arduino platforme su učinili možda i još važniju stvar sa uvođenjem mogućnosti jednostavnog programiranja naših hardverskih uređaja.

Skečevi druge vrste

Arduino IDE

 
Istorija celog projekta Arduino vezana je za programski alat pod nazivom Processing od kojega je preuzeo mnoštvo stvari. Processing je zanimljiva platforma koja omogućuje pisanje aplikacija na pojednostavljenoj varijanti jezika Java. Reč je o jednom od najefektivnijih načina za programiranje na platformi Android (vlasnicima telefona toplo savetujemo da postave program APDE), a podržane su i sve popularne desktop platforme. Dodavanjem biblioteke funkcija je moguće i programiranje Arduino uređaja direktno iz ove platforme. Arduino je od Processinga preuzeo razvojno okruženje koje je inače napisano na jeziku Java, čemu dugujemo njegovu portabilnost. Tu imamo dobru i lošu vest. Dobra je da je IDE izuzetno jednostavan za korišćenje i da će se u njemu bez problema snaći svaki početnik. Loša vest je ta da će iskusniji korisnici pronaći mnoštvo ograničenja za rad sa složenijim projektima. Od naprednijih opcija, tu su sintaksno bojenje teksta (doduše, bez mogućnosti izbora sopstvenih boja), automatsko formatiranje koda (opcija u meniju Tools) i skrivanje koda u okviru funkcija. Nažalost, nisu podržane neke danas standardne mogućnosti, kao što je prikazivanja sintaksne greške prilikom editovanja ili autokompletiranje koda. U jednom od narednih brojeva osvrnućemo se na radna okruženja koja u sebi sadrže sve ono što Arduino IDE iz nekih razloga nije podržao, ali za sada nam je on više nego dovoljan.

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.

Zanimljivo je da skoro svi udžbenici na ovu temu za prvo upoznavanje sa kodom navode demonstracioni primer pod nazivom Blink. Razlog za to je svakako taj što svi modeli Arduina na sebi imaju malu LED lampicu koja je fizički povezana sa digitalnim izlazom 13 i pokazuje njegovo trenutno stanje. Ukoliko postavimo LED sa anodom utaknutom u pin 13 i katodom u pin GND, videćemo isti efekat. Dakle, moguće je demonstrirati rad uređaja bez ikakve dodatne opreme.

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.

Još jedan vrlo jednostavan primer koji demonstrira funkcionisanje PWM tehnike digitalno-analogne konverzije od nas zahteva da na uređaj priključimo LE diodu i otpornik od 220 oma.

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"); }

To bi bio neki osnovni demonstrativni šablon upotrebe klase Serial za praćenje stanja promenljivih i obaveštavanja korisnika o njemu. Koliko god da se radi o primitivnom načinu debagovanja, u manjim projektima je i ovo sasvim dovoljno da se otkrije kod koji izaziva grešku. Kao što to možemo videti na pratećoj ilustraciji, u prozoru Serial Monitora dobijamo podatke u tekstualnom obliku, na sličan način kao što ih dobijamo korišćenjem komandne linije operativnog sistema. Bez većih problema je moguće koristiti neki od brojnih programa za emulaciju terminala umesto onoga koji dolazi sa programom.

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.


PRETHODNI TEKST
SLEDEĆI TEKST
Najčitanije
Igre
Telefoni
Hardver
Softver
Nauka
Aktuelno štampano izdanje
APRIL 2024
Gigabyte Radeon RX 7900 GRE Gaming OC 16G
Zlatni zeka
Model koji je izvorno namenjen kineskom tržištu, i koji se tamo pojavio još prošlog leta, lepo je popunio prazninu između modela RX 7800 XT i RX ...
Asus ROG Zephyrus G16 (GU605MY-QR085X)
Najkompaktnija zverka
Uz sve kompromise, ovo je verovatno najsnažniji laptop smešten u manje od dva kilograma i 18 milimetara visine...
Honor Watch 4
Savršeno upakovan
Sat koji donosi veoma malo pravih noviteta, ali kod kog je uklapanje poznatog i očekivanog dovedeno do savršenstva...
Mobile World Congress 2024
Ovde i AI ima AI
Utisak je da MWC „na nogama” drže isključivo velike kineske kompanije, a praksa predstavljanja flegšip telefona na sajmu je sve ređa...
Inovativni motori i reaktori
Bolji pogon
Električni motori uskoro stižu u putničke avione, samo da se reši nekolicina konstruktorskih prepreka...
Honor Magic 6 Pro
Magična Šestica
Sistem kamera oslanja se na tehnički sofisticiran dizajn sa promenjivim otvorom blende...
Apple, AI i nova tužba za monopol
Kisela ili slatka jabuka
Apple će uvek da koristi sopstveno rešenje, ukoliko može da ga napravi dovoljno brzo i kvalitetno...
Dragon’s Dogma 2
Nastavak dvanaest godina stare igre koja odavno ima kultni status, naoko, jednostavan akcioni RPG koji se trudi vas angažuje, ali i pomalo namuči...
Rise of the Ronin
Rise of the Ronin izuzetno podseća na Ghost of Tsushima, kako po izgledu, tako i po konceptu...
Highwater
Ugodan koktel postapokaliptične komike i poetične melanholije...
Microsoft Windows 3.0
Prisećamo se treće iteracije operativnog sistema baziranog na grafičkom korisničkom okruženju, koja je konačno mogla da izađe na crtu takmacima...
© 2024 Svet kompjutera. Sva prava zadrzana.
Novi broj - Arhiva - Forum - O nama