ich betreibe am I²C-Bus eines Arduino Uno vier Geräte (LCD, LED-Display, Temperatursensor, FM-Radio). Problem: das Radio funktioniert nur, wenn das LED-Display NICHT am Bus hängt. Es gibt keinen Adresskonflikt.
Es ist sogar so, daß wenn ich das System ohne LED-Display starte und manuell später dazuschalte - dann laufen alle 4 Busgeräte ohne Probleme parallel.
Der Konflikt besteht nur zwischen diesen beiden Geräten. Im Moment bin ich etwas ideenlos...
-LCD: Ywrobot LMB162AFC Alphanumerisch 2*16 Zeilen
-LED: Adafruit 7-Segment Backpack HT16K33
-Temperatursensor: C-Control Temperatursensor 198298
-Radio: Seeed Studio Grove - I2C FM Receiver
Den Schaltplan spare ich mir, es ist ein simpler I²C-Bus mit 4k7-Pullups an den Signalleitungen. Stromversorgung über einen 78S05 mit kompletter Beschaltung. Busverdrahtung sternförmig (serielle Verschaltung auch getestet, erfolglos), Kabel pro Modul ca. 20 cm Flachbandleitung.
Den Sketch habe ich mir (und Euch) erspart, weil er ellenlang ist und weil die Module ja alle funktionieren - sie dürfen nur beim Einschalten nicht zusammen am Bus hängen. Ich trenne aber gerne die relevanten Codebausteine heraus und liefere sie nach. Dauert ein wenig...
Die 4k7 pullups sind für diese Längen untauglich bzw. weil 4 Leitungen im Spiel sind, musst du den Wert verändern = verkleinern. Teste mal mit 1k5.. 1k2 Widerständen. Das sollte die Signale wieder zurechtschleifen.
Ich konnte auf die Schnelle nur einen englischsprachigen link mit guter Erklärung bzgl. Widerständen am I2C Bus finden:
-LCD: Ywrobot LMB162AFC Alphanumerisch 2*16 Zeilen
-LED: Adafruit 7-Segment Backpack HT16K33
-Temperatursensor: C-Control Temperatursensor 198298
-Radio: Seeed Studio Grove - I2C FM Receiver
Habe mal nachfolgend die Stromverbräuche zusammengestellt:
LCD LMB162AFC: 70 mA typ. für backlight, Anzeige: 1..2mA
7Segm. HT16K33: 40 mA angebl. max. Wert, wenn alle Segmente leuchten
Tem. Sensor: 1,25 mA
Receiver: 21 mA
ergibt zusammen mit dem Arduino Selbstverbrauch ca. 150 mA.
Wenn der 78S05 mit 12V gespeist wird und alles versorgt, dann entsteht eine Verlustleistung von
Pv = (12V - 5V) * 0,15mA = ca. 1W; das müsste auf jeden Fall gekühlt werden, sonst wird er zu heiß.
Sollte eine ausreichende Kühlung bereits vorhanden sein, dann gehe ich davon aus, dass das Problem in den zu groß dimensionierten I2C pullup-Widerständen liegt, die dann auf 1k5 .. 1k2 reduziert werden sollten.
Kondensatoren würden imho eher eine Verschlechterung, da zusätzliche Verschleifung der Signale bringen; dafür sorgen bei den Längen schon die Leitungskapazitäten.
rpt007:
Wenn der 78S05 mit 12V gespeist wird und alles versorgt, dann entsteht eine Verlustleistung von
Pv = (12V - 5V) * 0,15mA = ca. 1W; das müsste auf jeden Fall gekühlt werden, sonst wird er zu heiß.
Zur Länge des Busses: da geht noch einiges! :o Ich kann nur noch mal wiederholen: nur Radio und LED beharken sich - die aber beharrlich.
Temperaturfühler: nein, 0 Euro! (Fremde Bastelkiste Sonst in der Tat überteuert (der Conrad-Effekt).
Pullups: Das ist in der Tat ein Ansatzpunkt. Ich glaube, bis 1k kann man problemlos runtergehen. Werde ich testen!
78S05: (Kurzform:) Kein Kühlkörper, da aktuell nur 0,7 W Verlustleistung => handwarm. Komplette Kondensatorbeschaltung nach Vorgabe. Allerdings, zweiter Ansatzpunkt, wenn die kleineren Pullups nichts bringen: größeren Pufferkondensator verwenden. Die 5V einschalten, Puffer laden lassen und erst dann den Bus initialisieren. Vielleicht führt das LED-Display zu einem Spannungseinbruch...
Hast du die Stromaufnahme des Displays mal gemessen ?
Wenn die Verlustleistung bei 0,7W, also deutlich unter dem Wert liegt, den ich anhand der Datenblätter überschlägig berechnet hatte, dann zieht das Display auch tatsächlich nur die 70mA oder weniger für das Backlight.
Somit würde sich imho der Vorwiderstand erübrigen und die Problematik sich von einem potenziellen Stromversorgungsproblem Richtung pullups richten. Ich denke, da liegt der Hund begraben.
Der Vorschlag von @Scherheinz mit dem verzögerten Initialisieren trägt wahrscheinlich auch zum Stabilisieren bei; jedenfalls schadet es auch nicht.
Das Display ist ein I²C-Modul inklusive Treiber, d.h. direkter Anschluß an 5V und Bus. Die Stromaufnahme habe ich gemessen, es zieht ohne eingeschaltete Segmente (und das ist der aktuelle Testzustand) 0,11 mA (!). Beim Einschalten erzeugt es je einen kurzen Peak von +90 mA und -50 mA, also alles im grünen Bereich.
Die Pullups sind nun umgelötet (je 1,1 kOhm). Jetzt geht das Radio gar nicht mehr! Auf dem Bus liegen die Pegel bei low=0,2 V und high=5,0 V. Eigentlich gut...
Edit:
Wieder auf 4k7 gegangen - Radio geht wieder (wie vorher). Werde noch mal einen Zwischenstufe testen. Verzögertes Initialisieren brachte leider auch keine Abhilfe. Ich kann aber erst morgen weiter testen - Danke erst mal für die vielen Tipps!
Bingo! Das Problem lag genau anders herum. Ich habe die Pullups komplett entfernt - jetzt läuft's problemlos. Das macht zwar keinen Sinn, daß Busgeräte ihre eigenen Pullups haben, aber so ist es wohl...