Arduino i Visual Studio Code: veći projekti s PlatformIO-om

Kako programirati Arduino u Visual Studio Codeu s PlatformIO-om: instalacija, projekt i platformio.ini, main.cpp, biblioteke i program u više datoteka.

Arduino Info
Laptop s programom u uređivaču s tamnom bočnom trakom, spojen USB kabelima na dvije plave pločice mikrokontrolera, a pokraj njih nekoliko žica

Što su Visual Studio Code i PlatformIO?

Visual Studio Code, kraće VS Code, besplatan je uređivač programa tvrtke Microsoft. PlatformIO je dodatak (extension) za VS Code koji od njega napravi razvojno okruženje za mikrokontrolere: prevodi program, učitava ga na pločicu, ima serijski monitor i brine o pločicama i bibliotekama.

Ova stranica je za Arduino radionicu i nastavlja se na stranicu Arduino IDE, pa pretpostavlja da već znaš učitati program na pločicu i koristiti serijski monitor. VS Code s PlatformIO-om koristimo kad program naraste i na njemu radi više ljudi, kao na radionicama o fliperu.

Arduino IDE ili VS Code?

Arduino IDEVS Code s PlatformIO-om
Za početaknajjednostavnijitreba više postavljanja
Programjedna datoteka .ino, ostale kao karticemnogo datoteka .cpp i .h u mapama
Pomoć pri pisanjuosnovnadovršava riječi, podcrta greške dok pišeš, skače na definiciju
Bibliotekeinstalirane za cijelo računalozapisane u projektu, s verzijom, pa svi u timu imaju iste
PločiceArduino i mnoge drugeArduino, ESP32 i stotine drugih
Serial Plotterimanema ugrađen
Računaloradi i na sporijimatraži više memorije i prostora

Arduino IDE i VS Code nisu suparnici: za brzo isprobavanje i dalje je zgodniji Arduino IDE, a za veći projekt VS Code.

Instalacija

  1. Preuzmi VS Code sa službene stranice, code.visualstudio.com. Za Windows postoji i inačica koja ne treba administratorska prava (User Installer).
  2. U VS Codeu otvori Extensions (ikona s četiri kvadratića na traci lijevo, Ctrl+Shift+X), potraži PlatformIO IDE i klikni Install.
  3. Pričekaj: PlatformIO sam instalira svoju jezgru (PlatformIO Core). To traje nekoliko minuta i treba internet. Kad završi, zatraži da ponovno pokreneš VS Code.
  4. Kad prvi put prevodiš projekt za Uno, PlatformIO preuzme još prevoditelj i podršku za pločicu. I to traje nekoliko minuta.

Upravljački program za USB čip na pločici isti je kao za Arduino IDE, pa pogledaj Spajanje pločice ako se port ne pojavi.

Pazi na hrvatska slova u putanji. PlatformIO ne podržava putanje sa slovima kao što su č, ć, đ, š i ž. Projekte zato spremaj u mapu bez njih, na primjer C:\projekti\fliper, a ne u C:\Users\Ivančić\Documents.

Za voditelja: pripremi računala prije radionice

  • Na svako računalo instaliraj VS Code i PlatformIO i jednom prevedi probni projekt za Uno, da se sve potrebno preuzme. Na školskoj mreži to može trajati dugo ili ne uspjeti.
  • VS Code i PlatformIO šalju podatke o korištenju (telemetriju). U VS Codeu je isključiš u postavkama (Ctrl+,): potraži telemetry i postavi telemetry.telemetryLevel na off. U PlatformIO-u u terminalu upiši pio settings set enable_telemetry No.
  • VS Code nudi prijavu računom tvrtke Microsoft ili GitHub, na primjer za AI asistenta Copilot. Na računalima za radionicu ne prijavljuj se i ne traži od polaznika da se prijave.
  • Napravi mapu za projekte bez hrvatskih slova u putanji.

Novi projekt

  1. Klikni ikonu PlatformIO na traci lijevo (glava s dvije antene), pa PIO Home → Open. Isto otvara i kućica na statusnoj traci dolje.
    PIO Home u VS Codeu: lijevo izbornik Home, Projects, Inspect, Libraries, Boards, Platforms i Devices, u sredini logotip PlatformIO-a, a desno pod Quick Access tipke New Project, Import Arduino Project, Open Project i Project Examples
    Na početnoj stranici, pod Quick Access, su tipke za novi projekt, za uvoz programa iz Arduino IDE-a i za otvaranje projekta. Lijevo su Projects (tvoji projekti), Libraries (biblioteke), Boards (pločice) i Devices, popis spojenih pločica s njihovim portovima.
  2. Klikni New Project. Upiši ime, bez razmaka i hrvatskih slova, u polju Board potraži Arduino Uno, kao Framework ostavi Arduino, odaberi mapu i klikni Finish.
  3. PlatformIO napravi mapu projekta:
Mapa novog projekta PlatformIO u VS Codeu: mape .pio, include, lib, src s datotekom main.cpp i test, te datoteka platformio.ini, označene brojevima 1 do 6
  1. platformio.ini: postavke projekta, na primjer pločica, brzina serijskog monitora i biblioteke.
  2. src/main.cpp: program, s funkcijama setup() i loop().
  3. include: datoteke .h koje koristi više dijelova programa.
  4. lib: vlastite biblioteke projekta.
  5. test: za automatske testove. Na radionici ga ne koristimo.
  6. .pio: ono što PlatformIO napravi pri prevođenju. Ne mijenjaj je i ne šalji je drugima. Ako je izbrišeš, PlatformIO je napravi ponovno.

Datoteka platformio.ini

Novi projekt za Uno ima ovakve postavke. Redak monitor_speed dodaj sam:

[env:uno]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 9600
  • [env:uno] je okruženje (environment) s imenom uno: skup postavki za jednu pločicu.
  • platform = atmelavr je obitelj mikrokontrolera, AVR, kojoj pripada ATmega328P na Unu.
  • board = uno je pločica.
  • framework = arduino znači da programiramo Arduino naredbama, kao u Arduino IDE-u.
  • monitor_speed = 9600 je brzina serijskog monitora. Mora biti ista kao u Serial.begin().

Kasnije ovdje dodajemo biblioteke (lib_deps) i port (upload_port). Redak koji počinje s ; je komentar.

main.cpp umjesto .ino

U PlatformIO-u program je obična datoteka C++. Arduino IDE datoteci .ino prije prevođenja sam doda dvije stvari, a ovdje ih pišemo sami:

  1. #include <Arduino.h> na vrhu. Bez njega prevoditelj ne poznaje pinMode(), digitalWrite() i ostale Arduino naredbe.
  2. Deklaraciju funkcije koju koristiš prije nego što je napisana: prvi redak funkcije, sa ; na kraju.
#include <Arduino.h>

void trepni(unsigned int trajanje);  // deklaracija: funkcija je napisana niže

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  trepni(500);
}

void trepni(unsigned int trajanje) {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(trajanje);
  digitalWrite(LED_BUILTIN, LOW);
  delay(trajanje);
}

Bez deklaracije prevoditelj javi error: 'trepni' was not declared in this scope, jer funkciju vidi tek ispod loop(). Uz grešku predloži i suggested alternative: ‘strspn’, funkciju koja s našim programom nema veze: prijedlozi prevoditelja nisu uvijek točni. Umjesto deklaracije funkciju možeš i napisati iznad mjesta na kojem je koristiš.

Prevođenje, učitavanje i serijski monitor

Pojednostavljeni prozor VS Codea s PlatformIO-om. Lijevo je traka s ikonama Explorer (1), Extensions (2) i PlatformIO (3), pokraj nje mapa projekta, u sredini uređivač s programom (4), ispod njega terminal (5), a na statusnoj traci dolje tipke Build (6), Upload (7) i Serial Monitor (8)
  1. Explorer (Ctrl+Shift+E): mape i datoteke projekta.
  2. Extensions: dodaci za VS Code. Ovdje instaliraš PlatformIO.
  3. PlatformIO: PIO Home i Project Tasks, popis svih naredbi projekta (Build, Upload, Monitor, Clean…).
  4. Uređivač: ovdje pišeš program.
  5. Terminal: poruke prevođenja i učitavanja, i serijski monitor.
  6. Build (kvačica, Ctrl+Alt+B): prevede program.
  7. Upload (strelica, Ctrl+Alt+U): prevede program i učita ga na pločicu.
  8. Serial Monitor (utikač, Ctrl+Alt+S): otvori serijski monitor u terminalu.

Na statusnoj traci su i kućica (PIO Home), kanta (Clean, obriše prevedeno, pa sljedeće prevođenje krene ispočetka) i terminal PlatformIO-a. U novijim inačicama tipke Build i Upload su i gore desno, iznad uređivača. Ako u novijoj inačici tipke izgledaju drukčije, svaku naredbu nađeš i u paleti naredbi: Ctrl+Shift+P, pa upiši na primjer PlatformIO: Upload.

  • Port PlatformIO obično pronađe sam. Kad je spojeno više pločica, kao četiri Una na fliperu, upiši port u platformio.ini: upload_port = COM5 i monitor_port = COM5.
  • Serijski monitor radi u terminalu. Zatvara se s Ctrl+C. Ako učitavanje ne uspije jer je port zauzet, zatvori monitor i pokušaj ponovno.

Serijski monitor u terminalu VS Codea: piše Terminal on COM1 | 9600 8-N-1, popis filtara i u zadnjem retku Quit: Ctrl+C, Menu: Ctrl+T, Help: Ctrl+T followed by Ctrl+H
Kad se monitor otvori, u prvim redcima javi port i brzinu, ovdje COM1 i 9600, a u zadnjem kako se zatvara (Ctrl+C) i otvara njegov izbornik (Ctrl+T). Ispod toga pojavljuju se poruke s pločice.

Biblioteke

  1. Otvori PIO Home → Libraries i potraži biblioteku, na primjer RTClib za modul sata.
  2. Klikni na nju, pa Add to Project, odaberi svoj projekt i klikni Add.

PlatformIO biblioteku upiše u platformio.ini:

lib_deps =
    adafruit/RTClib @ ^2.1.4

To znači: biblioteka RTClib autora adafruit, verzija 2.1.4 ili novija, ali ne 3.0 i dalje, jer bi ona mogla raditi drukčije. PlatformIO je preuzme u mapu .pio kad spremiš platformio.ini, ili najkasnije pri prvom prevođenju. Budući da je biblioteka zapisana u projektu, svi u timu dobiju istu verziju, a na novom računalu ne treba ništa instalirati ručno. Vlastite biblioteke projekta spremaš u mapu lib, svaku u svoju mapu.

VS Code s otvorenom datotekom platformio.ini projekta za pločicu ESP32-S3, u kojoj je lib_deps adresa biblioteke LCDGraph na GitHubu. U izlazu ispod piše Library Manager: LCDGraph@1.2.0 has been installed i Project has been successfully updated
Biblioteku koje nema u PlatformIO-ovu popisu možeš dodati i adresom njezina repozitorija na GitHubu, kao na slici, u projektu za pločicu ESP32-S3. Kad spremiš platformio.ini, PlatformIO je preuzme i u izlazu (Output) javi has been installed. Tako dodana biblioteka nema stalnu verziju, pa za timski projekt radije biraj biblioteku s popisa.

Program u više datoteka

Kad program naraste, podijelimo ga na dijelove: na fliperu, na primjer, lampice, zavojnice i rezultat. Svaki dio ima dvije datoteke:

  • .h (header) kaže što dio nudi: popis funkcija.
  • .cpp kaže kako to radi: same funkcije.

src/lampice.h:

#pragma once
#include <Arduino.h>

// Lampice na pinovima 5, 6 i 7
void lampicePocetak();
void lampiceTrepni(byte pin, unsigned int trajanje);

src/lampice.cpp:

#include "lampice.h"

const byte LAMPICE[] = {5, 6, 7};

void lampicePocetak() {
  for (byte pin : LAMPICE) {
    pinMode(pin, OUTPUT);
  }
}

void lampiceTrepni(byte pin, unsigned int trajanje) {
  digitalWrite(pin, HIGH);
  delay(trajanje);
  digitalWrite(pin, LOW);
}

src/main.cpp:

#include <Arduino.h>
#include "lampice.h"

void setup() {
  lampicePocetak();
}

void loop() {
  lampiceTrepni(5, 200);
  lampiceTrepni(6, 200);
  lampiceTrepni(7, 200);
}
  • #pragma once na vrhu datoteke .h pazi da se ona uključi samo jednom, i kad je uključuje više datoteka.
  • Vlastitu datoteku uključujemo s navodnicima, #include "lampice.h", a biblioteku sa šiljastim zagradama, #include <Arduino.h>.
  • Popis pinova LAMPICE je samo u lampice.cpp, pa ga ostali dijelovi programa ne vide i ne mogu ga slučajno promijeniti.

Kad svatko u timu radi na svojem paru datoteka, manje si smetaju, a program je pregledniji.

Više pločica u jednom projektu

Fliper ima četiri Una, a svaki ima svoj program. Svi mogu biti u jednom projektu: zajedničke postavke pišemo u odjeljak [env], a za svaku pločicu dodamo njezino okruženje, koje prevodi samo njezinu mapu u src:

; zajedničke postavke za sve pločice
[env]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 9600

; Uno s pravilima igre: prevodi samo src/igra
[env:igra]
build_src_filter = +<igra/>

; Uno koji upravlja zavojnicama: prevodi samo src/zavojnice
[env:zavojnice]
build_src_filter = +<zavojnice/>

U Project Tasks svako okruženje ima svoje naredbe Build i Upload. Svakom okruženju dodaj i upload_port njegove pločice, da program ode na pravi Uno.

Pomoć uređivača

  • Dovršavanje riječi: dok pišeš, VS Code nudi imena funkcija i varijabli. Tab ili Enter prihvati prijedlog.
  • Greške dok pišeš: crvena valovita crta pod greškom, a popis svih grešaka u panelu Problems (Ctrl+Shift+M).
  • F12 (Go to Definition) skoči na mjesto gdje je funkcija ili varijabla napisana, i kad je u drugoj datoteci.
  • F2 (Rename Symbol) promijeni ime funkcije ili varijable svugdje u projektu odjednom.
  • Shift+Alt+F (Format Document) uredno poravna uvlake.
  • Ctrl+Shift+F traži riječ u svim datotekama projekta.

VS Code s programom kojemu u retku 17, iza delay(trajanje), nedostaje točka-zarez: kraj retka je podcrtan crvenom valovitom crtom, kartica Problems ima broj 2, a u terminalu piše src/main.cpp:17:18: error: expected ';' before '}' token i FAILED
Na slici nedostaje ; u retku 17. VS Code to podcrta već dok pišeš, kartica Problems broji greške, a Build u terminalu javi grešku i FAILED. Projekt na slici je za pločicu ESP32, čiji noviji prevoditelj javi baš redak 17. Prevoditelj za Uno istu grešku javi u sljedećem retku, kao u Arduino IDE-u.

Ponekad VS Code podcrta nešto što se ipak uredno prevede, na primjer odmah nakon što napraviš projekt. Pravi ispit je Build. Ako crte ne nestanu ni nakon uspješnog prevođenja, u paleti naredbi pokreni PlatformIO: Rebuild IntelliSense Index.

Kad nešto ne radi

  • Greške pri prevođenju iste su kao u Arduino IDE-u, jer je i prevoditelj isti. Pogledaj savjete za traženje grešaka.
  • was not declared in this scope nakon prebacivanja programa iz Arduino IDE-a: nedostaje #include <Arduino.h> ili deklaracija funkcije.
  • Port je zauzet: zatvori serijski monitor (Ctrl+C u terminalu) i učitaj ponovno.
  • Program je otišao na pogrešnu pločicu: provjeri okruženje i upload_port.
  • Instalacija ili prevođenje javlja čudne greške o putanjama: provjeri ima li u putanji projekta hrvatskih slova.

Prebacivanje programa iz Arduino IDE-a

  • U PIO Home → Projects klikni Import Arduino Project i odaberi mapu programa .ino. PlatformIO od njega napravi projekt.
  • Ili ručno: napravi novi projekt, kopiraj program u src/main.cpp, na vrh dodaj #include <Arduino.h> i deklaracije funkcija, a biblioteke dodaj u lib_deps.

Što smo naučili?

  • PlatformIO je dodatak za VS Code koji prevodi i učitava programe za mikrokontrolere i brine o pločicama i bibliotekama.
  • Postavke projekta, pločica, brzina i biblioteke s verzijama, zapisane su u platformio.ini, pa svi u timu rade s istima.
  • U main.cpp sami pišemo #include <Arduino.h> i deklaracije funkcija, što Arduino IDE radi sam.
  • Veći program dijelimo na dijelove, svaki s datotekom .h i .cpp.
  • Projekte spremamo u mapu bez hrvatskih slova u putanji.

Mali kviz

1. Što je PlatformIO?
Dodatak za Visual Studio Code koji prevodi programe za mikrokontrolere, učitava ih na pločicu, ima serijski monitor i brine o pločicama i bibliotekama.
2. Zašto je timu korisno što su biblioteke zapisane u platformio.ini?
Svi u timu, i na svakom računalu, dobiju iste biblioteke u istoj verziji, a PlatformIO ih sam preuzme. Ne može se dogoditi da kod jednoga program radi, a kod drugoga ne, zbog druge verzije biblioteke.
3. Program se u Arduino IDE-u prevodi, a u PlatformIO-u javlja 'digitalWrite' was not declared in this scope. Što nedostaje?
#include <Arduino.h> na vrhu datoteke main.cpp. Arduino IDE ga datoteci .ino doda sam.
4. Zašto projekt ne smiješ spremiti u mapu C:\Users\Šime\Documents?
U putanji je slovo š. PlatformIO ne podržava putanje sa slovima č, ć, đ, š i ž, pa prevođenje ili instalacija mogu javljati čudne greške.
5. Što pišemo u datoteku .h, a što u .cpp?
U .h popis onoga što dio programa nudi, deklaracije funkcija. U .cpp same funkcije, kako to radi.
6. Na računalo su spojena četiri Una. Kako paziš da program ode na pravi?
Svakom okruženju u platformio.ini upišem upload_port njegove pločice i učitavam iz okruženja te pločice.