Forum: Mikrocontroller und Digitale Elektronik kostengünstige I2C-Verbindung über bis zu 10m


von Frank S. (whugnit)


Lesenswert?

Ich würde gerne an einem ESP32 mit Arduino IDE mehrere I2C Temperatur- 
und Luftfeuchtesensoren anschließen. Um die Zahl der ESPs 
(Verlustleistung, Netzteile, ...) zu reduzieren sollen dabei möglichst 
mehrere Sensoren an einem betrieben werden was Leitungslängen bis zu ca. 
10m erfordert. Dazu würde ich ein J-Y(ST)Y 4x2x0,6 
Telefon-Installationskabel so verwenden dass von jedem Aderpaar eine 
Leitung direkt oder per Stütz-C auf Masse liegt. Mit 1kOhm Pull-Up sehen 
die Signale auf dem Oszi zwar sauber aus, durch die relativ langsamen 
Flanken und vermutlich Eingänge ohne Schmitt Trigger kommt es jedoch 
immer wieder zu Störungen (fehlendes ACK, ...).

Eine Möglichkeit wäre den P82B715 zu verwenden. Der kostet aktuell aber 
z.B. bei Digikey 6€ pro Stück. Und das Erkennen der Richtung anhand 
eines angehobenen Low-Pegels gefällt mir auch nicht so richtig gut. 
ALternativ einen kleinen Controller zum Sensor zu setzen und diesen über 
RS232 oder RS485 anzubinden gefällt mir vom Aufwand her auch nicht 
wirklich.

Jetzt kam mir die naive Idee einfach die I2C Open-Collector-Ausgänge des 
Controllers auf die Sensorseite zu verlagern und für die Verbindung zum 
Controller 4 Signalleitungen zu verwenden (2x Ausgang, 2x Eingang) 
zusammen mit Software-I2C-Emulation. Beim Sensor hätte ich einen 
invertierend arbeitenden Komparator (z.B. LM393LV) mit Filter und großer 
eingestellter Hysterese vorgesehen. Für die Rückrichtung hätte ich ein 
einfaches Gatter zwischen I2C und die lange Leitung zum Controller 
geschaltet. Dann wäre der eigentliche I2C-Bus nur noch beim Sensor auf 
einem kleinen Leiterplättchen.

Der Controller könnte dann durch einen High-Pegel an einem der beiden 
Ausgänge über den Komparator SCL oder SDA am Sensor sauber auf Low 
ziehen. Und er könnte die Antwort (nach angemessener Wartezeit und ggf. 
auch mit Filter und Schnmitt Trigger) sehen ohne die I2C-Signalform am 
Sensor zu beeinflussen. Mit einer SW-I2C-Library die Funktionspointer 
für das I/O-Handling unterstützt müsste das eigentlich ohne weitere 
Anpassungen ziemlich robust funktionieren.

Und zur Erweiterung auf mehrere Interfaces (u.a. erforderlich wg. 
kollidierender Adressen) wären einfache digitale Gatter oder Multiplexer 
verwendbar da jetzt alle Signale (bis auf den kleinen I2C-Bus direkt am 
Sensor) unidirektional sind.

Gibt es da evtl. schon etwas fertiges (HW und/oder SW)?

von Harry L. (mysth)


Lesenswert?

Für solche Distanzen z.B. CAN, aber ganz sicher nicht I²C!

von Achim H. (pluto25)


Lesenswert?

Mit weniger Speed sind 10m kein Problem. Die Sensoren müssen ja nicht 
mit 400khz antworten? Wie wärs mit 100 oder 40khz?

: Bearbeitet durch User
von Ole (Gast)


Lesenswert?

Fehlerbehandlung?

von Wühlhase (Gast)


Lesenswert?

Ich würde es auch mit CAN machen, wenn es digital sein muß.

von Erwin (Gast)


Lesenswert?


von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

PCA9616: Netter Baustein, aber auch kein Cent-Artikel...

von noiasca (Gast)


Lesenswert?

Frank S. schrieb:
> mehrere I2C Temperatur-
> und Luftfeuchtesensoren

warum die Festlegung auf I2C bei diesen Kabellängen? Nimm Sensoren die 
mit großen Kabellängen zurecht kommen.
Für draußen aber Wettergeschützt: AM2305: 
https://s.click.aliexpress.com/e/_DmfnSAF
Wenns nur billig sein soll: AM2301: 
https://s.click.aliexpress.com/e/_DkenxT1

von Falk B. (falk)


Lesenswert?

Ich hatte mal mit einem Industrieprojekt zu tun, da wurde ein digitaler 
Poti über I2C über 100m im Industrieumfeld angesteuert. Es geht. Und es 
ist einfacher, als man denkt, wenn man weiß was man tut.

3,3V I2C Pegel sollten auch auf 10m reichen. GGf. kann man einfache 
Pegelwandler nutzen und auf 5V I2C Bus gehen. Ist aber nicht 
zwingend.
Und wenn die I2C Software was taugt, reagiert sie auch nicht auf jeden 
Pups gleich allergisch.

Falk, der Schlaflose

von Frank S. (whugnit)


Lesenswert?

Danke für die Antworten.

Beim angedachten Sensor handelt es sich um einen Original Sensirion 
SHT31 der mir relativ zuverlässig erscheint und bei >5 Stck. für unter 
5€/Stck. zu bekommen ist. Und der hat nunmal I2C. Zuverlässige 
Temperatur- und Feuchtesensoren mit CAN-Bus-Interface habe ich noch 
nicht gesehen. Mit einer PTFE-Membran sollte der SHT31 auch draußen 
relativ unempfindlich sein da man ja eh ein Thermometergehäuse als 
Sonnen- und Wetterschutz braucht. Da ich draußen, im Keller und in der 
Wohnung mehrere verteilen möchte (nicht alle an einem Controller) 
scheint mir der SHT31 eben ein guter Kompromiss zu sein.

Der AM2305 hat lt. Datenblatt von Aosong z.B. bis zu 1% Drift/Jahr, beim 
Sensirion sind nur 0,25% angegeben. Letzterem Wert glaube ich auch erst 
mal mehr als den 1%. Und bei Aliexpress ist auch nicht explizit Aosong 
als Hersteller angegeben...

Die Geschwindigkeit habe ich ja schon mit 1k Pull-Ups auf 10 kBit/s 
reduziert und die Signale sehen im Großen und Ganzen im Rahen der 
Bandbreite des Oszilloskops (<100MHz) auch gut aus mit relativ langsamen 
steigenden Flanken. Leider kommt es selbst unter Laborbedingungen trotz 
korrekter Adressierung immer wieder zu fehlenden ACKs (zeitweise bis zu 
100%). Die fallende Flanke kann ich mit diesem Oszi nicht zuverlässig 
beurteilen, da könnte es zu Über- und Unterschwingern kommen die ich 
nicht sehen kann.

Und natürlich gibt es eine Fehlerbehandlung und allergisch reagiert da 
auch nichts, auch wenn ein Allergietest noch aussteht. Aber wenn ich 
irgendwo eine Fehlerkorrektur einbaue dann werte ich auch aus wie oft 
die zum Tragen kommt. Ohne externe Störungen bei einem sauberen 
Laboraufbau erwarte ich einen fehlerfreien Betrieb über Tage bis Wochen, 
ansonsten taugt die Verbindung nix und ich suche nach einer Alternative. 
Wer weiß ob sonst bei extremen Temperaturen oder ungünstigem Mondstand 
die Verbindung den Betrieb nicht doch noch ganz einstellt.

Der PCA9616 sieht - bis auf den Preis - zunächst relativ gut aus, durch 
die begrenzten Adressierungsmöglichkeiten (nur 1 Bit wählbar) des 
Sensors habe ich dann aber leider das Problem dass ich für einen Sensor 
2 PCA9616 und für 2 Sensoren 3 PCA9616 brauche und bei mehr Sensoren 
weitere I2C-Busse. So richtig schön ist das leider auch nicht. Eine 
weitere Unschönheit wäre die Notwendigkeit einer Linienverdrahtung mit 
kurzen Stichleitungen, aber bei max. 2 Sensoren wäre das sogar noch 
hinzubekommen.

Insgesamt haben solche Probleme ja  genau zur Überlegung geführt eine 
einfache Sternverteilung mit unidirektionalen Signalen mit superbilligen 
Standard-CMOS-Treibern und sauberer Signalfilterung mit großer Hysterese 
zu realisieren. Und die Komparatoren hätten gleich die passenden open 
Collector Ausgänge. Auf der Leitung wäre dann ja auch gar kein echter 
I2C-Bus mehr sondern nur etwas aus dem man für wenige Cent wieder I2C 
machen kann.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Moin,

Was mich betrifft rate ich zu zwei billigen MC74HC4051B zum Umschalten 
von bis zu acht SHT31ern. Da sie Analog sind, funktioniert auch die 
beidseitige SDA Datenübermittlung. Ich würde allerdings zuerst mit 
LTSpice grob simulieren inwieweit die Pullups zur Kabelkapazität passen 
müssen um einigermassen günstige Anstiegszeiten zu haben. Auch könnte 
man, falls notwendig, aktive Pullups verwenden. Und dann würde ich die 
Baudrate so weit erhöhen bis es Ärger gibt. Dann hat man einen 
Anhaltspunkt wie hoch man gehen darf. Ich habe früher viel mit den 
SH15-25 gearbeitet und fand sie ziemlich gutmütig. Jedenfalls rate ich 
mit dem Oszi Bussignale auf Herz und Nieren zu prüfen um praktische 
Anhaltspunkte zu bekommen.

Also, mach schon:-)

Gruß,
Gerhard

von mIstA (Gast)


Lesenswert?

Frank S. schrieb:
> sehen die Signale auf dem Oszi zwar sauber aus,

Nur zur Sicherheit: Hast Du Dir die Signale auch an beiden Enden Deines 
10m Kabels betrachtet?


> durch die relativ langsamen Flanken

Wenn Du mit langsam hier flach meinst, dann stellt sich die Frage, 
inwieweit die noch wirklich sauber - im Sinne der I2C Specs - sind?


Frank S. schrieb:
> von jedem Aderpaar eine
> Leitung direkt oder per Stütz-C auf Masse liegt.

Hätt ich vermutlich auch als ersten Ansatz probiert; allerdings ergibt 
das bei 10m halt auch einiges an Leitungskapazität, darum wärs wohl 
einen Versuch wert es bei den I2C Busleitungen mal ohne Masse-Partner zu 
probieren.

von Falk B. (falk)


Lesenswert?

Frank S. schrieb:

> Die Geschwindigkeit habe ich ja schon mit 1k Pull-Ups auf 10 kBit/s
> reduziert und die Signale sehen im Großen und Ganzen im Rahen der
> Bandbreite des Oszilloskops (<100MHz) auch gut aus mit relativ langsamen
> steigenden Flanken.

Zeige uns ein paar sinnvolle Screenshots.

> Leider kommt es selbst unter Laborbedingungen trotz
> korrekter Adressierung immer wieder zu fehlenden ACKs (zeitweise bis zu
> 100%).

Klingt nach einem verschluckten Sensor. Hast du einen 
Entkoppelkondensator am Sensor?

https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator

> Die fallende Flanke kann ich mit diesem Oszi nicht zuverlässig
> beurteilen,

Warum? Du hast doch ein gutes Oszi.

> da könnte es zu Über- und Unterschwingern kommen die ich
> nicht sehen kann.

???

> die zum Tragen kommt. Ohne externe Störungen bei einem sauberen
> Laboraufbau erwarte ich einen fehlerfreien Betrieb über Tage bis Wochen,
> ansonsten taugt die Verbindung nix und ich suche nach einer Alternative.

Such erstmal nach Fehlern. Wenn so ein einfacher Aufbau im Labor nicht 
stabil läuft, stimmt was nicht.

> Wer weiß ob sonst bei extremen Temperaturen oder ungünstigem Mondstand
> die Verbindung den Betrieb nicht doch noch ganz einstellt.

Jaja. Mach erstmal deine Hausaufgaben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.