Přepínač I2C sběrnice (multiplexer)
Nedávno jsem obdržel dotaz, jak by bylo možné přes I2C připojit k Raspberry Pi více obvodů se stejnou I2C adresou. Normálním způsobem to samozřejmě možné není. Každé zařízení připojené na sběrnici musí mít unikátní I2C adresu. Existují ale obvody, které dokáží I2C sběrnici přepínat. Jedním z nich je například obvod PCA9516. Perfektně se hodí pro práci s Raspberry Pi: - Je napájený pomocí 3,3V - komunikace s RasPi také probíhá na 3,3V napěťových úrovních - na straně u periférií je ale možné komunikační úrovně zvolit (5V, nebo 3,3V) Typické připojení různých periférií (s různou rychlostí i různým napájecím napětím) je vidět na obrázku z katalogového listu. Přepínání na požadovanou sběrnici se provádí pomocí 4 ovládacích pinů. Když jsou piny v "0" je příslušná větev odpojená. Tady je jednoduchý příklad, kterým jsem připojil k RasPi tři obvody ATtiny85 se stejnou I2C adresou. Je to jen příklad. Místo ATtiny je možné použít třeba větší množství čítačů, RTC obvodů, tlakoměrů, měřičů osvětlení a dalších I2C obvodů, které mají jen omezený počet volitelných adres. Schéma: Program: V obvodech ATtiny85 je mírně upravený ukázkový program z knihovny TinyWireS.zip.Úprava spočívá v tom, že jsem zrušil blikání LED, které způsobovalo dlouhou pauzu mezi přijetím čísla a odesláním odpovědi. V každém obvodu pak byla nastavena jiná hodnota, která se před odesláním přičítá k přijatému číslu: - první ATtiny odesílá přijatou hodnotu zvýšenou o 10 - druhé ATtiny přičítá 20 - a třetí ATtiny vrací o 30 větší hodnotu, než přijalo V každém ATtiny byla nastavena stejná I2C adresa: 0x51 ATtiny_1.ino ATtiny_2.ino ATtiny_3.ino Přepínání v Pythonu na Raspberry Pi vypadá třeba takhle (i2cswitch.py):
Výsledek vypadá takto: První číslo ne náhodně vygenerevané číslo od 0 do 9, druhé číslo je odpověď od příslušného ATtiny (přičteno 10, 20, nebo 30).Ukázkové video na YouTube: |