2. februarja, 2014

Programiranje z Arduino (6)

Revija 216 216 43 - Programiranje z Arduino (6)Revija logo tempero - Programiranje z Arduino (6)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

Revija 216 216 43%20%281%29 - Programiranje z Arduino (6)I2C je razvil Philips, z namenom zmanjšati število žic med čipi v televizijskih aparatih. Sam protokol ni zaščiten s patenti, I2C poimenovanje ter logo pa sta registrirana, zato je Atmel komunikacijo poimenoval TWI (two wire interface). Protokola sta identična. Protokol se imenuje dvo-žični protokol, ker za prenos informacij potrebuje dve povezavi, poleg seveda dveh povezav za napajanje. Pri Arduinu najdemo ti dve povezavi na priključkih A5 in A4, torej na analognih vhodih, ki pa lahko delujeta kot I2C vrata in imata za to vso strojno podporo v čipu samem. Priključek A5 je v tem kontekstu poimenovan SCL in daje komunikaciji takt. Priključek A4 je poimenovan SDA in služi prenosu podatkov v obe smeri. V katero smer poteka komunikacja določa nadrejena naprava (master). I2C omogoča več konfiguracij, tudi z več nadrejenimi. Za uvod si bomo pogledali komunikacijo s senzorjem temperature Texas Instruments TMP102, kjer bo Arduino nadrejena, senzor pa podrejena (slave) naprava.

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.Revija 216 216 43%20%282%29 - Programiranje z Arduino (6)

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.

Celotni članek

Programiranje z Arduino (6)

Tempero d.o.o. Vipavska 4e

5270 Ajdovščina

www.tehnologija.biz

2014_SE216_43