I2C Bus Gleisbildstellwerk - Module

Hallo

Mein neues Projekt ist der I2C Bus

Ich habe vor mit einem mega Master, Taster Signale von meinem Gleisbildstellwerk einzulesen, über den I2C Bus zu einem mega Slave zu senden. Dort sollen z.B. Lokschuppen Tore geöffnet und geschlossen werden, Weichen gestellt werden, Wasserkran bewegt werden usw. Um so wenig Kabel wie möglich vom Gleisbildstellwerk zu den Modulen zu installieren, habe ich mich für den I2C Bus entschieden. Da dies mein erstes I2C Projekt ist und ich mich noch im Anfänger Status befinde, brauche ich mal wieder Eure Hilfe.
Der Weg des I2C Bus ist unter einem Meter, was im Rahmen des Machbaren liegt.

Meine erste Frage ist die Verdrahtung:

Die eigentlichen Busleitungen ( SCL und SDA ) und Ground ( Masse ), sind mir klar.

Mit der 5 V Verdrahtung habe ich Probleme.

Der mega Master und mega Slave werden über je ein eigenes Netzteil eingespeist. In einem Bericht habe ich gelesen:

„Wenn die Platinen unabhängig voneinander versorgt werden, ist das 5V-Ausgangssignal des Masters an den VIN-Pin des Slaves anzuschließen. „

Beim recherchieren habe ich nur Bilder gesehen, wo die 5 V direkt miteinander verbunden sind.

Auch mit den Widerständen an den SCL und SDA Leitungen zu 5 V habe ich Probleme.

Einmal wird geschrieben man solle Widerstände zwischen 1 K Ohm bis 10 K Ohm verwenden. Habe mich nach einem Beispiel für 1,8 K Ohm entschieden.
Beim recherchieren habe ich auch Bilder gesehen, wo überhaupt keine Widerstände eingebaut waren.

Was ist Eurer Meinung nach richtig?

Bitte gebt mir keine englisch sprachigen Links, bin nicht mehr der Jüngste und habe mit der englischen Sprache kleine Probleme.

Danke für Eure Bemühungen

Gruß BJS

Teilweise haben i2c Komponenten die Widerstände schon drauf. Grundsätzlich je kleiner der Widerstand, desto weniger störanfällig, aber u.U. muss die Geschwindigkeit runter gesetzt werden. Wenn mehrere Komponenten Widerstände verbaut haben, muss das ggf. berücksichtigt werden. Guter Wert zum Anfangen sind 4,7k

Die 5V müssen nicht verbunden werden. Und wenn, dann Vin. Allerdings kann es dann bei Verwendung von mehreren Netzteilen zu Ausgleichströmen kommen, was nicht wünschenswert ist.

Besser alles an ein einziges 5V Netzteil.

Ich würde in so einem Anwendungsbereich sogar zu i2c Treibern raten und den Bus mit 12V betreiben.

BJS-1952:
Der mega Master und mega Slave werden über je ein eigenes Netzteil eingespeist.

Dann die 5V nicht verbinden, sonst arbeiten die Netzteile gegeneinander.

Alternativ zu getrennten Netzteilen gehen auch StepDown-Wandler. Beispiele:
Mini 3A DC Spannungsregler - 5A DC-DC Step Down - mit Anzeige Einstellbarer Konverter Konstantstrom 5A
(die Links sind Anschauungsbeispiele, keine Kaufempfehlung)

BJS-1952:
Auch mit den Widerständen an den SCL und SDA Leitungen zu 5 V habe ich Probleme.

Einmal wird geschrieben man solle Widerstände zwischen 1 K Ohm bis 10 K Ohm verwenden. Habe mich nach einem Beispiel für 1,8 K Ohm entschieden.
Beim recherchieren habe ich auch Bilder gesehen, wo überhaupt keine Widerstände eingebaut waren.

Der Mega2560 hat 10 kOhm PullUp-Widerstände eingebaut. Auf kurze Entfernung brauchst Du keinen externen. Einen Meter habe ich noch nicht probiert, hängt auch von den Störungen (fahrende Loks) ab. Die 5 kOhm Summe der Megas mit externen 1,8 kOhm ergeben 1,3 kOhm, das ist schon recht wenig. Letztlich wirst Du es probieren müssen, erst ohne externen, dann mal mit 10 kOhm, dann mit 4,7 kOhm. Ein Oszi könnte Dir nützlich sein. Außerdem könnten einzeln abgeschirmte Adern, einseitig an GND, helfen. Kabel aus der NF-Technik (Mikrofonkabel) sind da gut zu verwenden.

Wenn das nichts bringt, dann I2C-Treiber.

Hallo,

die Spannungsversorgung des nächsten Arduinos von dem davor usw. halte ich für keine gute Idee.
Der erste Arduino muss für alle den gesamten Strom liefern und kann bei Lastwechsel diese auch nicht sauber stabil halten.
Also entweder du hast ein stärkes stabilisiertes 5V Gleichspannungsnetzteil und versorgst alle von da aus sternförmig an den "5V" Kontakt.
ODER.
Du hast ein stabilisiertes Gleichspannungsnetzteil was mehr wie 5V liefert, im besten Fall 7V...9V, dann kommt das ebenfalls sternförmig an die "VIN" Kontakte.
Egal wie, alle Masseverbindungen müssen verbunden sein. Am besten auch sternförmig und nicht nur von einem zum anderen durchgeschleift. Das ist wichtiger wie die Spannungsverdrahtung.

Während der Entwicklung würde ich eh nur mit >7V Netzteil an die runde Buchse gehen zusammen mit USB.

Wenn du ganz sicher gehen möchtest, versorgst du den Arduino nur mit USB zum programmieren und den ganzen Rest der Schaltung separat mit 5V die nicht vom Arduino angezapft werden. Nur die Massen sind verbunden. Das entlastet bei größeren Verbrauchern wie Servo usw. den Spannungsregler des Arduinos und vermeidet auch Störungen für den Arduino. Wenn die Programmierung fertig ist, versorgste ihn am 5V oder VIN Kontakt.

Hoffe ich habe nicht zu viel geschrieben und der Kern ist noch klar lesbar. :slight_smile:

Die weitere Frage wäre, wie lang soll denn deine I2C Verbindung werden?
Wenn du die I2C Leitung um die gesamte Modelleisenbahnanlage ziehen möchtest rate ich davon ab.

deutsche Doku findest du viel mit Suchbegriffen wie "Grundlagen I2C" oder "Pullup I2C".
Die beste Doku zu I2C und Pullup gibts leider nur in englisch Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino
Kurzinfo daraus, zwischen 2,2k und 4,7k macht man erstmal nichts falsch.
Aufpassen muss man, wie EIEspanol schon schrieb, falls gekaufte Module schon Pullups drauf haben.
Die muss man dann irgendwie entfernen, wenn man mehrere verwendet.

@ agmue: die µC internen Pullups haben ca. 50 kOhm.

Doc_Arduino:
@ agmue: die µC internen Pullups haben ca. 50 kOhm.

Diese Aussage ist richtig, wenn sie beim Mega2560 tatsächlich benutzt werden, was ich nicht weiß! Zusätzlich hat der Mega2560 laut Schaltplan noch je einen 10 kOhm PullUp auf der Platine:

Mega2560_PullUp.png

Hallo

Danke für Eure schnelle und informativen Antworten.

Das mit den I2C-Treibern habe ich mir auch schon überlegt. Werde den Aufbau gleich mit den I2C-Treibern realisieren. Ich habe mir vorgestellt, dass es mit P82B715PN funktioniert.

Als Verbindung werde ich eine Telefon-Leitung ( 2 x 2 x 0,6 ) abgeschirmt verwenden. Bei dieser Leitung sind immer 2 Adern-Paare verdrillt.
Kann ich ein Adern-Paar für SCL / SDA und ein Adern-Paar für 5 V / Ground verwenden oder
ein Adern-Paar für z.B. SCL / Ground und ein Adern-Paar SDA / 5 V ?

Zur Spannungsversorgung werde ich ein geregeltes Netzteil 7-9 V verwenden, dass bei jedem, mega Master sowohl auch mega Slave, in die runde Buchse führt und werde die 5 V Pin`s nicht verbinden.
Ich hoffe, dass dies richtig ist.

Die Ausgänge des mega Slave werden auf Optokoppler oder Relais geführt, die mir das Signal zu den Servo-Modulen führt. Somit ist die Gefahr der Störungen zum mega Slave und I2C Bus gering.

So wie ich Euch verstanden habe, sind die PullUp-Widerstände beim mega 2560 schon eingebaut und brauchen nicht erst aktiviert werden.

Noch eine Frage zum Schluss.

Wie bekommt Ihr die weiss abgesetzten Einträge hin? Wie man Sketche einstellt habe ich kapiert.

Danke im Voraus

Gruß BJS

Die I2C-Verkabelung solltest du nach deinem 2. Beispiel ausführen. SCL und GND, SDA und +5Volt.
So habe ich es bei mir auch über 20 Meter (mit Portextendern P82B715PN) laufen.

Die weiß abgesetzten Beiträge sind Quote-Beiträge, die bekommst du über die Schaltfläche quote unterhalb des Beitrages den du wiedergeben möchtest.

BJS-1952:
So wie ich Euch verstanden habe, sind die PullUp-Widerstände beim mega 2560 schon eingebaut und brauchen nicht erst aktiviert werden.

Ja.

BJS-1952:
Wie bekommt Ihr die weiss abgesetzten Einträge hin? Wie man Sketche einstellt habe ich kapiert.

Da gibt es einen "Quote"-Knopf zum Zitieren des Textes, auf den Du Dich beziehen möchtest.

BJS-1952:
Das mit den I2C-Treibern habe ich mir auch schon überlegt. Werde den Aufbau gleich mit den I2C-Treibern realisieren. Ich habe mir vorgestellt, dass es mit P82B715PN funktioniert.

Hier musst du aber bedenken, du brauchst von diesen Portextendern mindestens 2 Stück.
Also auf jeder Seite einen.
Und die Leitung dazwischen bekommt auch einen eigenen Pullup-Widerstand.

Hallo,

@ agmue: upps, das hatte ich in der Ecke übersehen. Sorry.

@ HotSystems: satte 20m I2C Leitung? Na alle Achtung für das Meisterstück. Eigentlich ist das viel zu lang.

Doc_Arduino:
@ HotSystems: satte 20m I2C Leitung? Na alle Achtung für das Meisterstück. Eigentlich ist das viel zu lang.

Ja, das bezog sich allerdings auf die Leitungslänge zwischen den Portextendern(P82B715PN), nicht direkt.

Sorry, wenn das so nicht rüberkam. Habe ich angepasst.

Wenn du jeden Arduino mit eigenem Netzteil versorgst, darfst du die 5V nicht mitführen. Somit kannst du die Adernpaare jeweils mit Masse verdrillen.
Und den Bus zwischen den Expandern mit 12V, dann gibt es keine Reichweitenprobleme. Ich habe so mit P82B96 bei über 30m mit CAT5 UTP keine Probleme.

Die 12V führe ich mit und mach mit einem 7805 dann die 5V

ElEspanol:
Wenn du jeden Arduino mit eigenem Netzteil versorgst, darfst du die 5V nicht mitführen. Somit kannst du die Adernpaare jeweils mit Masse verdrillen.
Und den Bus zwischen den Expandern mit 12V, dann gibt es keine Reichweitenprobleme. Ich habe so mit P82B96 bei über 30m mit CAT5 UTP keine Probleme.

Die 12V führe ich mit und mach mit einem 7805 dann die 5V

Ja, die Typen sind noch besser, aber der TO hat offensichtlich die P82B715PN im Haus.
Und bei mir sind die auch schon länger im Einsatz, da hat es die P82B96 noch nicht gegeben.

Doc_Arduino:
@ agmue: upps, das hatte ich in der Ecke übersehen. Sorry.

Ich habe die auch erst nicht gesehen, bis mich jemand mit der Nase drauf gestoßen hat.

ElEspanol:
Die 12V führe ich mit und mach mit einem 7805 dann die 5V

Wegen der bei Eisenbahnen üblichen 16 V würde ich sogar über 24 V zusammen mit StepDown (die werden kaum warm) anstelle 7805 nachdenken. Doppelte Spannung gleich halber Strom ist immer ein in die Überlegungen einzubeziehendes Argument. Die 24 V reichen auch für Schrittmotorsteuerungen (DRV8825) und dergleichen. Die Kabel etwas dicker, die Spannung etwas höher, später freut man sich.

Hallo,

Wie ich an der Besucherzahl an meinem Topic sehe, habe ich ein interessantes Thema für Modelleisenbahner und melde mich wieder.

HotSystems:
Ja, die Typen sind noch besser, aber der TO hat offensichtlich die P82B715PN im Haus.
Und bei mir sind die auch schon länger im Einsatz, da hat es die P82B96 noch nicht gegeben.

Ich kannte nur den P82B715PN und habe erst hier erfahren, dass es den P82B96 auch gibt. Zu dem Zeitpunkt hatte ich mir die leider schon bestellt.
Beim recherchieren ( google‘n ) bin ich auf nachfolgenden Artikel gestoßen. Damit Anderen, die sich mit der gleichen Materie befassen, nicht auch das gleiche passiert, dachte ich mir, ich setze ihn hier rein.

So wie in meinem Topic „ Gleisbildstellwerk „ versuche ich immer ausführlich zu schreiben, damit gleichgesinnte Modelleisenbahner es leichter haben und mir der eine oder andere auch mal hilft.

Bustreiber

Bustreiber haben die Aufgabe die maximale Buskapazität von 400pF zu erhöhen. Dies erreichen die Bausteine i.d.R. durch eine Steigerung des Stroms auf dem Bus. Die drei bekanntesten Bustreiber für diesen Zweck sind folgende:
• P82B715 (3000pF, max. 100kHz)
• P82B96 (4000pF, max. 400kHz)
• PCA9600 (4000pF, max. 1MHz)
Alle drei Typen haben ihre Vor- und Nachteile. Wobei der PCA9600 als Nachfolger vom P82B96 angesehen werden kann und im Prinzip nur Vorteile gegenüber dem P82B96 hat (Abgesehen vom Preis und der Beschaffbarkeit :wink: - PCA9600 Gibts nun bei Reichelt!)
Der Hauptunterschied zwischen P82B96 und PCA9600 sind die Spannungspegel an der Sx/Sy Seite des ICs. Der P82B96 kann diese Pins bei einem low-Signal nicht weiter als 0,88V nach unten ziehen (I²C kompatibel, nicht TTL kompatibel). Der verbesserte PCA9600 kann bis auf 0,74V herunter ziehen (I²C und TTL kompatibel). Des weiteren hat der PCA weniger Laufzeitverzögerung und ist bis zu 1MHz Bustakt spezifiziert.
Der P82B96 (und PCA9600) verhindert eine Rückkopplung indem er an seinen Sx/Sy Eingängen ein low bei 0,65V erkennt, ein low selber aber nur mit 0,88V ausgeben kann. Informationen die über die T/R Seite kommen, werden also von einem zweiten, parallelgeschalteten, Bustreiber des gleichen Typs nicht weitergeleitet. Im Gegensatz zum P82B715 können die ICs verschiedene Busspannungen "übersetzen". Die gepufferte Seite kann also mit einer anderen Busspannung betrieben werden als die Sx/Sy Seite.
P82B96 und PCA9600 können statisch 30mA treiben. In der Application Note AN10216 (Seite 46) wird von NXP geschrieben dass mittels externer Transistoren der Strom noch weiter erhöht werden kann. Bei 30kHz wird eine mögliche Gesamtlänge von 1km angegeben.
Recht einfach aufgebaut ist der P82B715. Intern arbeitet nur ein Stromsensor, der auf der gepufferten Seite mittels Transistors den Strom bei low Pegel erhöht. Er hat somit nicht die Probleme mit bestimmten Spannungspegeln wie die P82B96 und PCA9600 ICs. Dafür muss beim P82B715 auch die ungepufferte Seite zur Gesamtbuslast mit einbezogen werden. Auch ist es nicht möglich die gepufferte Seite mit anderer Spannung zu bertreiben. Auf der gepufferten Seite (LDA/LCL) besitzt der P82B715 nur jeweils einen Pin für jede Busleitung. Applikationen die getrennte TX und RX Pins benötigen, sind mit dem P82B715 also nicht möglich.

Zurzeit warte ich bis die P82B715PN kommen und ich weitermachen kann.
Melde mich auf jeden Fall wenn es weiter geht.

Zum Schluss noch eine Frage: wie stellt man Bilder im JPG Format hier ein.

Gruß BJS

Für deine Ausführung gibt es erst mal ein Karma.

Diese Darstellung wird sicher vielen weiter helfen, die in die Technik (I2C über lange Leitung) einsteigen möchten. Noch sollte man erwähnen, der P82B715 ist als DIL-Ausführung nur noch schwer zu bekommen.

Allerdings ist der P82B715 für deine Anwendung (und viele andere auch) bestimmt ausreichend.
Und ich komme damit auch sehr gut klar.

Bilder kannst du per "Attachments and other Options" unterhalb des Editors einfügen.
Sichtbar wenn du auf "Preview" klickst.

Hallo

Die P82B715 sind da und ich warte noch auf die Spannungs-Versorgungs-Bauteile.

Bin gerade dabei einen Testaufbau mit einem mega als Master und einen uno als Slave aufzubauen, um verschiedene Sketche zu testen.

Der mega wird über ein 9 Volt Netzteil eingespeist. Der uno bekommt die 5 Volt vom mega und wird über Vin eingespeist.

SCL und SDA Leitungen, ca. 30 cm lang, sind in der Mitte mit je einem 4,7 K Ohm Widerstand an 5 Volt gelegt.

Leider komme ich mit den Sketchen auf keinen grünen Zweig. Ich habe das Gefühl ich habe mir mal wieder zu viel vorgenommen.

Nachfolgend ein eigentlicher einfacher Sketch, der aber nicht funktioniert.

// Mega2560 - Master

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Serial.println('E');    
  Wire.begin(9); 
}
void loop() {
  if (Serial.available())
  {
    char x = Serial.read();
    if ((x == 'E') || (x == 'A'))
    {
      Wire.beginTransmission(9); 
      Wire.write(x);          
      Wire.endTransmission();  
    }
  }
}
// uno - Slave

#include <Wire.h>

int LED = 13;
volatile char x;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  pinMode (LED, OUTPUT);
  Wire.begin(9);
  Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes)
{
  x = Wire.read();
}
void loop()
{
  if ((x == 'E'))
  {
    digitalWrite(LED, HIGH);
  }
  if ((x == 'A'))
  {
    digitalWrite(LED, LOW);
  }
  Serial.println(x);
}

Vielleicht kann mir jemand helfen und mich auf den richtigen Weg führen.

Brauche einen Sketch, bei dem beim mega über mehrere Taster eingelesen wird z.B. Weiche gerade / Weiche rechts und beim uno die Taster-Befehle zum ansteuern von z.B. LED’s, der gleichzeitig auch die Servo-Decoder über Optokoppler ansteuert.

Danke und Gruß
BJS

Hier sind einige Beispiele die dir helfen sollten:
I2C-Master-Slave-Beispiele

Hallo

Bin jetzt zwei Wochen damit beschäftigt einen Sketch zu schreiben, der auch funktioniert. Ist mir leider bis jetzt nicht gelungen. Die gutgemeinten Ratschläge haben mich etwas weiter gebracht, aber leider nicht so weit, dass ein brauchbares Ergebnis dabei heraus gekommen ist.
Ich habe deshalb auf meiner Versuchs-Schaltung, zwei uno, Master / Slave und die SDA / SCL Leitungen ca. 30 cm an einem 4,7 k Ohm und einmal an einem 1,8 k Ohm Widerstand an + 5 V verbunden, verschiedene Sketche getestet. Der zweite uno ( Slave ) bekommt die 5 V vom Master.
Da meine Sketche nicht funktionierten, habe ich einen einfachen LED Blink Sketch aus dem Internet getestet. Und Hurra es funktioniert. Voller Freude habe ich ein paar Tage Pause gemacht, um mit neuem Elan weiter zu machen. Beim erneuten Starten kam die Realität zurück. Der Sketch funktioniert nicht mehr. Mit einem schon etwas älteren aber damals teurem Oszillograph habe ich mir die SDA / SCL Leitungen angeschaut. Man sieht wie Daten und Takt über die Leitungen gesendet werden, kann aber nicht genau sagen ob die Flanken richtig sind. Nach jedem Null Signal sieht man nur schwache Nadelimpulse. Wie ich so längere Zeit auf den Bildschirm des Oszillograph schaue, hat sich das 9 Volt / 500 mA Steckernetzteil mit einem lauten Knall verabschiedet. Der 1 Ohm Eingangs Widerstand, Gleichrichter MB10F und der 2,2 uF Kondensator haben sich in einen Zustand von dunkel braun zu hell schwarz verwandelt. Auch der Arbeitsraum hat längere Zeit nach verbrannten Amper-Würmern gerochen. Dies sind die kleinen unsichtbaren Lebewesen, die sich hauptsächlich in 230 Volt Leitungen aufhalten und beim Berühren von blanken Leitungen zubeißen.
Man sagt auch man habe einen Stromschlag bekommen.
Zum Glück funktionieren die zwei uno noch.

Jetzt sitze ich hier und weiß nicht mehr weiter.

Gruß BJS

Ich gehe mal davon aus, das defekte Netzteil hast du getauscht.
Dann solltest du noch die Pullup-Widerstände am I2C auf 4,7 k setzen. Warum hast du unterschiedliche genommen ?

Wo ist jetzt dein Problem ?
Funktioniert dein Sketch noch, oder nicht ?
Dann zeige uns den Sketch und schreibe genau was err machen soll.