I2C vodilo je popularen vmesnik pri mnogo različnih proizvajalcih čipov in senzorjev, analogno digitalnih pretvornikov, ur realnega časa in temperaturnih ter drugih digitalnih senzorjev. Arduino okolje podpira I2C komunikacijo preko wire knjižnjice.
I2C in SPI protokol z Arduinom

Najprej vezava
Ker je I2C protokol preobširen, da bi na tem mestu zajeli vse možnosti, bomo o njemu povedali le najnujnejše, da lahko razumemo postopek in procedure, ki jih ponuja knjižnjica wire. Še prej pa se ustavimo malo pri gornji shemi. Senzor TMP102 deluje med 1,4V do 3,6V, zato mu napajanje vežemo na Arduinov 3,3V izhod. Kaj pa SDA in SCL? SDA in SCL preko 4,7k ohm dvižnih uporov vežemo na isto napetost. I2C namreč deluje preko odprtega kolektorja. To pomeni, da naprava, ki uporablja linijo, vklaplja ali izklaplja “stikalo”, ki linijo spušča na ničelni nivo. Stikalo je seveda tranzistor. To je dobra novica za nas, saj to pomeni, da nas 5V Ardunovo napajanje senzorja ne bo motilo. Tudi ko bo Arduino pošiljal podatke senzorju, senzor ne bo “videl” 5V, ampak napetost 3,3V. No, da bo to čisto res, moramo narediti še nekaj. Arduino ima namreč na SDA in SCL priključkih že “vgrajene” dvižne upore z vrednostjo okoli 10kohm. Na srečo jih lahko izklopimo. To storimo najlaže tako, da v datoteki twi.c, ki jo kliče knjižnica wire v proceduri twi_init(void), zakometiramo vrstici:
// sbi(PORTC, 4);
// sbi(PORTC, 5);
če imate različico Arduino IDE 022 ali starejšo, oziroma vrstici
// digitalWrite(SDA, 1);
// digitalWrite(SCL, 1);
če imate različico Arduino1.0 ali novejšo. Najdete jo v mapi ArduinoXXlibrariesWireutility. V nasprotnem primeru bi imeli opravka z delilnikom napetosti in senzor bi bil izpostavljen napetosti nekje med 5 in 3,3V. Ta mali “trik”, ki smo ga izvedli, nas razbremeni pretvornika napetosti, ki bi sicer bil potreben za komunikacijo med dvema napravama, ki delujeta pri različnih napetostih. Moramo pa preveriti še nekaj. Senzor bo torej že res “videl” prave napetosti za logično ničlo in enico (0V in 3,3V), kaj pa Arduino? Bo 3,3V dovolj za logično enko? Ta odgovor najdemo na Atmelovi spletni strani, v uporabniškem priročniku čipa ATmega328P v tabeli 29-1, kjer piše, da je minimalna napetost, ki jo bo čip vedno razpoznal kot logično enico 0,6* Vcc, kar znese okroge 3V. Lahko si dokočno oddahnemo, prihranili smo na pretvorniku logičnih nivojev, kljub temu pa imamo vezavo po specifikacijah.
I2C protokol je namenjen povezavi več naprav preko samo dveh podatkovnih žic. To je izvedeno tako, da ima vsaka naprava svoj naslov, preko katere jo nadrejeni (v našem primeru Arduino) nagovori, ona pa mu lahko odgovori nazaj. Govori lahko samo ena naprava naenkrat in vedno je nadrejena naprava tista, ki sproži komunikacijo s podrejenimi. Koliko naprav je mogoče povezati na isti liniji? Za naslavljanje je na voljo 7 bitov: torej načeloma lahko priklopimo do 128 naprav. Fizična meja je velikokrat mnogo nižja in je odvisna od dimenzij povezav, saj te prinašajo s sabo kapacitivnosti, ki popačijo signale. Za pest naprav z dolžinami povezav do 50cm je zelo malo možnosti, da bomo imeli težave. Velja, da manjši kot je dvižni upor, manj popačen signal imamo, vendar je najmanša vrednost, ki nam jo dopušča ATmega328P mikrokontroler, 1,5k ohm.
Komunikacijo vedno prične nadrejeni, tako da SDA nivo potegne na nizko stanje, ko je SCL nivo visok. Temu rečemo startni pogoj. Nato pošlje 8 bitov: prvih sedem bitov sestavlja naslov naprave, ki jo želi nagovoriti, 8. bit pa določa, ali želimo v napravo pisati ali brati. Če je na linijah več naprav, bodo vse naprave, razen naslovljene, ignorirale sporočilo. Kolikokrat bomo na neko napravo pisali oziroma z nje brali, je odvisno od naprave in njenih registrov.
Programiranje z Arduino (6)
Tempero d.o.o. Vipavska 4e
5270 Ajdovščina


