LAKI PINGVINI Bez svađe na I2C
Više puta smo pisali o I2C protokolu gde se komunikacija između dva uređaja odvija upotrebom samo dve žice. Mikrokontroler uspostavlja komunikaciju sa uređajem na određenoj adresi, bez obzira koliko ih ima na toj liniji. Mnogi uređaji dozvoljavaju odabir I2C adresa, u slučaju da je potrebno više istih povezati, da ne bi došlo do konflikta. Međutim, šta uraditi ako imamo dva uređaja sa istom I2C adresom koju ne možemo promeniti? Postoji dosta senzora koji imaju fiksnu I2C adresu. Rešenje dolazi u I2C proširivačima. Na stolu imamo TCA9548A svič koji dolazi iz Texas Instrumentsa i koji se sa mikrokontrolerom povezuje putem istog I2C interfejsa. TCA9548A je uređaj koji ima osam dvosmernih svičeva kojima se može kontrolisati putem I2C interfejsa. Ovaj čip ima jedan par ulaznih I2C parova i osam takvih izlaznih. Svaki od ovih kanala ili kombinacija više njih se može odabrati. Na ovaj način rešavamo konflikte slave I2C uređaja sa istim adresama. Mikrokontroler u svakom trenutku može da resetuje čip, a samim tim i slave uređaje u nizu. Ono što je takođe zanimljivo, TCA9548A je konstruisan tako da bez obzira na napon ’VCC’ samog čipa, on bez problema može raditi sa uređajima na nižim naponima. Čip dolazi u TSSOP24 i VQFN24 pakovanjima koji su sve, samo nisu podesni za prototipsku ploču, te smo za potrebe testa nabavili TSSOP24 varijantu u formi modula. Modul je, naravno, direktna kopija rešenja iz Adafruit kuhinje. Oznaka PW548 na samom čipu ne treba da zbuni, jer govorimo o fabričkom označavanju. Kompletan pinout je izveden i modul napajamo preko ’Vin’ i ’GND’ naponima od tri do pet volti. Obično koristimo napon koji koristi i sam mikrokontroler. ’SCL’ i ’SDA’ su pinovi I2C interfejsa samog čipa. Preko ’RST’ pina resetujemo čip dovođenjem logičke nule. Na raspolaganju nam je odabir I2C adrese samog čipa preko ’A0-2’ koji su na modulu postavljeni „LOW” te daju adresu „0x70”. Adafruit modul ispod nudi mogućnost promene ovih adresa putem tri solder jointa, takođe imamo i trace za pull-up, što ovde nema. Pinovi ’SDx’ i ’SCx’ su pinovi proširivača, oni nemaju pull-up, i svi su tolerantni na pet volti. Sa mikrokontrolerom povezujemo čip, kao što bismo povezali i bilo koji drugi I2C uređaj. Naš Arduino ima namenski port za I2C OLED ekran, što smo iskoristili uz TCA9548A, a I2C skener ih je uredno prepoznao. Da sve ovo ne bude malo, dodali smo na proširivač BME280 koji je na adresi „0x76”. Osim što možemo fizički videti da smo BME280 povezali na ’SD4’ i ’SCL4’ čipa, to možemo i I2C skenerom kojeg smo preuzeli sa Adafruit stranica koji će nam prijaviti svaki uređaj po portu. Za prvi test smo ovom BME280 dodali I2C LCD ekran na istom proširivaču, ali na portu 7. Naš osnovni setup sada ima TCA9548A na I2C linijama direktno vezan sa mikrokontrolerom i BME280 i I2C LCD preko proširivača. #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <LiquidCrystal_I2C.h> Adafruit_BME280 bme; LiquidCrystal_I2C lcd(0x27,16,2); float t, h; void TCA9548A(uint8_t i) { if (i > 7) return; Wire.beginTransmission(0x70); Wire.write(1 << i); Wire.endTransmission(); } void setup() { Serial.begin(9600); TCA9548A(4); bme.begin(); TCA9548A(7); lcd.begin(); lcd.backlight(); } void loop() { TCA9548A(4); t = bme.readTemperature(); h = bme.readHumidity(); Serial.println(t); Serial.println(h); TCA9548A(7); lcd.setCursor(0,0); lcd.print((String)t + „ C”); lcd.setCursor(0,1); lcd.print((String)h + „ %”); delay(1000); } U ovom primeru imamo neophodne biblioteke za senzor i ekran. Funkcija TCA9548A nam uspostavlja komunikaciju sa određenim portom. Istim portom na kome imamo I2C uređaj. Pozivanjem funkcije uz broj porta, recimo 4, mi se direktno obraćamo Boschovom temperaturnom senzoru, jer je ovaj na njega povezan. Na isti način u setup funkciji inicijalizujemo senzor i ekran, i na isti način u loopu ih korisitmo. Imamo i vrlo zanimljivu biblioteku (github.com/WifWaf/TCA9548A) koju nismo koristili, jer je i naš primer zaista minimalan. Imajte na umu da je pin modula ’RST’ već postavljen u „HIGH”. U nekom projektu, svakako ćemo ga vezati na mikrokontroler radi njegovog korišćenja i resetovanja kompletnog I2C busa na proširivaču. Podatke dobijene preko ovog proširivača, mi možemo preusmeriti i na druge uređaje na I2C liniji i van proširivača, a i obratno. U primeru ispod ćemo koristiti OLED na našem Arduinu da uporedo prikažemo dobijene podatke. #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <LiquidCrystal_I2C.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Adafruit_BME280 bme; LiquidCrystal_I2C lcd(0x27,16,2); float t, h; Adafruit_SSD1306 display(128, 64, &Wire, 4); void TCA9548A(uint8_t i) { if (i > 7) return; Wire.beginTransmission(0x70); Wire.write(1 << i); Wire.endTransmission(); } void setup() { Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F(„SSD1306 allocation failed”)); for(;;); } display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.display(); TCA9548A(4); bme.begin(); TCA9548A(7); lcd.begin(); lcd.backlight(); } void loop() { TCA9548A(4); t = bme.readTemperature(); h = bme.readHumidity(); Serial.println(t); Serial.println(h); TCA9548A(7); lcd.setCursor(0,0); lcd.print((String)t + „ C”); lcd.setCursor(0,1); lcd.print((String)h + „ %”); display.clearDisplay(); display.setCursor(0,0); display.print((String)t + „ C”); display.setCursor(0,50); display.print((String)h + „ %”); display.display(); delay(1000); } Ovaj skeč ne treba dodatno pojašnjavati. Ako imate na umu neki projekat koji će koristiti uređaje sa konfliktnim I2C adresama, ovaj proširivač je idealno rešenje. O samom I2C interfejsu nećemo ovaj put pisati nešto više, iz razloga što pripremamo seriju tekstova o svim interfejsima i njihovoj praktičnoj primeni. Do tada, stay tuned.
|
||||||||||
Najčitanije
Igre
Telefoni
Hardver
Softver
Nauka
Doom: The Dark Ages Doom iz mračnog doba drugačiji je od svih drugih Doomova, jer je Slayer koncipiran kao tenk sa štitom... Clair Obscur: Expedition 33 Estetika Belle Époquea, gameplay u skladu sa kanonima JRPG-a, vrhunsko pripovedanje i ljubav prema igrama... Computex 2025, Tajpej, Tajvan AI NEXT Ovaj, nekada ultra-PC-specifični sajam, odavno se proširio na srodne tehnologije, biznis rešenja i digitalne usluge, postavši varijanta azijskog C... Gigabyte GeForce RTX 5070 Gaming OC 12G Višak samopouzdanja Kartica je sa hardverske strane vrlo kvalitetna, ali ništa ne može da nadomesti nedostatak snage „pod haubom”... Asus ProArt P16 (H7606WP) Pronalazak neverovatnog Novi ProArt P16 donosi moderna rešenja, u dobro usaglašenom odnosu gabarita i performansi – alatka koju ćete sa ponosom nosati sa sobom... Logitech ProX Superlight 2 Sve udvostručeno Ovaj miš predstavlja jasnu indikaciju da najveći proizvođač ne želi da napusti nijedan segment tržišta... Winhance 25.05 Popravka Prozora U pitanju je alatka koja omogućava da se brzo rešite (većine) bloatwarea, ali i da obavite optimizaciju rada Windowsa... .rs: Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije Unapređeno e Zakazivanje Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije Google Mariner, Google Astra i AI autonomni agenti Uspon tihog softvera Umesto kliktanja stručnog lica, softver će, već ove godine, u tihom, gotovo nečujnom načinu rada - završavati posao... Fatal Fury: City of the Wolves Fatal Fury je oduvek bio čudna cvećka u svetu borilačkih igara; takav je i ostao... Arc Raiders Novi extraction shooter iz pera autora dobrih delova franšize Battlefield (i potcenjenog The Finals)... |
||||||||||