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
Moin,
für solche Anwendungen gibt es doch eigentlich Feldbussysteme...zum
Beispiel CAN. Sowas mit I2C umzusetzten kommt mir nicht sehr sinnvoll
vor.
Gruß
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.
@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.
@ 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.
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.
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-
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.
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).
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
@ 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.
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
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.
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.
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
> 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
> 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
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.
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.
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.
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.
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.