Forum: Mikrocontroller und Digitale Elektronik I2C Kommunikation mit 32 Geräten


von Dave (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich möchte einen I2C Bus aufbauen.
Folgende Infos:

- 32 einzelne Arduino Mega werden mit einem I²C Schnittstellengerät von 
NI (https://www.ni.com/de-de/shop/select/i2c-spi-interface-device) 
ausgelesen
- die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m
- alle Datenleitungen gehen in eine Box wo sie parallel geschaltet 
werden und in meinen Eingang von der NI Box gehen
- es sollen geschirmte und verdrillte Kabel verwendet werden

Aufgrund der Kabellänge und der höheren Anzahl von I²C Teilnehmern habe 
ich mir gedacht ich verwende einen I²C Bus Extender P82B715P um zum 
einen die Bus Kapazität zu erhöhen und die hohe Störanfälligkeit zu 
verringern.

Meine Frage:
Hat jemand schon damit Erfahrung gesammelt, ob sowas zuverlässig 
funktionieren kann? Wird die Störanfälligkeit durch den P82B715 erhöht 
oder gibt es da noch eine andere Möglichkeit?

Den P82B715 muss ich ja an jeden I²C Bus von jeden Arduino schalten. 
Muss ich den P82B715 dann auch an jedes Kabelende vor meiner NI Box 
schalten, oder reicht dort dann nur ein einelner?
Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup 
Widerstand auf 5V ziehen. Oder benötige ich das für jeden einzelnen 
Teilnehmer machen?

Ich habe einfach mal eine Prinzipskizze des Schaltplans/Aufbaus 
angehangen.

Danke für die Hilfe

Gruß
Dave

von PaSi (Gast)


Lesenswert?

Moin,
für solche Anwendungen gibt es doch eigentlich Feldbussysteme...zum 
Beispiel CAN. Sowas mit I2C umzusetzten kommt mir nicht sehr sinnvoll 
vor.

Gruß

von Cyblord -. (cyblord)


Lesenswert?

PaSi schrieb:
> Moin,
> für solche Anwendungen gibt es doch eigentlich Feldbussysteme...zum
> Beispiel CAN. Sowas mit I2C umzusetzten kommt mir nicht sehr sinnvoll
> vor.
>
> Gruß

Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf 
RS232 Basis ausdenken. Oder direkt LIN nehmen.

von Falk B. (falk)


Lesenswert?

@Dave (Gast)

>- 32 einzelne Arduino Mega werden mit einem I²C Schnittstellengerät von
>NI (https://www.ni.com/de-de/shop/select/i2c-spi-inter...)
>ausgelesen
>- die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m
>- alle Datenleitungen gehen in eine Box wo sie parallel geschaltet
>werden und in meinen Eingang von der NI Box gehen
>- es sollen geschirmte und verdrillte Kabel verwendet werden

Kann man machen, sollte auch funktionieren.

>Aufgrund der Kabellänge und der höheren Anzahl von I²C Teilnehmern habe
>ich mir gedacht ich verwende einen I²C Bus Extender P82B715P um zum
>einen die Bus Kapazität zu erhöhen und die hohe Störanfälligkeit zu
>verringern.

Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch 
ohne, wenn gleich vielleicht etwas langsamer.

2m verdrilltes Kabel haben vielleicht 100pF, macht bei 32 Teilnehmern 
3,2nF. Das ist zwar ca. Faktor 8 über den üblichen 400pF für einen 
normalen I2C Bus, geht aber mit langsamerem Takt.

>Hat jemand schon damit Erfahrung gesammelt, ob sowas zuverlässig
>funktionieren kann?

Ich hab mal mit einem I2C IC an 500 (ja, FÜNFHUNDERT) Metern Kabel zu 
tun gehabt, der lief auch.

>Wird die Störanfälligkeit durch den P82B715 erhöht

Bist du ein Hypochonder, der immer und überall nur Probleme sieht?

>Den P82B715 muss ich ja an jeden I²C Bus von jeden Arduino schalten.

Ja.

>Muss ich den P82B715 dann auch an jedes Kabelende vor meiner NI Box
>schalten,

Nein.

> oder reicht dort dann nur ein einelner?

Ja.

>Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup
>Widerstand auf 5V ziehen.

Ja.

> Oder benötige ich das für jeden einzelnen
>Teilnehmer machen?

Nein.

von Falk B. (falk)


Lesenswert?

@ Cyblord -. (cyblord)

>Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf
>RS232 Basis ausdenken. Oder direkt LIN nehmen.

Klar, weil du der Oberheld bist und jedes Mal das Rad neu erfinden 
willst.

von Cyblord -. (cyblord)


Lesenswert?

Falk B. schrieb:
> @ Cyblord -. (cyblord)
>
>>Ne echt nicht. Da würde ich mir lieber ein kleines eigenes Protokoll auf
>>RS232 Basis ausdenken. Oder direkt LIN nehmen.
>
> Klar, weil du der Oberheld bist und jedes Mal das Rad neu erfinden
> willst.

Jup. Das geht deutlich besser als dafür I2C zu vergewaltigen. Gerade 
wenn man nur reihum bisschen Daten abfragen will.

von Dave (Gast)


Lesenswert?

Danke für die Antworten
@ Falk

> Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch
> ohne, wenn gleich vielleicht etwas langsamer.
>
Was heißt denn langsamer? Statt 100 kHz mit 50kHz?
Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die 
Taktrate auswirkt?

>>Wird die Störanfälligkeit durch den P82B715 erhöht
>
> Bist du ein Hypochonder, der immer und überall nur Probleme sieht?
>

Oh hier meinte ich ob die Störanfälligkeit verringert wird.


>> oder reicht dort dann nur ein einelner?
>
> Ja.

Ok perfekt.

>>Meines Wissens muss ich nur die gesamte Bus Leitung mit einen Pullup
>>Widerstand auf 5V ziehen.
>
> Ja.
>
>> Oder benötige ich das für jeden einzelnen
>>Teilnehmer machen?
>
> Nein.

Dann habe ich das verkehrt auf meiner Skizze aufgezeichnet?


@Cyblord
Ziel ist es die vorhandene NI I²C Box zu nutzen. Deswegen würde mich es 
Interessieren wie ich das ganze mit I²C zum laufen bekomme. Mir ist aber 
bewusst, dass ein Feldbussystem die sicherere Variante wäre-

von Jobst Q. (joquis)


Lesenswert?

Vor vielen Jahren habe ich auch schon mal einen Feldbus mit I2C und 
P82B715 jahrelang fehlerfrei betrieben. Mit Leitungslängen bis zu 100m.

Allerdings wegen der Kapazität kein abgeschirmtes oder verdrilltes 
Kabel, sondern mit Flachband Modularkabel,die Datenleitungen jeweils 
zwischen Masse bzw Versorgungsspannung. PullUps mit 330 Ohm.

Von Bedeutung ist auch die Taktfrequenz, je niedriger umso problemloser. 
Da der Master bei mir ein PC mit DOS-Programm in Assembler mit 
Bitbanging war, kann ich nichts über die Frequenz dabei sagen.

: Bearbeitet durch User
von Tobias (Gast)


Lesenswert?

Dave schrieb:
>> Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch
>> ohne, wenn gleich vielleicht etwas langsamer.
>>
> Was heißt denn langsamer? Statt 100 kHz mit 50kHz?
> Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die
> Taktrate auswirkt?

Proportional langsamer:
400pF <-> 100 KHz
4000pF <-> 10 KHz

Die Maximalgeschwindigkeit hängt von der Kabelkapazität und den 
Pullup-Widerständen ab. Die Maximalfrequenz ist dann proportional zu 
fg=1/(2*pi*R*C).

von Jobst Q. (joquis)


Lesenswert?

Man kann übrigens auch I2C über CAN-Bustreiber betreiben für besonders 
lange Leitungen oder bei hohem Störpotential. Also I2C-Protokoll und 
CAN-Hardware.

Dafür gibt es auch schon betriebsfertige Module:

http://www.cctools.eu/ext_index.php?artikel=1823

von Falk B. (falk)


Lesenswert?

@ Dave (Gast)

>> Kann man auch machen, erhöht den Aufwand aber zusätzlich. Es geht auch
>> ohne, wenn gleich vielleicht etwas langsamer.
>

>Was heißt denn langsamer? Statt 100 kHz mit 50kHz?
>Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die
>Taktrate auswirkt?

I2C muss min. 3mA gegen Masse schalten können, bei 5V sind das ~1,5kOhm 
Pull Up Widerstände.

tau = R * C = 1,5kOhm * 3,2nF ~5us

Das ist die Anstiegszeit der Signale bis 63%. Real wird man eher das 
Doppelte ansetzen, damit es nicht auf Kante genäht ist. D.h. du mußt für 
die steigende Flanke ca. 10us reservieren, die fallende ist schneller, 
sagen wir 0,5us. Dann noch ein wenig Zeit für LOW und HIGH macht in 
Summe ca. 12-15us/Bit bzw. ~66kbit/s.

>>Wird die Störanfälligkeit durch den P82B715 erhöht

>Oh hier meinte ich ob die Störanfälligkeit verringert wird.

Nicht wirklich, denn die Pegel und Störabstände bleiben ja gleich.

>>> Oder benötige ich das für jeden einzelnen
>>>Teilnehmer machen?
>
>> Nein.

>Dann habe ich das verkehrt auf meiner Skizze aufgezeichnet?

Ja.

>Ziel ist es die vorhandene NI I²C Box zu nutzen. Deswegen würde mich es
>Interessieren wie ich das ganze mit I²C zum laufen bekomme. Mir ist aber
>bewusst, dass ein Feldbussystem die sicherere Variante wäre-

Man kann die 32 Busse mittels I2C MUX in Segmente auftrennen, dann 
vermindert sich die Last. Allein schon ein 4:1 Mux vermindert die Last 
um den Faktor 4, es gibt wahrscheinlich auch 8:1 und mehr. Den braucht 
man nur einmal für deine NI-Karte. Die Bus-Extender auf jedem Arduino 
fallen dann auch weg.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ums verrecken wuerd' ich das nicht mit I2C machen wollen. I2C sollte auf 
der Platine bleiben oder zumindest im Geraet. Und nicht mehr als 
vielleicht 4 Slaves und ein Master an einem Bus. Jeder ominoese Switch 
im Bus vergroessert die Chance auf Aerger.
Wenn man so richtig Probleme haben will, dann macht man sowas.

Gruss
WK

von Jobst Q. (joquis)


Lesenswert?

Falk B. schrieb:
>>Oh hier meinte ich ob die Störanfälligkeit verringert wird.
>
> Nicht wirklich, denn die Pegel und Störabstände bleiben ja gleich.

Der P82B715P verstärkt die Ströme des I2C-Bus um das 10-fache. Dadurch 
können die PullUp-Widerstände um das 10-fache verringert werden. Das 
bedeutet, dass die Kabelkapazitäten bei gleicher Geschwindigkeit 10 mal 
größer sein können. Aber auch, dass Störeinstrahlungen 10 mal stärker 
belastet, also verringert werden.

von Stefan F. (Gast)


Lesenswert?

Für Leitungen dieser Länge ist ein RS485 oder CAN Bus eher angemessen. 
RS485 Bustreiber bekommt man sehr günstig aus Asien: 
https://www.aliexpress.com/item/5PCS-LOT-MAX485-module-RS485-module-TTL-turn-RS-485-module-MCU-development-accessories/32582289852.html

Mit diesen Treibern brauchst Du Dir um Leitungslängen und Kapazitäten 
praktisch keine Sorgen mehr zu machen. Außerdem lassen diese Treiber 
erheblich größere Potentialdifferenzen (GND Pegel) zu, als I²C.

von Wolfgang (Gast)


Lesenswert?

Dave schrieb:
> Gibt es da ein Richtwert wie stark sich die Leitungskapazität auf die
> Taktrate auswirkt?

Du kennst den Pull-Up Widerstand vom I2C, du kennst die Kapazität, du 
kennst du Schaltpegel. Welche Information fehlt dir, um die Flanken und 
die maximale Taktrate auszurechnen?
Hauptsächlich deine steigende Flanke der Signale wird langgezogen, weil 
du bei I2C keine Push-Pull-Treiber hast.

Du könntest die Schirmung weglassen, die die kapazitive Last für deinen 
I2C-Bus deutlich erhöht. Ob die Schirmung zum Erreichen des nötigen 
Störabstandes nötig ist, kannst nur du beurteilen.
Nimm ein Oszi, guck dir Störungen und Signalflanken an.

von Karl (Gast)


Lesenswert?

Man kann die Anstiegszeit bei langen Leitungen stark verkürzen, wenn man 
statt Pull-Ups Stromspiegel nimmt. Da steigt die Spannung linear an.

von Frank K. (fchk)


Lesenswert?

Mein Vorschlag:

1. Nimm PCA9548A I2C Switches und teile damit den Bus in 32 Segmente. 
Damit isolierst Du die Busse voneinander und ermöglichst es, dass jedes 
Segment die gleichen I2C Adressen nehmen kann. Du aktivierst immer nur 
genau ein Segment zur Zeit.

2. Jedes Bussegment verlängerst Du mit einem Paar P82B96, wodurch SCL 
und SDA jeweils als differentielle SIgnale übertragen werden.

Damit sollte Deinem Vorhaben nichts mehr im Wege stehen.

fchk

von Olaf (Gast)


Lesenswert?

> Wenn man so richtig Probleme haben will, dann macht man sowas.

Das sehe ich auch so. Ich glaube auch das so etwas funktionieren kann, 
aber es kann auch sein das es nicht funktioniert und dann hat man ein 
Problem. In der Praxis wird es sicher auch von vielen Randbedingungen 
abhaengen. Zum Beispiel Stoerungen in der Umgebung, 
Potentialunterschiede, Massenankopplung an den einzelnen Slaves, 
Stoerempfindlichkeit der einzelnen Devices. Da kann man sich dann 
schonmal auf Slaves freuen die SDA oder gar SCL dauerhaft auf Masse 
ziehen weil sie sich weggehaengt haben. Viel Spass....

Olaf

von Karl (Gast)


Lesenswert?

Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m 
Leitungslänge...

von Olaf (Gast)


Lesenswert?

> Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m
> Leitungslänge...

Also fuer mich liesst sich das wie Sternverdrahtung mit 32x2m 
Leitungslaenge.

Olaf

von Cyblord -. (cyblord)


Lesenswert?

Karl schrieb:
> Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m
> Leitungslänge...

Die Länge ist hier auch gar nicht das Problem. Die ganze 
Aufgabenstellung ist für I2C einfach ungeeignet.

von m.n. (Gast)


Lesenswert?

Karl schrieb:
> Ach Leute, nun kackt euch mal nicht ein. Es geht hier um 2m
> Leitungslänge...

Es geht aber auch um 32 Geräte. Wenn ein einzelnes Gerät SCL blockiert, 
steht alles still.

RS232/RS485 mit asynchroner Übertragung würde ich auch bevorzugen. Wenn 
man kein eigenes Protokoll in der Schublade hat, findet man sicherlich 
ein geeignetes im Netz.

von Johnny B. (johnnyb)


Lesenswert?

Dave schrieb:
> die Länge der Datenleitungen von jedem Prüfstand beträgt ca. 2m

Ich bestreite nicht, dass es mit I2C nicht geht, jedoch ist I2C für die 
Interboardkommunikation konzipiert und optimiert.

Wenn Du von Prüfständen sprichst die mit Kabeln verbunden sind und 
örtlich auseinanderliegen, dann würde ich ebenfalls wie andere hier 
raten, auf einen dafür ausgelegten Bus oder Schnittstellensystem setzen 
wie z.B. CAN, RS485 oder wenn die Prüfstände noch an unterschiedlichen 
Steckdosen hängen, dann auf etwas von Haus aus galvanisch getrenntes wie 
Ethernet, etc.
Ein Prüfstand sollte wesentlich zuverlässiger funktionieren als der 
Prüfling, daher wäre es am falschen Ort gespart, wenn man da was mit I2C 
zusammenfrickelt.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Ich würde einen zusätzlichen Arduino spendieren, der auf einer Seite mit 
deiner NI Kiste kommuniziert und auf der anderen Seite als Master für 
ein RS485 Bus funktioniert. Protokoll ist auch recht einfach die Slaves 
werden über das 9. Bit der UART addressiert und bekommen dann einen 
Befehl und Zeit zum Antworten, dann kommt der nächste. Einen Ausfall 
erkennst du an der Zeitüberschreitung der Antwort und nichts wird 
blockiert.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wie muss man sich das praktisch vorstellen: 32 Tische haben jeweils ein 
2 Meter kurzes Kabel zu EINER zentralen Box. Das müssen aber winzig 
kleine Tische sein.

von m.n. (Gast)


Lesenswert?

Stefanus F. schrieb:
> Das müssen aber winzig kleine Tische sein.

Dazu passen dann Arduino Pico ;-)

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.