Kako uređaji razgovaraju: UART, I2C i SPI
Kako Arduino, micro:bit i moduli razmjenjuju poruke: bitovi kroz žicu, protokol i takt te veze UART, I2C i SPI, njihovi pinovi i česte greške.

Poruka kroz žicu
Žica može prenijeti samo dva stanja: ima napona (1, HIGH) ili nema napona (0, LOW). U lekciji Dva semafora na križanju to je dovoljno, jer semafor A semaforu B šalje samo dvije poruke: kreni i stani.
Što ako želimo poslati broj, slovo ili cijelu rečenicu? Tada žicom šaljemo nule i jedinice jednu za drugom, kao što svjetiljkom možemo slati Morseov kod: kratko, dugo, kratko. Svako slovo i svaki broj može se zapisati nulama i jedinicama, kao binarni broj.
Dogovor: protokol
Da bi se dva uređaja razumjela, moraju se unaprijed dogovoriti:
- što znači koji signal: koja je nula, koja jedinica i gdje počinje poruka,
- koliko brzo šalju: primatelj mora znati kad završi jedan bit i počne sljedeći,
- tko kada govori: ako oba govore odjednom, nitko nikoga ne razumije.
Takav dogovor zove se protokol. Ljudi imaju isti problem: u razredu se javljamo dizanjem ruke, a u radiovezi kažemo prijem kad smo završili.
Brzinu se može dogovoriti na dva načina:
- Oba uređaja znaju brzinu unaprijed. Kao da se dogovorimo da svaki pljesak traje jednu sekundu. Ako jedan uređaj šalje brže nego što drugi sluša, primatelj čita krive bitove.
- Jedan uređaj šalje takt. Po jednoj žici ide poruka, a po drugoj tik-tak, kao dirigent koji maše palicom. Na svaki tik primatelj pročita jedan bit. Tada brzina nije važna, samo se treba držati takta.
Komunikacija koju već koristiš
- USB kabel između računala i pločice također je serijska veza: USB znači Universal Serial Bus. Njime učitavamo program, a na Arduinu i ispisujemo poruke u serijski monitor.
- Radio micro:bita šalje poruke bez žica, ali po istim pravilima: u lekciji Radio igre svi micro:bitovi moraju biti u istoj grupi, inače se ne čuju.
- Robot Maqueen: kad micro:bit kaže motoru da vozi, ne pali ga izravno. Šalje poruku čipu na robotu, a čip pokreće motore. Ta poruka ide vezom I2C, o kojoj piše dolje.
Tri veze na Arduino radionici
Od ovog mjesta stranica je za Arduino radionicu. Moduli koje spajamo na Arduino gotovo uvijek koriste jednu od tri veze:
| UART | I2C | SPI | |
|---|---|---|---|
| Žice (uz GND) | TX, RX | SDA, SCL | MOSI, MISO, SCK, CS |
| Pinovi Arduina Uno | 0 (RX), 1 (TX) | A4 (SDA), A5 (SCL) | 11, 12, 13 i jedan pin za CS |
| Takt | nema, dogovorena brzina | ima | ima |
| Koliko uređaja | dva | mnogo, svaki ima adresu | mnogo, svaki ima svoj CS |
| Uobičajena brzina | 9600 do 115 200 bitova u sekundi | 100 000 ili 400 000 bitova u sekundi | milijuni bitova u sekundi |
| Primjeri | serijski monitor, MP3 modul DFPlayer | dva Arduina, Maqueen, zasloni s modulom I2C | čitač RFID kartica, LED matrica s MAX7219 |
Za sve tri vrijedi isto pravilo: uređaji moraju imati zajednički GND. Napon na signalnoj žici mjeri se prema masi, pa bez zajedničke mase primatelj ne zna je li to 0 ili 1 (pogledaj zabludu 8).
UART
UART (čita se juart) je najjednostavnija serijska veza. Ima dvije žice, jednu za svaki smjer:
- TX (transmit) šalje,
- RX (receive) prima.
TX jednog uređaja spaja se na RX drugog, i obrnuto: žice se križaju. Ako spojiš TX na TX, oba uređaja govore u istu žicu, a nitko ne sluša.

UART nema takt, pa se oba uređaja moraju dogovoriti o brzini. Zato u programu piše Serial.begin(9600), a u serijskom monitoru biraš istu brzinu, 9600. Ako se brzine ne slažu, u monitoru se pojave čudni znakovi.
Svaka poruka počinje start bitom (žica nakratko padne na 0), zatim slijedi osam bitova podatka, a na kraju stop bit (žica se vrati na 1). Tako primatelj zna gdje počinje svaki bajt.
Na slici je slovo A, koje je u računalu broj 65, binarno 0b01000001. Bitovi idu od najmanjeg: prvo se šalje bit 0, koji vrijedi 1, a zadnji bit 7, koji vrijedi 128. Zato se na žici vidi obrnutim redom: 1, 0, 0, 0, 0, 0, 1, 0.

Na većini pločica Uno pinovi 0 i 1 spojeni su i na USB. Dok je na njih spojen neki modul, učitavanje programa može ne uspjeti, a modul dobije sve što Arduino šalje u serijski monitor. Zato se moduli s vezom UART često spajaju na druge pinove, uz biblioteku SoftwareSerial.
I2C
I2C (čita se i-kvadrat-ce) ima samo dvije žice, a na njih se može spojiti mnogo uređaja:
- SDA (serial data) nosi podatke, u oba smjera,
- SCL (serial clock) nosi takt.
Jedan uređaj je glavni (controller). On šalje takt i odlučuje tko kada govori. Ostali su sporedni (target). U starijim tekstovima zovu se master i slave. Svaki sporedni uređaj ima svoju adresu, broj koji se obično piše heksadecimalno. Čip koji upravlja motorima robota Maqueen ima adresu 0x10. Glavni uređaj na početku poruke pošalje adresu, a javi se samo uređaj s tom adresom. Dva uređaja s istom adresom ne smiju biti na istoj vezi.

Uređaji na vezi I2C liniju mogu samo spustiti na 0. Na 1 je vraćaju pull-up otpornici, obično od 4,7 kΩ, spojeni s linije na napajanje. Većina modula već ih ima na sebi.
Na Arduinu Uno I2C je na pinovima A4 (SDA) i A5 (SCL). Na većini pločica isti su signali izvedeni i na dva pina pokraj pina AREF. U programu vezu I2C koristimo pomoću biblioteke Wire. Tako ćemo povezati i dva Arduina u radionici Dva Una preko I2C-a.
I2C je napravljen za kratke veze unutar jednog uređaja. Na žicama duljim od nekoliko desetaka centimetara signal se izobliči i veza počne griješiti.
SPI
SPI je najbrža od tri veze, ali ima najviše žica:
- MOSI (pin 11) nosi podatke od glavnog prema sporednom uređaju,
- MISO (pin 12) nosi podatke natrag,
- SCK (serial clock, pin 13) nosi takt,
- CS ili SS (chip select) bira uređaj. Svaki sporedni uređaj ima svoju žicu CS, a glavni spusti na 0 žicu onog uređaja s kojim želi razgovarati.

Imena dolaze od engleskih riječi master i slave, pa ih noviji tekstovi zovu COPI i CIPO (controller i peripheral). Na većini pločica Uno LED-ica L spojena je na pin 13, pa dok SPI radi, ona trepće.
Neki moduli koriste samo dio veze SPI. Čip MAX7219, koji upravlja LED matricom, samo prima podatke, pa nema MISO. Ima zato izlaz DOUT, koji se spaja na ulaz sljedećeg čipa. Tako se više matrica spaja u lanac, a Arduino podatke za sve šalje istim trima žicama.
Pazi na napon modula
Arduino Uno radi s 5 V, a mnogi moduli s 3,3 V. Čitač RFID kartica RC522 napaja se s pina 3V3, nikako s pina 5V. Prije spajanja modula pogledaj s kojim naponom radi. Zašto 5 V može oštetiti uređaj od 3,3 V, objašnjava zabluda 9.
Kad veza ne radi
- Nema zajedničkog GND-a. Spoji GND svih uređaja.
- UART: TX i RX nisu križani. TX jednog uređaja ide na RX drugog.
- UART: brzine se ne slažu. Ista brzina mora biti u
Serial.begin(), u serijskom monitoru i u modulu. - UART: modul je na pinovima 0 i 1. Odspoji ga dok učitavaš program ili ga spoji na druge pinove.
- I2C: kriva adresa. Adresa piše u uputama modula. Neki moduli imaju kratkospojnike kojima se adresa mijenja.
- I2C: nema pull-up otpornika ili su žice preduge.
- SPI: dva uređaja imaju isti CS ili je CS nespojen. Svaki uređaj treba svoj pin CS.
- Modul od 3,3 V spojen je na 5 V. Modul se može oštetiti. Pitaj voditelja prije nego što ga ponovno spojiš.
Telegraf, prvi serijski protokol
Prije gotovo 200 godina ljudi su slali poruke telegrafom: jednom žicom između dva grada i prekidačem kojim se struja pali i gasi. Samuel Morse i Alfred Vail osmislili su kod u kojem je svako slovo niz kratkih i dugih signala. Najčešća slova dobila su najkraće znakove: slovo E je samo jedna točka. Telegrafisti su morali slati ujednačenim ritmom, inače bi primatelj krivo pročitao poruku. To je isti problem koji UART rješava dogovorenom brzinom.
Što smo naučili?
- Uređaji razmjenjuju poruke kao nizove nula i jedinica. Dogovor o tome kako se šalju zove se protokol.
- Primatelj mora znati kad počinje svaki bit: ili su se uređaji unaprijed dogovorili o brzini, ili jedan od njih šalje takt.
- UART ima dvije križane žice i dogovorenu brzinu, I2C dvije žice i adrese, a SPI četiri žice i poseban pin CS za svaki uređaj.
- Uređaji koji razgovaraju moraju imati zajednički GND i raditi s istim naponom.
Mali kviz
1. Zašto se uređaji moraju dogovoriti koliko brzo šalju bitove?
2. U serijskom monitoru vidiš samo čudne znakove. Što prvo provjeriš?
Serial.begin() u programu.3. Kako se spajaju žice TX i RX dvaju uređaja?
4. Na istu vezu I2C spojena su tri modula. Kako znaju kojem je poruka namijenjena?
5. Zašto veza SPI ima pin CS?
6. Zašto čitač RFID kartica RC522 ne smiješ napajati s pina 5V?