EMV Probleme beim I²C

Hallo zusammen,

erst mal ein frohes neues Jahr. Ich möchte hier ein Problem vorstellen, dass mich im Jahr 2018 fast bis zur Verzweifelung getrieben hat und zu dem man in diversen Foren leider nur die üblichen Ratschläge erhält.
Ich habe an meiner Modellbahnanlage ein paar Probleme mit der EMV und dem I²C Bus. Ich weiß, dass das sehr individuell ist und man gewisse Dinge einhalten soll, damit Störungen sich nicht ausbreiten und keinen Einfluss haben. Auch weiß ich, dass der I²C nunmal störanfällig ist und nicht das Maß der Dinge im Bezug auf EMV ist.
Der Arduino Nano den ich benutze stürzt mir manchmal ab. Ich habe an diesen ein 2x16 Zeichen Display angeschlossen und dieses wird nunmal über den I²C Bus angesteuert. Ich habe es ausprobiert, ob es an etwas anderes liegt, aber es ist offensichtlich der Bus. Immer wenn eine bestimmte Weiche schaltet kann es passieren und der Arduino hängt sich auf. Dummerweise bleibt dann noch die Weiche eingeschaltet. Das ist garnicht gut. Pro Weiche fließen im Anfangsmoment ca. 2 Ampere. Das ist ordentlich. Nun suche ich nach einer einfachen Lösung. Der Weg vom Nano bis zum Display ist 200mm lang. Ich verwende die handelsüblichen Steckverbinder. In diversen Foren wurde eine so kurze Verbindung als unkritisch betrachtet und ich hätte auch diesem zugestimmt.
Dem Ganzen bin ich auf die Schliche gekommen, indem ich im kompletten Programm einmal den I²C Bus ausgeklammert habe und keine I²C Kommunikation hatte mit dem Display. Da lief die ganze Anlage über Stunden und an mehreren Tagen einwandfrei. Dann habe ich die "alte" Software eingespielt und siehe da, wieder ein Absturz. Eigentlich wollte ich den Watchdog beim Nano benutzen, der aber mit den Bootloader nicht wirklich funktioniert. Das war mein erster Gedanke. Die zweite und vielleicht sogar bessere Idee kam mir gleich hinterher. Erst garnicht den I²C Bus benutzen, solange ich ihn nicht brauche. Im Nachhinein betrachtet, benötige ich das Display nur, wenn ich Daten verändern möchte. Es sind 5 Tasten angeschlossen und wenn ich die Parameter damit ändern möchte muss der Betrieb sowieso pausieren. Schöner wäre es aber, dass mir wenigstens die Parameter vor Beginn einmal angezeigt werden, damit ich entscheiden kann die Parameter anzupassen. Daher hier meine Frage. Wenn der I²C Bus einmal mit "Wire.begin" initialisiert wurde, wie kann ich dann diesen komplett deaktivieren? "Wire.off" oder "Wire.end" gibt es ja leider nicht. Wenn ich keinen Befehl zum Display sende, findet dann auf dem Bus trotzdem eine Kommunikation statt? In dem Moment, wo eine Weiche geschaltet wird, wird auch an dem Display eine Nachricht ausgegeben. Ich habe hier im Programm schon mit "delays" gearbeitet, sogar im Sekunden Bereich, allerdings immer ohne Erfolg. Auch wenn keine Nachricht gesendet wird zum Display, bleibt der Effekt der gleiche. Es tritt eigentlich schon auf mit "Wire.begin". Sobald diese Programmzeile entfernt wird, läuft es. Wie kann ich also den Controller wieder so einstellen, dass A4 und A5 wieder normal arbeiten? Es ist nur das Display angeschlossen an dem Bus. Vielen dank für Eure Mühen und/oder weitere Vorschläge! :slight_smile:

Hast du am I2C Pullup-Widerstände 4,7 k gegen 5V geschaltet ?
Und du solltest besser abgeschirmtes Kabel verwenden, auch wenn 20 cm nicht lang ist, aber Störimpulse sind da gefährlich.
Sind an den Weichenmagneten auch Freilaufdioden angeschlossen ?

Hi

Frage an 'die Anderen': Kann sich die I²C-Lib aufhängen?
Mein Gedanke geht in die Richtung, daß durch eine Störung ein Spike auf den I²C-Bus gelangt, einen Interrupt triggert und der Arduino dann stundenlang auf die ersehnten Daten wartet.
Wäre mir bei meinen Spielereien aber noch nicht aufgefallen ... war aber auch nur 'eine Idee'.

Ggf. die PullUp-Widerstände gegen 2k2 oder 1k verkleiner, daß die Störungen schon 'ordentlich Wumms' haben müssen.
Zwar nur ein Umgehen des Problem, aber besser als der Dauer-Absturz bei Nutzung dieser einen Weiche.
Innerhalb der Specs müssten wir uns damit auch noch befinden, habe das Dokument gerade aber nicht zur Hand!

Stichwort: Wenn das Problem NUR bei der einen Weiche auftritt - ist ggf. dort was faul - vll. ist hier die Entstörung (RC-Glied oder so was) defekt/nicht mehr angelötet.

MfG

Hallo HotSystems,

nein ich benutze die internen Widerstände. Ich habe allerdings keinen Platz auf der Leiterplatte bzw. ich müsste die Dinger da rein braten ein Konstrukt dran kleben und dann wären die gut 20 Verbindungen die abgelötet werden müssen und das ganze gleich 2 mal, da ich es doppelt angefertigt habe und auch doppelt betreibe. Gut wäre es zu wissen, warum sich der Arduino aufhängt mit der Bibliothek.
Zu den Weichen: Im Gegensatz zu den meisten betriebe ich diese tatsächlich mit Gleichstrom. Also einfach nur mit einer gleichgerichteten Wechselspannung ohne Glättungskondensator. Das hat gewisse Vorteile. Freilaufdioden sind an den Endstufen vorhanden. Die Eingangskreise sind mit Transildioden geschützt bzw. galvanisch mit Optokopplern getrennt.

Hallo postmaster-ino,

warum ist es nur die eine Weiche? Es liegt am Widerstand der Weichen. Ich habe alle durchgemessen. Ich besitze ungefähr 12 Stück dieser Dinger. Die Dinger schwanken zwischen 4 und 6 Ohm mit dem Multimeter gemessen. Das eine Exemplar ist eine besonders niederohmige Weiche. Das Problem ist, dass das Gleismaterial schon seit Jahrzehnten nicht mehr hergestellt wird. Der Ersatz bzw. guter Ersatz ist teuer und nicht sofort zu finden. Hinzu kommt der Einbauort. Ein Tausch dauert in der Anlage mit modellieren ungefähr einen halben Tag. Aktuell geht es etwas schneller, da ich es nur provisorisch eingebaut habe, damit ich es etwas schneller wechseln kann. Eine Reparatur einer defekten Weiche ist ausgeschlossen, denn sobald die Weiche länger als 10s eingeschaltet ist, wird die Spule schon zu warm. Sie brennt sich im Kunststoff ein und dieser verzieht sich und somit auch schon die Mechanik. Am Anfang merkt man es noch nicht so doll. Wenn man Glück hat auch garnicht. Das Problem ist die kurze Zeit die man hat um die Weiche zu retten. Eine Reparatur ist eher die Ausnahme. Auch der Lackdraht der Spulen ist sehr schlecht. Aus einer alten Weiche habe ich die Spule einmal 10s bestromt und 30s Pause zum abkühlen gegeben. Das ganze habe ich 10 mal wiederholt und festgestellt, dass der Widerstandswert dauerhaft sinkt. Die Weiche an sich schaltet die Mechanik sehr schnell um. Ein kurzer Impuls genügt schon. Länger als eine Sekunde sollte sie nicht bestromt werden. Man kann also leicht einen Windungsschluss produzieren. Deswegen habe ich auch eine Strommessung intergiert, die den Strom überwachen soll. Die Routine hat gemessen und dafür gesorgt, dass nach einer einstellbaren Zeit abgeschaltet wird. Sollte der Strom zu groß sein, dann wird sofort mit einer Störmeldung abgeschaltet. Aber soweit kommt der Arduino nicht, der stürzt mir längst ab. Ich habe mir bereits 2 Weichen zerstört. Weitere 2 Weichen liegen hier als Reserve rum. Ich versuche mal die Pull-Ups zu ändern. Ich würde aber auch gerne die Software so immun dagegen machen wie es nur geht und möchte das Display irgendwie dabei nutzen.

Vielen Dank für die Hilfe!

Hi

Anderer Ansatz: wie viel Strom braucht die Weiche, um sicher umzuschalten?
Kann Sie diesen Strom länger ab?
Ich will Deine Weichen hier nicht grillen, wäre aber doch schon schön, wenn ein abgestürzter Arduino keine Mehrkosten in ungeahnter Höhe nach sich zieht.
Wird die Weiche umgepolt, oder hat Diese zwei 'Richtungsdrähte'?
Bei Letzterem könnte man mit einem Kondensator einen 'satten' Stromimpuls durch die Weiche lassen, dann aber lädt sich der Kondensator auf und sperrt den Gleichstrom.
In wie weit die Restwelligkeit hier in die Suppe spuckt, müsste man antesten (ggf. mit einem Multimeter als Weichenersatz).
Über den Kondensator ein Widerstand, damit sich Dieser binnen 2 Sekunden (?? reicht Das?) wieder entladen kann.

Irgend Etwas stört momentan Deinen Arduino und wie ich Das verstanden hatte, hängt Er Sich zuverlässig bei EINER Weiche auf, weshalb ich genau dort einen Angriffspunkt sah.

Die Vorversuche sollten, gerade wenn Ersatzteilbeschaffung etwas schwierig und finanziell 'nicht Ohne' ist, vll. ohne Weiche statt finden - vll. kann man auch eine KSQ vor jede Weiche packen - dazu müsste aber der MINDEST-Strom geringfügig unter 'Weiche überlebt'-Strom liegen.

MfG

Die Pullups kannst du eventuell auch an das I²C Backpack vom LCD ranpfuschen.

Aber mal OT zu den Weichen:

Für Wechselspannung bestimmte Elektromagnete an Gleichstrom betreiben ist keine gute Idee:
Bei Wechselspannung begrenzt die Spuleninduktivität den Strom, was bei Gleichstrom nicht der Fall ist, deswegen Werden die Teile zu heiß.

Hi

Hoppla - in die Richtung hatte ich jetzt gar nicht gedacht - fehlender Blindwiderstand führt zu höherem Strom - guter Punkt!

MfG

Expressler:
Hallo HotSystems,

nein ich benutze die internen Widerstände. Ich habe allerdings keinen Platz auf der Leiterplatte bzw. ich müsste die Dinger da rein braten ein Konstrukt dran kleben und dann wären die gut 20 Verbindungen die abgelötet werden müssen und das ganze gleich 2 mal, da ich es doppelt angefertigt habe und auch doppelt betreibe. Gut wäre es zu wissen, warum sich der Arduino aufhängt mit der Bibliothek.
.....

Willst du ein funktionierendes System ? Dann solltest du dich unbedingt an die Spezifikation halten und da sind 20 - 50 k zu groß.
Du musst def. 4,7 k oder kleiner verwenden, anders hast du keine Chance und abgeschirmtes Kabel verwenden.

Wie schon geschrieben wurde, geht auch auf dem Display, ist aber nicht optimal, da zu weit vom Controller entfernt.

Edit:
Hierzu fällt mir ein, hast du mal den Controller gewechselt.
Ich hatte mit einem Uno mal ein Problem am I2C-Bus der ohne Grund (kein Relais oder Motor vorhanden), sich aufhängte.
Uno gewechselt und alles war gut.

Hallo zusammen,

vielen dank für die vielen Antworten und Ideen. Ich versuche mal viele der Fragen von euch zubeantworten.

@ noiasca:

a) Um sicher zu gehen: Der Nano mit dem i2c LCD hat auch die Ansteuerung der Weichen über?

Der Arduino Nano steuert das Display und die Weichen.

b) versehe deinen Sketch "mit vielen" Serial-Outputs und beobachte über den Serial.Monitor EXAKT die Stelle wo der Nano vermeintlich stecken bleibt.

Habe ich bereits gemacht. Der letzte Befehl der ausgeführt wird ist der Einschaltbefehl für den Port-Pin. Alle weiteren Befehle werden nicht mehr ausgeführt.

c) Workaround: lass erst die Weiche schalten und nachdem der Strom von der Weiche weg ist, machst ein Update des LCD. Beobachten: wo bleibt nun der Nano vermeintlich stecken? Zumindest kann nun keine Weiche mehr durchbrennen.

Leider doch, weil der Nano die Befehle nicht weiter verarbeitet und die Weiche nicht abschaltet. Da hilft nur den Reset-Knopf zu drücken. Ich habe auch mal den Nano getauscht. Bringt auch nichts.

d) I2C steht für Inter-Integrated Circuit. Aus meiner Sicht hat da kein 200mm Kabel etwas verloren schon gar nicht in einer Umgebung mit Magnetartikel und Motoren. Überleg dir ein anderes Bus-System.

Das Display hat leider nunmal den Anschluss. Mehr I/O Pins habe ich nicht zur Verfügung. Sonst müsste ich ein I/O Expander benutzen. Das ist ziemlich doof. Dann würden wichtigere Daten verfälscht werden. Das wäre wahrscheinlich noch katastrophaler. Ein Arduino Mega-Board wäre zu groß, da die Einbausituation doch recht beengt ist. Außerdem möchte ich ungern mein Layout in die Tonne klopfen. Dann müsste ich neu bestellen, bestücken etc. und würde nicht fertig werden.

Danke für den Link aus dem Stummiforum. Das ist sehr interessant mit den beiden Dioden und dem Kondensator und auch clever gelöst. Wenn es hart auf hart kommt werde ich diese Idee mit einbauen in einem neuen Layout.

@postmaster-ino:
Die Weiche hat zwei Spulen für je eine Richtung also eine. Das mit dem Strom mess ich mal nach. Das Problem an den Dingern ist, dass es eine absolute Fehlkonstruktion ist. Aber selbst wenn die Zeit von 10s dadurch auf 30s ansteigen würde, wäre es ein enormer Fortschritt. Dann hätte ich mehr Zeit zu reagieren. Defekte Weichen zum "spielen" habe ich. Das Thema beschäftigt mich schon länger, habe aber immer nur mal einen Sonntagnachmittag am Stück dran gearbeitet oder die Software geschrieben. Jetzt habe ich mal ein paar zusammenhängende Tage.

@Verzweifler:
Das ist ein guter Hinweis mit der Induktivität. Ich habe bei der Erstellung des Schaltplans darauf geachtet und auch diese Möglichkeit abgeklärt. Auf der Arbeit haben wir eine LCR-Messbrücke. Die Weichen habe ich damals damit ausgemessen. Die Messwerte habe ich nicht mehr, aber ich weiß, dass es für den Betrieb mit einer gleichgerichteten Sinusspannung OK war. Das Problem ist, dass die Spule an sich schon zu niederohmig ist. Auch bei Wechselstrombetrieb passiert dies. Eine einfache, wenn auch nicht ganz korrekte Rechnung zeigt das Problem. Aus dem Trafo kommen 16V AC. Bei 6 Ohm fließen 2,6A. Bei 4 Ohm schon 4A. Das schafft der Trafo nicht ganz bzw. kurzzeitig. Dabei werden 41,6W bzw. 64W umgesetzt. Das ist für eine Spule die 4cm lang und einen Durchmesser von von keinen Zentimeter hat einfach zu viel. Ich weiß, dass diese überspitzte Rechnung etwas hängt. Denn der Trafo knickt ja noch ein und damit wird die Energie begerenzt. Liefern kann er aber ca. 50W. In der Größenordnung liegt der Wert aber dennoch.
Du siehst es richtig, dass ein kurzer Impuls nur nötig ist, um die Weiche umzulegen. Ich behaupte, dass ein Impuls von 500ms reichen würde. Aber mein Nano hängt sich genau an dieser Stelle auf und schaltet nicht ab. Dann brennt die Weiche durch. Eins meiner Ziele ist es, die Software so gut es geht immun dagegen zu machen und am liebsten würde ich die komplette Kommunikation einstellen. Wie gesagt sobald Wire.begin im Programm aktiviert ist, kommt es zu den abstürzen.

@ HotSystems:
Klar will ich ein funktionierendes System. Ich werde mich morgen an dem Ausbau begeben und ein paar Widerstände reinbraten. Habe im Layout auch noch eine passende Stelle gefunden. Die Frage die sich bei mir zu dem Schirm stellt. Soll der Schirm auf Schaltungsground gelegt werden? Kann ich provisorisch erstmal Alufolie nehmen, damit ich es testen kann? Welche Leitung würdest du für die Displays benutzen? Wenn ich jetzt bestelle kommt es vielleicht noch rechtzeitig an und ich kann es dann einlöten. Ich dachte immer die internen 10k Ohm sind auch 10k Ohm groß +/- ein paar Prozent. Ich hatte nicht damit gerechnet, dass die eher im Bereich von 20 - 50k Ohm schwanken. Dann ist mir auch einiges klar, warum externe Widerstände besser sind.

Vielen Dank euch allen!

Ok...die internen Widerstände sind tatsächlich ca. 20 - 50 k und nicht genau spezifiziert.

Und ja du kannst es mit Alufolie versuchen, meine bisherigen Versuch waren damit allerdings eher negativ.
Wenn du noch irgendwo eine altes Netzwerkkabel rumliegen hast, nimm das und pul es auseinander.

Meist ist jede Ader einzel abgeschirmt und du nimmst 2 davon.
Den Schirm nur einseitig auf GND legen.

Hi

Sonst ginge auch ein Rest 'Telefon-Kabel' - solltest Du einen Elektriker in der Nähe haben und Der Dich in Seiner Kabelreste-Tonne buddeln lassen.
Aber auch so ist IY(ST)Y2x2x0,6 (Telefon-Kabel, 2 Pärchen a 2 Drähte mit 0,6mm Durchmesser - hier soll's echt der Durchmesser sein, hab's aber noch nie nachgemessen ... gibt's auch in 0,8) nicht sonderlich teuer.
2DA, 50m, eBay, <16€ - Ersttreffer.
Kürzere Längen gibt's auch für nen Euro - aber ggf. ist bei Dir ein ganzer Ring gar nicht so verkehrt.

MfG

Expressler:
Du siehst es richtig, dass ein kurzer Impuls nur nötig ist, um die Weiche umzulegen. Ich behaupte, dass ein Impuls von 500ms reichen würde. Aber mein Nano hängt sich genau an dieser Stelle auf und schaltet nicht ab. Dann brennt die Weiche durch.

OK, du kennst dann genau die Stelle im Programm wo der Nano crasht, dann schau die den Code dort nochmal an, vielleicht nur ein Tippfehler (z.B. = statt ==) vielleicht zeigst du uns den Code.

Wie wird denn der Nano versorgt? Ich habe da mal ein einbrechen der Spannung irgendwie in Verdacht, dass den Nano oder das LCD stört?

@Expressler
Prüfe doch einfach mal, ob die Freilaufdiode richtig an der entsprechenden Weiche (es müssen ja 2 sein) angeschlossen ist. Oder zeige uns mal, was für Steuertransistoren (Schaltbild) du da verwendest.
Sollte das mit den Anpassungen am I2C nicht ausreichen, muss da noch ein Fehler vorliegen.
Und wie auch geschrieben wurde, wie versorgst du das Ganze mit Spannung. Auch hier ist jetzt ein Schaltbild angesagt.