Arduino IDE: od programa do mikrokontrolera

Kako instalirati Arduino IDE, odabrati pločicu i port, učitati program na Arduino, koristiti serijski monitor i biblioteke te riješiti česte greške.

Arduino Info
Laptop s programom na zaslonu, spojen USB kabelom na plavu pločicu mikrokontrolera, a pokraj njih LED-ica i nekoliko žica

Što je Arduino IDE?

Arduino IDE je besplatan program u kojem pišemo programe za Arduino i šaljemo ih na pločicu. Kratica IDE znači integrirano razvojno okruženje (engleski Integrated Development Environment): u jednom programu je sve što za to treba:

  • uređivač, u kojem pišemo program,
  • prevoditelj (compiler), koji program pretvara u naredbe koje mikrokontroler razumije,
  • učitavanje programa na pločicu preko USB kabela,
  • serijski monitor i serial plotter, u kojima vidimo što pločica javlja,
  • biblioteke i primjeri, gotovi programi za module i senzore.

Ova stranica je za Arduino radionicu, na kojoj s Arduino IDE-om počinjemo, kao što piše u lekciji Arduino, elektronika i izrada vlastitih uređaja. Opisuje Arduino IDE 2 (verziju 2.3). Izgled se između verzija malo mijenja, pa izbornike opisujemo riječima, a na slikama su pojednostavljeni.

Od programa do mikrokontrolera

Što se događa kad program pošaljemo na Arduino, pokazuje slika:

Laptop na kojem je program za Arduino (1), a ispod njega strojni kod u heksadecimalnim brojevima (2). USB kabel (3) vodi do pločice Arduino Uno, na kojoj su označeni USB čip (4), mikrokontroler (5) i upaljena LED-ica L (6)

  1. Program, na engleskom sketch, pišemo u Arduino IDE-u, u jeziku C++. Spremljen je u datoteci .ino, u mapi istog imena.
  2. Prevoditelj od programa napravi strojni kod: niz bajtova s naredbama koje mikrokontroler razumije. Na slici su zapisani heksadecimalno.
  3. USB kabel prenosi strojni kod na pločicu, a usput je i napaja.
  4. USB čip na pločici pretvara USB u serijsku vezu, UART, koju mikrokontroler razumije. Dok podaci putuju, trepću LED-ice RX i TX pokraj njega.
  5. Mikrokontroler ATmega328P u sebi ima mali program, bootloader (učitavač). On primi strojni kod i zapiše ga u svoju flash memoriju. Program u njoj ostaje i kad isključiš napajanje.
  6. Program se pokrene. U našem primjeru LED-ica L, spojena na pin 13, počne treptati.

Prevođenje traje nekoliko sekundi, a učitavanje još nekoliko.

Instalacija

  • Arduino IDE preuzmi samo sa službene stranice, arduino.cc/en/software. Postoji za Windows, macOS i Linux. Programi s drugih stranica mogu biti zastarjeli ili zaraženi.
  • Za Windows postoji i ZIP datoteka. Nju samo raspakiraš u neku mapu i pokreneš Arduino IDE.exe, bez instalacije, što pomaže na školskim računalima.
  • Podrška za Arduino Uno (Arduino AVR Boards) dolazi s programom i postavi se sama pri prvom pokretanju. Ako u popisu pločica nema Una, otvori Upravitelj pločica (Boards Manager, ikona pločice na bočnoj traci), potraži AVR i klikni Install. Za to treba internet.
  • Na Linuxu korisnik mora biti u grupi dialout, inače ne smije koristiti port. Dodaje ga naredba sudo usermod -a -G dialout $USER, a promjena vrijedi nakon odjave i ponovne prijave.

Za voditelja: pripremi računala prije radionice

  • Instaliraj Arduino IDE, podršku za Uno, biblioteke koje trebaju lekcije i upravljački program za USB čip na svako računalo, i na svakom učitaj probni program.
  • Školska mreža može zaustaviti preuzimanje, a za upravljački program trebaju administratorska prava. Instalacijske datoteke drži i na USB sticku.
  • Arduino ima i internetski uređivač (Arduino Cloud Editor), ali za njega treba korisnički račun. Na radionici koristimo program instaliran na računalu, bez računa.

Spajanje pločice

  1. Spoji Arduino USB kabelom. Kabel mora prenositi podatke: neki kabeli služe samo za punjenje, i s njima se pločica upali, ali je računalo ne vidi.
  2. Odaberi pločicu: Tools → Board → Arduino AVR Boards → Arduino UNO.
  3. Odaberi port: Tools → Port. Na Windowsu se port zove na primjer COM3, na Linuxu /dev/ttyUSB0 ili /dev/ttyACM0, a na macOS-u počinje s /dev/cu.. Ako ne znaš koji je tvoj, pogledaj popis, odspoji pločicu i pogledaj ga ponovno: nestao je baš tvoj port.

Pločicu i port možeš odabrati i u padajućem izborniku na alatnoj traci: klikni Select other board and port, u polje Boards upiši uno, odaberi Arduino UNO, desno odaberi port i klikni OK. Ako odabereš samo pločicu, program možeš prevesti, ali ne i učitati.

Prozor Select Other Board and Port u Arduino IDE-u: u polje za pretraživanje pločica upisano je uno i odabrana je pločica Arduino UNO, a desno je odabran port COM1

Na radionici koristimo pločice koje nisu originalne (klonove). Na mnogima je USB čip CH340, koji Arduino IDE ne prepoznaje po imenu, pa uz port ne piše Arduino UNO. Pločicu tada odaberi sam. Windows 10 i 11 i novije verzije macOS-a obično same imaju upravljački program za CH340. Ako se port ipak ne pojavi ni s ispravnim kabelom, upravljački program treba instalirati sa stranice proizvođača čipa, tvrtke WCH.

Prozor Arduino IDE-a

Pojednostavljeni prozor Arduino IDE-a. Na alatnoj traci su okrugle tipke za provjeru (1) i učitavanje (2), izbornik pločice i porta (3) te desno tipke za Serial Plotter (4) i serijski monitor (5). Lijevo je bočna traka (6), u sredini uređivač s programom (7), ispod njega izlaz s porukama (8), a na dnu statusna traka (9)
  1. Provjeri (Verify, kvačica, Ctrl+R): prevede program i javi greške, ali ga ne šalje na pločicu.
  2. Učitaj (Upload, strelica, Ctrl+U): prevede program i pošalje ga na pločicu. Siva tipka pokraj nje (Debug) ne radi s Unom.
  3. Pločica i port, isto što i u izborniku Tools.
  4. Serial Plotter: crta brojeve koje program šalje. Otvara se i u izborniku Tools → Serial Plotter.
  5. Serijski monitor (Serial Monitor, Ctrl+Shift+M): prikazuje poruke s pločice. Otvara se i u izborniku Tools → Serial Monitor, a prikazuje na dnu prozora, umjesto izlaza.
  6. Bočna traka, odozgo prema dolje:
    • Sketchbook (mapa): popis tvojih spremljenih programa. Klikom na ime program se otvori.
    • Upravitelj pločica (Boards Manager, pločica): instalira i nadograđuje podršku za pločice, na primjer Arduino AVR Boards za Uno.
    • Upravitelj biblioteka (Library Manager, knjige): pretražuje, instalira i nadograđuje biblioteke, kao u odjeljku Biblioteke.
    • Otklanjanje grešaka (Debug): izvodi program korak po korak, ali samo na pločicama koje to podržavaju. Uno to ne podržava.
    • Pretraživanje (Search, povećalo): traži riječ u svim datotekama otvorenog programa i, ako želiš, zamjenjuje je drugom.
  7. Uređivač: ovdje pišeš program. Brojevi lijevo su brojevi redaka. Tools → Auto Format (Ctrl+T) uredno poravna uvlake.
  8. Izlaz (Output): poruke prevoditelja, na primjer koliko memorije program zauzima, i greške.
  9. Statusna traka: redak u kojem si i odabrana pločica s portom.

Prvi program

Gotovi primjeri su u izborniku File → Examples. Najpoznatiji je 01.Basics → Blink, koji pali i gasi LED-icu L na pločici. Naša inačica uz to javlja što radi:

// Pali i gasi LED-icu L na pločici i javlja što radi
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  // LED-ica L, spojena na pin 13
  Serial.begin(9600);            // brzina mora biti ista kao u serijskom monitoru
  Serial.println("Pokrenuto!");
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("svijetli");
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println("ne svijetli");
  delay(1000);
}
  1. Klikni Provjeri. U izlazu piše koliko program zauzima: oko 2000 bajtova od 32 256 koliko ima Uno.
  2. Klikni Učitaj. Dok se program šalje, trepću LED-ice RX i TX, a na kraju u izlazu piše Done uploading.
  3. LED-ica L sada svijetli jednu sekundu, pa jednu sekundu ne svijetli.
  4. Otvori serijski monitor i odaberi brzinu 9600 baud. Ispisuju se poruke svijetli i ne svijetli.

Serijski monitor

Serijski monitor prikazuje sve što program pošalje naredbama Serial.print() i Serial.println(). Druga na kraju poruke prijeđe u novi red. Tako najlakše vidimo što program radi i koje vrijednosti čita, na primjer svjetlo na LDR-u u lekciji Arduino - korak po korak.

Serijski monitor na dnu prozora Arduino IDE-a, pokraj kartice Output. U svakom retku je jedan znak i njegov broj u dekadskom, heksadecimalnom, oktalnom i binarnom zapisu, na primjer r, dec: 114, hex: 72, oct: 162, bin: 1110010. Gore desno odabrano je New Line i 9600 baud
Na slici serijski monitor prikazuje ispis primjera File → Examples → 04.Communication → ASCIITable. On za svaki znak ispiše broj kojim ga računalo pamti, u četiri brojevna sustava: dekadskom, heksadecimalnom, oktalnom i binarnom. Gore desno su brzina, ovdje 9600 baud, i izbornik u kojem biraš što se dodaje na kraj poruke koju šalješ pločici (New Line je novi red).

  • Brzina mora biti ista. Broj u Serial.begin(9600) i brzina odabrana u serijskom monitoru moraju biti jednaki. Ako nisu, umjesto poruka vidiš čudne znakove.
  • Port koristi samo jedan program. Ako je serijski monitor otvoren u nekom drugom programu, Arduino IDE ne može učitati program na pločicu.
  • Pinovi 0 i 1 zauzeti su. Preko njih ide serijska veza prema USB čipu. Ako je na njih nešto spojeno, učitavanje može ne uspjeti, a u monitoru se pojave pogrešni znakovi.
  • U polje na vrhu serijskog monitora možeš upisati poruku i poslati je pločici. Program je čita naredbom Serial.read().

Serial Plotter

Serial Plotter od brojeva koje program šalje crta graf, pa se promjene vide mnogo bolje nego u stupcu brojeva. Otvara se u svojem prozoru, a brzina mora biti ista kao u programu:

// Šalje napon na A0 u Serial Plotter (od 0 do 1023)
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A0));
  delay(20);
}

Spoji potenciometar: krajnje izvode na 5 V i GND, a klizač na A0. Kad okrećeš gumb, crta se diže i spušta između 0 i 1023. Ako na A0 nije ništa spojeno, crta skače bez reda, jer nespojeni ulaz ne čita 0 (zabluda 10). Više vrijednosti odjednom crtaš tako da ih ispišeš u istom retku, odvojene zarezom ili razmakom, a na kraju prijeđeš u novi red.

Prozor Serial Plotter s dvije krivulje, plavom za Variable 1 i narančastom za Variable 2, koje skaču između 0 i 200. Gore su kvačice za svaku vrijednost, prekidač Interpolate i tipka STOP, a dolje polje za poruku i brzina 9600 baud
Na slici program šalje dvije vrijednosti u svakom retku, pa Plotter crta dvije krivulje. Svaka dobije svoju boju i kvačicu gore lijevo, kojom je možeš sakriti. Tipka STOP zaustavi crtanje, da graf možeš pogledati na miru, a dolje desno je brzina, koja mora biti ista kao u programu.

Biblioteke

Biblioteka je gotov kod za neki modul, na primjer zaslon, sat ili senzor, pa ga ne moramo pisati sami. Instaliramo je u Upravitelju biblioteka (Library Manager, ikona knjiga na bočnoj traci): potražimo ime biblioteke koje navodi lekcija ili proizvođač modula i kliknemo Install. U program je uključujemo naredbom #include na vrhu, na primjer #include <Wire.h> za vezu I2C. Uz većinu biblioteka dolaze i primjeri, u izborniku File → Examples.

Kad nešto ne radi

Greške pri prevođenju

Kad program ima grešku, prevoditelj ga ne prevede i u izlazu crvenim slovima javi što ga muči. Poruka počinje imenom datoteke, brojem retka i stupca. Uvijek prvo čitaj prvu grešku, jer su ostale često samo njezina posljedica.

Arduino IDE s programom kojemu na kraju retka 14, iza delay(1000), nedostaje točka-zarez. U izlazu crvenim slovima piše greška u retku 15: expected ';' before '}' token, a dolje desno je obavijest Compilation error s tipkom COPY ERROR MESSAGES
Na slici nedostaje ; na kraju retka 14, iza delay(1000). Prevoditelj to primijeti tek kad dođe do } u retku 15, pa javlja :15:1:, redak 15 i stupac 1. Tipka Copy error messages kopira sve poruke, pa ih možeš poslati voditelju ili na Discord.

PorukaŠto znači
error: expected ';' before '}' tokenNedostaje ;. Prevoditelj to primijeti tek u sljedećem retku, pa je greška na kraju retka prije onoga koji javlja.
error: 'digitalwrite' was not declared in this scopePrevoditelj ne poznaje tu riječ. C++ razlikuje velika i mala slova: ispravno je digitalWrite. Prevoditelj ga i sam predloži (suggested alternative).
error: expected '}' at end of inputNeka vitičasta zagrada nije zatvorena. Pomaže Auto Format: blok koji nije zatvoren ostane krivo uvučen.

Greške pri učitavanju

Što vidišNajčešći uzrokŠto učiniti
Port se ne pojavljujekabel samo za punjenje ili nedostaje upravljački programprobaj drugi kabel, pa upravljački program za CH340
avrdude: stk500_recv(): programmer is not respondingodabrana je pogrešna pločica ili port, ili je nešto spojeno na pinove 0 i 1provjeri pločicu i port, odspoji pinove 0 i 1 i pokušaj ponovno
Access is denied, Permission denied ili port busyport koristi drugi program, a na Linuxu korisnik nije u grupi dialoutzatvori serijski monitor u drugom programu, na Linuxu dodaj korisnika u grupu
Učitavanje uspije, ali ništa se ne događapogrešan pin u programu ili greška u sklopuispiši u serijski monitor što program radi i provjeri sklop

Spremanje programa

Arduino IDE sprema programe u mapu Sketchbook: na Windowsu i macOS-u je to mapa Arduino u Dokumentima, a na Linuxu ~/Arduino. Svaki program dobije svoju mapu s istim imenom kao datoteka .ino, i to tako mora ostati. Ime piši bez razmaka i bez slova č, ć, đ, š i ž, na primjer semafor_2. Ako u istoj mapi ima više datoteka .ino, Arduino IDE ih prikazuje kao kartice i prevodi zajedno, kao jedan program.

Arduino IDE ili Visual Studio Code?

Arduino IDE je najjednostavniji za početak i brzo isprobavanje. Kad projekti narastu, prelazimo na Visual Studio Code s dodatkom PlatformIO, koji bolje pomaže u organizaciji većih programa. O njemu piše stranica Arduino i Visual Studio Code.

Savjeti za traženje grešaka

Kad nešto ne radi, nemoj mijenjati sve odjednom. Kreni redom, od pločice prema programu, i nakon svake promjene ponovno isprobaj.

Pločica i spajanje

  1. Svijetli li LED-ica ON na pločici? Ako ne svijetli, pločica nema napajanja: provjeri kabel i USB utičnicu, a ako se pločica grije ili je računalo isključi, potraži kratki spoj.
  2. Isprobaj drugi kabel, drugi USB priključak i, ako treba, drugo računalo. Tako brzo saznaš je li kvar u pločici, kabelu ili računalu.
  3. Na Windowsu otvori Upravitelj uređaja (Device Manager). Žuti uskličnik pokraj pločice znači da nedostaje upravljački program.
  4. Učitaj primjer Blink. Ako LED-ica L trepće, pločica i Arduino IDE rade, a greška je u tvojem programu ili sklopu.

Učitavanje

  1. Poruka avrdude: stk500_getsync(): not in sync ima iste uzroke kao programmer is not responding: pogrešna pločica ili port, port koji koristi drugi program ili nešto spojeno na pinove 0 i 1. Kod nekih klonova pomaže da pritisneš tipku RESET na pločici u trenutku kad počne učitavanje.
  2. Pločica se sama resetira ili se odspoji kad se uključi motor? USB daje samo oko 500 mA. Motore, servomotore i trake LED-ica napajaj iz zasebnog izvora i spoji mase obaju izvora (zabluda 8, zabluda 25).

Prevođenje

  1. Pročitaj cijelu poruku u izlazu. Obavijest dolje desno i završni redak exit status 1 samo kažu da prevođenje nije uspjelo. Što je krivo, piše iznad njih, pa se pomakni prema gore.
  2. warning: nije error:. Upozorenje ne zaustavlja prevođenje, a greška ga zaustavi. Upozorenja iz tuđih biblioteka obično smiješ zanemariti. Ipak je najbolje riješiti i upozorenja, osobito ona iz tvojeg programa: često upozoravaju na grešku koja se pokaže tek kasnije, na primjer na varijablu koju koristiš prije nego što joj zadaš vrijednost. Upozorenje iz biblioteke često nestane kad je nadograđuješ na noviju verziju. Koliko upozorenja Arduino IDE prikazuje, biraš u File → Preferences, pod Compiler warnings.
  3. No such file or directory uz #include znači da biblioteka nije instalirana. Instaliraj je u Upravitelju biblioteka.
  4. undefined reference to 'setup' ili 'loop' znači da nedostaje jedna od dvije obvezne funkcije. Program mora imati obje, makar bila prazna.
  5. Sketch too big ili Not enough memory znači da je program prevelik za Uno, koji ima 32 KB memorije za program i samo 2 KB za varijable. Tekst u ispisu stavi u F(), na primjer Serial.println(F("Pokrenuto!"));, pa ostane u memoriji za program. Koristi manje tipove, byte umjesto int gdje je broj manji od 256, i izbjegavaj String.
    Isto vrijedi za veće stalne tekstove i tablice: ključnom riječju PROGMEM ostaju samo u memoriji za program i ne zauzimaju 2 KB za varijable. Takve podatke ne čitamo izravno, nego posebnim naredbama, a Serial ih ispisuje ovako:
    const char s_help[] PROGMEM = "KONTROLE";  // tekst ostaje samo u memoriji za program
    
    void setup() {
      Serial.begin(9600);
      Serial.println((const __FlashStringHelper *) s_help);  // ispis teksta iz memorije za program
    }
    
    void loop() {
    }
    
  6. Multiple libraries were found for obično nije greška: Arduino IDE samo javlja da je biblioteku našao na dva mjesta i koju je upotrijebio.
  7. Zagrade koje se ne slažu najlakše pronađeš s Auto Format (Ctrl+T). Kad staneš kursorom uz zagradu, Arduino IDE istakne i njezin par.

Kad se program učita, ali ne radi kako treba

  1. Ispisuj što program radi. Dodaj Serial.println() na važna mjesta, na primjer kad se pritisne tipkalo ili prije if, pa u serijskom monitoru vidiš dokle program dođe i koje vrijednosti čita.
  2. Ako se u serijskom monitoru ništa ne pojavi, provjeri ima li program Serial.begin(), je li brzina ista i ispisuje li uopće nešto. Za probu dodaj Serial.println("Halo"); u loop(). Pomaže i da monitor zatvoriš i ponovno otvoriš.
  3. Isključi dio programa. Ako ne znaš koji dio stvara problem, privremeno pretvori sumnjive retke u komentar, s // na početku, pa ih vraćaj jedan po jedan.
  4. Pitaj za pomoć s dovoljno podataka. Voditelju ili na Discordu pošalji poruku greške (tipka Copy error messages), program i opis sklopa, i napiši što si već isprobao.

Dio savjeta preuzet je i prilagođen iz članaka How to Troubleshoot Common Arduino Errors Like a Pro i Troubleshooting Guide for Arduino: Compiling.

Što smo naučili?

  • Arduino IDE je program u kojem pišemo program, prevodimo ga i učitavamo na pločicu, i u kojem vidimo što pločica javlja.
  • Prevoditelj od programa napravi strojni kod, a bootloader na pločici zapiše ga u mikrokontroler.
  • Prije učitavanja odaberemo pločicu (Arduino UNO) i port. Kabel mora prenositi podatke.
  • U serijskom monitoru i u programu mora biti ista brzina, a pinovi 0 i 1 zauzeti su serijskom vezom.
  • Kod greške prvo čitamo prvu poruku i gledamo redak koji javlja i redak prije njega.

Mali kviz

1. Koja je razlika između tipki Provjeri i Učitaj?
Provjeri samo prevede program i javi greške. Učitaj ga prevede i pošalje na pločicu.
2. Pločica svijetli, ali u izborniku nema njezina porta. Što prvo provjeriš?
Kabel. Neki USB kabeli služe samo za punjenje i ne prenose podatke. Ako ni s drugim kabelom nema porta, treba instalirati upravljački program za USB čip.
3. U serijskom monitoru umjesto poruka vidiš čudne znakove. Zašto?
Brzina u serijskom monitoru nije ista kao u naredbi Serial.begin() u programu. Odaberi u monitoru istu brzinu, na primjer 9600.
4. Prevoditelj javlja expected ';' u retku 6. Gdje tražiš grešku?
Na kraju retka 5. Prevoditelj primijeti da nedostaje ; tek kad dođe do sljedećeg retka.
5. Zašto na pinove 0 i 1 ne spajamo ništa dok učitavamo program?
Preko njih ide serijska veza između mikrokontrolera i USB čipa, kojom se program učitava. Ono što je na njih spojeno može smetati vezi, pa učitavanje ne uspije.
6. Što radi bootloader?
To je mali program u mikrokontroleru koji primi strojni kod preko USB-a i zapiše ga u flash memoriju. Zato Uno možemo programirati samo USB kabelom.