Hallo Liebe Forum Gemeinde :-) nachdem meine ersten Gehversuche nun mit dem Arduino abgeschlossen sind versuche ich nun mehrere Arduinos mit einem I2C Bus miteinander zu verkoppeln, Sofern die Leitungslängen kurz sind daher 2 Arduinos nebeneinander auf dem Tisch funktioniert die Kommunikation zwischen beiden Microcontrollern problemlos. Wenn ich jedoch die Leitungslänge auf bspw. 50m erhöhe funktioniert die Kommunikation nicht mehr. Nach etwas googlen hab ich dann denn PCA9600 gefunden und versucht entsprechend Datenblatt und denn anbei liegenden Schaltplan mit einander zu verdrahten... leider schaffe ich es nicht das beide Arduinos wieder miteinander reden, Gegenprüfung beide Arduino´s direkt verbunden funktioniert... daher ist der Fehler in meiner Verdrahtung zu suchen... ich hoffe Sehr das Ihr mir bei dieser Problematik behilflich sein könnt: P.s. für alle die auch dieses Problem haben, wenn ich hierfür eine Lösung bekommen habe mache ich mit eagle einen leicht verständlichen Schaltplan, damit keiner mehr Probleme hat :-) habt vielen lieben dank für eure Hilfe Stefan
:
Bearbeitet durch User
50m Bist du wahnsinnig I2C wurde ursprünglich für eine Chip-zu-Chip-Kommunikation auf der gleichen Platine vorgesehen. Wenn Kabel nicht allzu lang sind, kann man auch Baumgruppen innerhalb eines Gerätes damit verbinden.
:
Bearbeitet durch User
Guten morgen Christian, vielen dank für die schnelle Antwort, schau dir mal denn link an... da hat es jemand auf 300m geschafft... http://sandboxelectronics.com/?p=1098 ich weiß bloß nicht wie.... ich hoffe gemeinsam finden wir eine Lösung Stefan
OK, der PCA9600 mach aus SDA und SCL jeweils ein differentielles Leitungspaar. Dadurch kann man schon eine größere Strecke überbrücken. Klappt es denn bei dir mit den PCA9600 bei dir auf kurzer strecke oder gar nicht? EDIT: Deine obige Schaltung entspricht aber nicht dem hier: http://sandboxelectronics.com/wp-content/uploads/2015/06/point_to_point-1024x192.png
:
Bearbeitet durch User
leider funktioniert mein Schaltplan "ScreenShot144.jpg" auch auf kurze Distanz nicht... das Bild "ScreenShot143.jpg" wurde aus dem Datenblatt: http://www.nxp.com/documents/data_sheet/PCA9600.pdf kopiert...
Dann willst du den PCA9600 nur als Level-Shifter einsetzen. Aber dann bezweifle ich das du auf 50m kommst. Hast du an die Pullups gedacht, die fehlen bei dir in dem ScreenShot144.
Sorry bin nur Elektriker.. das sind meine ersten Gehversuche.... Pullups = Wiederstände? hab vielen dank für dein Verständnis... wenn es Wiederstände sind... wo soll ich die reinmachen? Verstehst du wie die das von Sandbox hinbekommen haben... ich leider nicht so wirklich
:
Bearbeitet durch User
Ja die Widerstande auf Versorgungsspannung, wie in ScreenShot143 eingezeichnet.
Meinen die das so??? wie groß sollen die Wiederstände sein??? würde es in meiner Versuchsschaltung gleich testen wollen
Stefan B. schrieb: > Verstehst du wie die das von Sandbox hinbekommen haben... ich leider > nicht so wirklich Ja, de benutzen die PCA9600 um aus den Signalen differenzielle Signale zu machen. Beide Signale haben z.B. einen Ruhepegel von 12V was eine logische 0 entspricht. Um eine 1 zu übertragen hebt sich die eine Leitung um 1V an und die andere geht um ein Volt runter. Also dann 13V und 11V. Das hat den Vorteil das die Summer der Spannung weiterhin gleich ist, das verhindert übersprechen auf andere Leitungen. Der Empfänger entscheidet dann aber nicht anhand des Spannungswert der einzelnen Leitung, sondern anhand der Spannungsdifferenz, also 2V. Das hat den Vorteil das der Spannungsabfall durch lange Leitungen kaum Einfluss hat. Beim Empfänger könnte z. B. nur noch 10V und 8V ankommen. https://de.wikipedia.org/wiki/Symmetrische_Signal%C3%BCbertragung
:
Bearbeitet durch User
So, Noch mal bei sandboxelectronics reingeschaut. Die benutzen für die Erzeugung des Differenzsignals den CAN-Transceiver PCA82C251. Der PCA9600 ist nur davor geschalten um den Bus-Pegel auf einen festen Wert zubekommen und eventuell die Bus-Teilsegmente abzuschotten.
Also ich hab das jetzt so wie im Bild angeschlossen... funktioniert nicht... wenn du sagst das es gehen muß, würde ich sagen das ich vielleicht einen der beiden Chips mit meiner rumprobiererei kaputt gemacht habe :-) hab aber noch ein paar da :-) wenn du sagst es muss gehen bastel ich eben schnell neue in meinem Versuchsaufbau rein....
Bitte Nachricht nach lesen löschen: darf ich dich bitten gegen ein kleines Endgeld mir einen Schaltplan zu entwerfen womit ich das siehe Sandbox nachbilden kann... Wenn du willst stelle ich ihn dann auch hier rein.... Wie gesagt bin leider nur Elektriker... und ich befürchte das übersteigt meinen geistigen horizont... aber einen Schaltplan kann zumindestens nachbauen :-) dafür reichts noch.... kannst auch schreiben an sb_newsletter@yahoo.de Zu deinem Verständnis: die Programmierung ist soweit abgeschlossen und es wäre echt schade da Projekt aufgrund dieser Problematik einzustampfen....
:
Bearbeitet durch User
Ich hab mit den Bausteinen noch nicht gearbeitet, ich kann auch nur das Datenblatt lesen. Der PCA9600 ist dazu da zwei I2C Buse mit einander zu verbinden, die unterschiedliche Spannungslevel benutzen. Er wird mit der Höheren der beiden Spannungen betrieben. Auf beiden Seiten müssen PullUps um die Datenleitung auf die Spannung zu bringen. Auf der einen Seite sind die PullUps aber schon auf dem Arduino-Board. Bei langen Leitungen (und damit sind schon 2m gemeint) auf beiden Enden Pullups. Und an die PCA9600 noch Abblock-Kondensatoren (100nF).
@Stefan Bauerfeindt (sb_newsletter) >Wenn ich jedoch die Leitungslänge auf bspw. 50m erhöhe funktioniert die >Kommunikation nicht mehr. Wenn gleich I2C für 50m nicht gedacht ist, kann man das trotzdem machen. Man muss halt mit der Baudrate runter gehen und die Pull-Up Widerstände an SDA und SCL minimieren. 1,5kOhm sind bei 5V OK. Weiterhin muss man auf eine solide Masseverbindung der Teilnehmer achten. Also bitte keine haarfeine Ader, sondern ordentlich Querschnitt, so 0,3 oder 0,5mm^2. Ich hatte vor vielen Jahren mal in einem Industrieprojekt was mit I2C zu tun, dort waren bis zu 500m (fünfhundert) Kabel dran! Das lief glaub ich mit 10 kBit/s oder so. Die Arduino-Lib bietet leider keine Funktion zum Einstellen der Baudrate, also muss man das manuell machen, und zwar NACH wire.begin()! Je nach Arduino-Typ könnte das ein anderes Register sein. Bei den meisten AVRs geht das mit
1 | wire.begin(); |
2 | TWBR = 255; // minimale Baudrate |
3 | TWSR = 3; // Prescaler = 64 |
@ Stefan Bauerfeindt (sb_newsletter) > ScreenShot146.jpg >Also ich hab das jetzt so wie im Bild angeschlossen... funktioniert >nicht... Logisch. Deine Widerstände am Bus müssen nach VCC ziehen, nicht nach GND! Ausserdem braucht man nicht nur die PCA9600, sondern auch differentielle Tranceiver. Die PCA9600 machen nur aus den bidirektionalen I2C Signalen getrennte, unidirektionale Signale. Diese werden dann vom PCA82C251T in differentielle Signale umgewandelt. Steht alles auf der Sandbox-Seite. "Technical Details SCL and SDA of the I2C interface is bidirectional by its definition. The PCA9600 on the module is used in such a way that it splits SCL into two unidirectional signal, named SCL_TX, and SCL_RX. The same applies to SDA signal. The purpose to split these two signals is that the PCA82C251T differential transceiver requires unidirectional signals."
http://sandboxelectronics.com/?product=pca9600-differential-i2c-long-cable-extender-with-boost-convertor http://sandboxelectronics.com/?product=pca9600-differential-i2c-long-cable-extender-with-boost-convertor-and-rj45-adaptor Einfacher und billiger wird selber machen auch nicht.
Falk B. schrieb: > Ausserdem braucht man nicht nur die PCA9600, sondern auch differentielle > Tranceiver. Die PCA9600 machen nur aus den bidirektionalen I2C Signalen > getrennte, unidirektionale Signale. Diese werden dann vom PCA82C251T in > differentielle Signale umgewandelt. Steht alles auf der Sandbox-Seite. Das gilt nur, wenn man auch differentiel übertragen will. Ansonsten kann man auch RX und TX zusammenschalten und hat dann wieder I2C Verhältnisse. Man muß da auch nicht mit einer anderen Spannung ran gehen, es kann die gleiche wie auf dem primären Bus sein. Was man dabei gewinnt, ist eine größere kapazitive Buslast. I2C direkt läßt 400pF zu, der PCA erhöht das auf 4000pF. Damit darf das Kabel schon mal zehn mal so lang sein. Verwendet man für den externen Bus auch noch eine höhere Spannung, verbessert man zusätzlich auch noch den Störabstand. Falk B. schrieb: > SCL and SDA of the I2C interface is bidirectional by its definition. The > PCA9600 on the module is used in such a way that it splits SCL > into two unidirectional signal, Das kann man so machen, muß man aber nicht. MfG Klaus
@ Klaus (Gast) >Das gilt nur, wenn man auch differentiel übertragen will. Ja was denn sonst, wenn er SOLIDE und SCHNELL über 300m gehen will? > Ansonsten kann >man auch RX und TX zusammenschalten und hat dann wieder I2C >Verhältnisse. Da kann man den PCA9600 auch gleich weglassen! >so lang sein. Verwendet man für den externen Bus auch noch eine höhere >Spannung, verbessert man zusätzlich auch noch den Störabstand. Jaja, am besten gleich 12V oder mehr. OMG! >Das kann man so machen, muß man aber nicht. Man muss auch keine I2C nehmen. Man kann es auch gleich ganz bleiben lassen!
Ersteinmal vielen lieben dank für die regen Antworten, Ich habe mich nochmal mit der ganzen Problematik beschäftigt und bin leider zu der Erkenntnis gelangt das mein Elektronisches Verständnis nicht weit genug ausreicht um die Hardware Probleme selbst lösen zu können :-( Aus diesem Grund suche ich hier nun ganz Offiziell: Einen Elektronik Spezialisten der - mit Eagle Cad arbeiten kann und - meine Schaltpläne kontrollieren und ggf. erweitern kann in dem aktuellen Fall "ein Modul (vorhanden) um einen I2C-Range Expander erweitern" wenn jemand Lust und Interesse hat mit mir zusammen zu arbeiten bitte melden :-) habt vielen lieben dank Stefan P.s. bin ein wenig verzweifelt, hört man vielleicht raus... Mail: sb_newsletter@yahoo.de
:
Bearbeitet durch User
Hallo Stefan, ich habe vor ein paar Minuten ein neues Projekt-Beitrag veröffentlicht siehe hier Beitrag "AVR SDA-SCL One-Wire I2C Optokoppler" Nun, die Schaltungen (habe über 1 Dutzend davon gebaut) habe ich nicht zur Hand, sondern in meiner Firma. Bin noch bis 15.1 im Urlaub. Danach könnte ich 2 solche Platinen miteinander mit 50m verdrilltem 2 Draht verbinden und schauen ob das funzt. Wenn du noch so lange warten kannst. Ich habe diese Schaltungen gebaut um galwanische Trennung zu realisieren . Deshalb ist auch wichtig dass Master und Slave keine gemeinsame Stromversorgung haben ! Ich denke, da könnten wir Erfolg haben ! Gruß, csaba
Falk B. schrieb: > Da kann man den PCA9600 auch gleich weglassen! NXP schreibt dazu: > Bidirectional data transfer of I2C-bus signals > Isolates capacitance allowing 400 pF on SX/SY side and 4000 pF on > TX/TY side TX/TY outputs have 60 mA sink capability for driving > low-impedance or high-capacitive buses >>so lang sein. Verwendet man für den externen Bus auch noch eine höhere >>Spannung, verbessert man zusätzlich auch noch den Störabstand. > > Jaja, am besten gleich 12V oder mehr. OMG! NXP: > Supply voltage range of 2.5 V to 15 V with I2C-bus logic levels on > SX/SY side independent of supply voltage MfG Klaus
Gegenfrage: Warum ... willst du mit aller Gewalt einen für deine Anwendung nicht geeigneten Bus mit dir unverständlicher Hardware gegen Geld aufbohren lassen? ... nur um dann im nächsten Schritt herauszufinden, daß die i2c - Hardwaremodule in den AVR's fehlerhaft sind, und für Multiprozessoranwedungen (mehrer Arduinos) fast nicht zu gebrauchen sind? Aber des Mesnchen Wille ist sein Himmelreich... Viel Spaß. Oliver
Hallo Csaba, das wäre super... wenn das klappt kannst du mir bitte deine Mail Adresse geben. hab vielen lieben dank bin fast verzweifelt :-)
Hallo Oliver, was meinst du mit fehlerhaft, Alle Arduinos (aktuell 8) arbeiten auf meinem Tisch mit kurzen I2C Bus absolut stabil, selbst die RS232 Schnittstelle übergibt stabil und Störungsfrei alle Befehle selbst wenn der Bus mit Befehlen an einzelne Module bombardiert wird... bisslang keine Ausfälle... nun sitz ich halt an der Platine, die ersten Bauteile wurde geliefert und da dachte ich mir das ich den Expander hier mal aufbaue um zu schauen ob er auch funktioniert... was daraus geworden ist sieht man ja heul
Hallo Stefan, ...ich war es auch, bis mir diese NacSemi Schaltung das Leben versüsst hat :-)) Wie gesagt in den nächsten 8 Tagen habe ich keine Zeit, ich melde mich bei dir über eMail hier sb_newsletter@yahoo.de Korrekt? und wir finden eine Lösung, denke ich. Wer sich Mühe gibt, bekommt Mühe, wer sich noch mehr Mühe gibt, bekommt noch mehr Mühe, aber keine Lösung..... Ich bin kein besserwisser-Theoretiker, eher ein praktischer-Idealist ;-)) Gruß Csaba
ja die Mail ist korrekt, wenn du schreibst bekommst du die restlichen kontaktdaten :-) hab nochmal vielen dank
Hallo Stefan, Vielleicht postest du den Cod, der bei dir zwischen 2 Arduinos auf dem Tisch funktioniert.... eventuell könnte das auch andere User interessieren?! (habe dir Mail geschickt) Gruß,csaba
Hallo Falk, vielen dank für deine Lösung :-) habe Sie gerade erfolgreich testen können, werde morgen mal 100m Cat7 Ring kaufen und damit dann nochmal testen, ich halte euch auf den laufenden... Unterschied zwischen 148 und 149 VCC an allen Stellen an 12V angeschlossen... gerade mit 5m Cat5 getestet... das geht schonmal :-) Csaba wollte mir dieser Tage noch seine Lösung zukommen lassen, auch die würde ich gern testen wollen und halte euch alle gern auf den laufenden. Spannungsabfall berechnen: bei einer Buslänge von 100m ergibt sich bei Cat7 Leitung 0,5mm^2 (Paar doppelt genommen) I = 0,05 A l = 100 m cos Phi = 1 K = 56 Ohm * mm^2/m A = 0,5 mm^2 U = 12 V rechnerich ein Abfall von ca. 2,98% daher auch noch innerhalb der DIN VDE 18015 :-) werde euch berichten wenn das Kabel da ist und interesse besteht... An Alle@ habt alle nochmals vielen dank für das ausführliche Statement hab zwar nur die Hälfte Verstanden aber dank Falk sein Schaltplan (denn kann ich ja lesen kann) läuft es nun :-)
@ Stefan Bauerfeindt (sb_newsletter) >Unterschied zwischen 148 und 149 >VCC an allen Stellen an 12V angeschlossen... gerade mit 5m Cat5 >getestet... das geht schonmal :-) Was soll der Unsinn?? Die Widerstände R4/R5 müssen an 5V!!!! Und auch R5 und R13 sind an 5V deutlich sinnvoller! 1k an 12V verbrennt 144mW, da wird ein 0805er Widerstand schon tierisch heiß!
@falk @Stefan Danke euch beiden, für die Lösung und für den Bericht über die Funktion! Ich werde mir wahrscheinlich die Dinge auch bestellen, da meine Lösung mit dem Selbstbau-Koppler teuerer ist als vom Falk gepostete!!! Bin gespannt auf die weitere Test vom Stefan, bitte informiere uns weiter hier! Liebe Grüße! csaba
anbei die 5V Finale Version, geändert entsprechend dem Einwurf von Falk... Gibt es noch eine Möglichkeit die Gesamt Busspannung auf 12V anzuheben um denn Leitungsspannungsverlust auszugleichen?
@ Stefan Bauerfeindt (sb_newsletter) >Gibt es noch eine Möglichkeit die Gesamt Busspannung auf 12V anzuheben >um denn Leitungsspannungsverlust auszugleichen? Beim I2C gibt es keine riesigen Spannungsverluste, denn die Ströme der Signalleitungen sind sehr gering.
Stefan B. schrieb: > Gibt es noch eine Möglichkeit die Gesamt Busspannung auf 12V anzuheben > um denn Leitungsspannungsverlust auszugleichen? Der PCA verträgt eine Vcc von bis zu 15V. Auf der TX/RX Seite können die Pullups auch an diese Spannung angeschlossen werden. Der lange Bus kann also mit 12V laufen, unabhängig von der inneren Seite. Ich kann die Schaltungen oben nur schlecht erkennen, meine aber in der Nummer 149 wäre das auch so gemacht. Mehr Spannung erhöht immer den Störabstand, sieht man auch bei V24. MfG Klaus
100m Cat7 Kabel bestellt, sollte morgen früh geliefert werden stimmt die Aussage das ich bei der Leitungsverdrillung darauf achten sollte das SDA mit GND verdrillt sein sollte und SCL mit VCC daher bspw. Or = VCC Or/ws = SDA gn = SCL gn/ws = VCC oder sollte ein anderes Aderpaar verwendet werden, ich frage deswegen weil die Verdrillung bei Cat7 unterschiedlich ist z.B. ist das bl / ws.bl. Paar weniger verdrillt als or und gn...
@Klaus Bild 149 habe ich getestet, Wiederstände werden auch nicht warm Falk meinte aber das es da bei kleineren Wiederständen (Bauart) probleme geben soll... das konnte ich nicht testen weil ich keine SMD Wiederstände hier hab... wie gesagt ich bin kein Elektroniker :-) kannst du mir bitte erklären was das heißt: Mehr Spannung erhöht immer den Störabstand, sieht man auch bei V24. ist das gut oder schlecht??? Sorry bin ganz frisch in der Materie und hab mich die letzten 3 Monate nur um die Schnittstellen gekümmert
Stefan B. schrieb: > SDA mit GND verdrillt sein sollte und > SCL mit VCC Soweit Richtig. Auf keinen Fall SDA mit SCL, das gibt mächtiges Übersprechen. Also immer jeweils Signal mit Versorgung, welche ist egal. Und zum Störabstand: je höher der gültige Signalpegel, desto größer muß eine Störung sein, um ihn zu überwinden. Also großer Störabstand ist gut. MfG Klaus
An Alle die es interessiert: heute ist die 100m Cat7 Draka Netzwerkleitung gekommen ich habe diese nun zwischen denn beiden PCA9600 gelegt Orange = SDA Grün = SCL Keine Funktion --> I2C Bus Funktioniert nicht und hat bei meiner Testumgebung alle Module nach I2C Kommunikation zum Absturz gebracht... Orange = SDA ws/Orange = GND Grün = SCL ws/Grün = 12V Funktion erfolgreich getestet! und bei 5V und bei 12V erfolgreich testen können. der Spannungsabfall lag bei 0,3V auf 100m daher auch an dieser Stelle Danke Falk, für die Ergänzung der Pullup Wiederstände. Was ich jedoch noch nicht testen konnte ob der I2C Bus Probleme macht wenn ich die in jedem Modul befindlichen "L78S05CV" bei der 12V Leitung vorschalte... Sieht da irgendjemand Schwierigkeiten und wenn ja ist es sinnvoll die 5V I2C Steuerleitung auf ein anderes Aderpaar im Bus mitzunehmen?
Habe mal eine kleine Schaltung (IO_booster) aufgebaut, die 15m Leitungslänge mit 800kHz!!! SCL erfolgreich überbrücken konnte. Mit normalen 100kHz sollten also locker 50m und mehr gehen... Das Ganze funktioniert übrigens auch sehr gut mit OneWire! Eine andere Variante mit vorgeschaltetem level-shifter habe ich zwar entworfen, aber noch nicht testen können....
Hallo Mathias, hab vielen dank für deinen Beitrag :-) die vorher berichtete PCA9600 Lösung funktioniert fehlerfrei auf 100m getestet... OneWire wäre aber noch eine interessante Lösung hast du damit auch schon bei 100m testen können?
@ Stefan (Gast) >OneWire wäre aber noch eine interessante Lösung hast du damit auch schon >bei 100m testen können? 100m habe ich nicht getestet, aber eine vergleichbare, kapazitive Buslast. Beitrag "Re: Onewire + DS18x20 Library"
Hallo falk Vielen Dank nochmals für deine damalige Hilfe Wenn du magst schreib mir mal eine mail an sb_newsletter@yahoo.de:)
Stefan schrieb: > Hallo Mathias, > > hab vielen dank für deinen Beitrag :-) die vorher berichtete PCA9600 > Lösung funktioniert fehlerfrei auf 100m getestet... > > OneWire wäre aber noch eine interessante Lösung hast du damit auch schon > bei 100m testen können? Hi Stefan, getestet habe ich die OneWire-Verbindung mit der mir derzeit zur Verfügung stehenden 15m-Leitung. Allerdings ist die OneWire-Datenrate so niederfrequent, dass diese Strecke auch ohne IO-booster funktioniert. Auf dem Oszilloskop sehe ich aber einen sehr deutlichen Anstieg der Signalqualität. Aufgrund der niederfrequenten Daten sind die erreichbaren Distanzen mit dem IO-booster aber sicher mehr als 100m.
Hallo, ich buddle diesen Beitrag nochmal aus und möchte meine Erfahrungen mit dem PCA9600 Bus-Treiber mitteilen. Wie im attached Bild gezeigt, verwende ich eine Multipoint-Applikation mit einem ATmega32 als Master, siehe auch das Datenblatt. Die rot markierten Angaben stammen von mir. Ich habe bis heute 5 Slaves (ATmega8) mit je 10 m Flachbandkabel angeschlossen. Mit eine TWI bitrate von 50 Kbit/s (ich bin ja bescheiden) funktioniert die Schaltung einwandfrei. Dabei habe ich eine Bus-Spannung von 5V und 15V ausprobiert, es geht beides ! Der einzige Nachteil dieser Schaltung ist, dass der PCA9600 mittlerweile 4,50 € kostet - Grrrrr Falls ihr noch Fragen habt, beantworte ich die gerne ! Gruß Manni
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.