Nefunguje I2C čidlo! Popsali jsme nejčastější důvody.

Nefunguje čidlo připojené přes sběrnici I2C? Sepsali jsme článek, který by ti měl pomoc chybu najít a vyřešit.
Možné problémy s I2C

Sběrnice I2C (čteme I-squared-C) je jedna z nejpoužívanějších sběrnic vůbec. I když byla navržena pro použití mezi komponenty na desce – tedy žádné dlouhé vzdálenosti, najdou se takoví ostrostřelci, kteří čidlo připojí přes celý dům.

Tobě ale nefunguje čidlo ani na 5cm? Pojďme se společně podívat na to, kde by mohla být chyba. Sepsali jsme několik nejčastějších příčin.

Poznámka: pokud si nejsi jistý, jak vlastně I2C sběrnice funguje, mrkni na tento popis z wiki.

Chybí pull-up rezistory

Z podstaty funkce I2C sběrnice, datové vodiče – tedy SDA (data) a SCL (clock, hodiny) potřebují pull-up rezistory. To jsou rezistory připojené mezi vodič (odděleně SDA a SCL) a napájení čidla.
Pokud tedy čidlo nefunguje, velmi častý problém jsou právě chybějící pull-up rezistory nebo jejich špatná hodnota.
Nejčastěji se osazuje 4k7, ale správná hodnota by měla být odvozena od množství připojených I2C zařízení, délky vodičů a v neposlední řadě i rychlosti komunikace.
Čím delší vzdálenost mezi I2C zařízeními, tím menší by měla být i hodnota pull-up rezistorů. Hodnota by ale neměla být menší než 2k7.

Délka vodičů nebo špatné použití vodičů

Jak jsme napsali výše, správná hodnota pull-up rezistorů by měla být odvozena od počtu zařízení, rychlosti a také vzdálenost respektive kapacity vedení. I2C sběrnice definuje maximální kapacitu 400pF. Čím vyšší je kapacita vedení, tím nižší by měla být i hodnota pull-up rezistorů.
Vyšší kapacita totiž ovlivňuje hrany během komunikace a může se stát, že si zařízení prostě nebudou rozumět.
Méně než 2k7 by ses ale dostat neměl – pokud ti to ani pak nefunguje, vyměň kabel za ten s nižší kapacitou a nebo je prostě chyba jinde.

Prohozené datové vodiče

Častou chybou bývají prohozené vodiče SDA a SCL. Člověk je zvyklý, že u UART sběrnice se musí prohazovat RX -> TX a naopak a nevědomky to třeba udělá i u I2C sběrnice.
U I2C sběrnice musí SDA prvního zařízení být připojeno na SDA druhého zařízení a to samé i pro SCL.

Pokud nechcete udělat chybu v zapojení mezi čidlem a deskou, pak můžete zvolit řešení v podobně I2C uŠup konektoru a kabelu. Tento kabel s definovaným pinoutem a také zámkem zajišťuje vždy správné propojení desky a modulů.
Jen je potřeba dát pozor na nákup správného typu kabelu, ten musí mít označení μŠup nebo STEMMA QT nebo Qwiic JST-SH 4-pin.

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 5cm

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 10cm

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 20cm

Napájení

Dalším z možných problémů je velmi slabé napájení, kdy během funkce čidla – například během měření – poklesne napájení v důsledku vyššího odběru proudu a tím selže i komunikace.
Obdobný problém může způsobit i špatně propojená zem – GND.

Rozdílné logické úrovně

Logické úrovně sběrnice definují pull-up rezistory. Pokud ale jedno zařízení je napájeno z 3.3V a druhé například z 5V, může se stát, že se obě zařízení nedomluví, v lepší případě, a v horším se to první zařízení může zničit.
Aby se tak nestalo, použij buď obě zařízení (typicky čidlo – řídící deska) se stejným napájecím napětím – stejnými logickými úrovněmi (u některých čidel je napájení 5V, ale logické úrovně sběrnice jsou 3.3V) – nebo využij level-shifter (převodník logických úrovní).

I2C piny

Ne všechny řídící desky (například s ESP32-C3, ESP32, ESP8266 nebo Arduino) mají I2C piny – SDA a SCL – na stejných GPIO pinech.
Často se tak stane, že bastlíř přepojí čidlo z ESP8266 na ESP32-C3 na stejné GPIO piny, ale přitom je ESP32-C3 má na jiných GPIO.
Je proto správné si předem zkontrolovat pinout desky a zjistit, kam to SDA a SCL je vlastně připojeno.
Potom je třeba definovat v kódu jiné I2C piny, tedy místo:

Wire.begin();
použít (je to závislé od konkrétní desky)
Wire.begin (21, 22)
kde SDA je na pinu 21 a SCL na pinu 22

Více stejných I2C čidel

Posledním z častějších problémů je použití stejných I2C zařízení.
Stejná I2C zařízení mají zpravidla i stejné adresy – pokud tomu tak je, budou se během komunikace ovlivňovat a tak dojde k nedorozumění na drátech a komunikace se rozpadne.
Některá čidla mají možnost nastavení adresy (zpravidla jeden pin může být připojen na napájení (jedna adresa), nechat nezapojený (druhá adresa) nebo jej přizemnit (třetí adresa).
Jiná čidla mají zase jiné adresy už z výroby – jiný part number – číslo součástky.
A další zradou je, že i jiná čidla stejného výrobce mohou mít stejné I2C adresy – třeba Sensirion SHT41 a SHT45.

Zarušení

Občas může být komunikace prostě a jen zarušená – bohužel bez osciloskopu to zjistíš těžko.
Na druhou stranu lze ve většině případů použít selský rozum -> pokud mám I2C vodiče vedeny přes nějaký prvek na desce, který vyzařuje hodně energie, může být problém v tomhle.

Prostě je zničené

A posledním důvodem proč „to nefunguje“ může být prostě to, že zařízení odletělo do křemíkového nebe.

Skener I2C zařízení

Velkým pomocníkem je I2C Scanner – tento jednoduchý program dokáže najít připojené čidlo a tím vývojáři pomoci zda to čidlo opravdu žije a jakou má I2C adresu.
Pokud je ale chyba v chybějících pull-up rezistorech, napájení, přehozených I2C pinech atp., s tím bohužel pomoci nedokáže.

Poznámka pro milovníky našich desek a modulů – na každé desce a modulu s I2C máme pull-up rezistory. Pokud jich zapojíš více za sebe, může se stát, že se hodnoty jednotlivých pull-up rezistorů podělí a výsledná hodnota bude nižší než doporučených cca 2k7. Zkontroluj tedy, zda není pájecí most, který je připojený k napájení a pull-rezistorům, zapájený-propojený na všech deskách. Stačí na jedné či dvou.

Sdílet článek

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit