I2C Display bleibt "hängen"

Hallo zusammen,

für meinen Kettenöler habe ich ein I2C Display verbaut. Es hängt an einem Arduino Nano und wird mit U8GLib gesteuert.

Jetzt hab ichs mal im Motorrad eingebaut und ne Probefahrt gemacht. Jetzt ist mir aufgefallen, dass es irgendwann hängen bleibt (tendenziell nach starkem Beschleunigen). Irgendwann hat sichs dann mal wieder erholt und lief wieder.

Erste Vermutung: Wackelkontakt. Allerdings kann ich das Problem mit ausgeschaltenem Motor nicht herbeiführen (Schütteln, Wackeln, Klopfen, Kabel rumschieben). Wenn der Motor läuft, dann kann ich es im Stand teilweise herbeiführen, klappt aber auch nicht immer.

Kann es sein, dass es gar kein Problem mit dem Kabel ist, sondern durch Schwankungen der Versorgungsspannung zustande kommen kann? Momentan hängt der Controller direkt am Boardnetz ohne Filterung. Lässt sich I2C dadurch so aus dem Tritt bringen, dass es dann nicht mehr funktioniert? Weiß da jemand was?

Filter werde ich übrigens jetzt noch nachrüsten, ich wüsste aber gerne ob es das sein kann, oder ob ich sowieso nochmal richtig ran muss (Kabel tauschen bzw. Stecker löten oder sonst irgendwas in der Art).

Direkt am Boardnetz ist immer etwas heikel. Wie ist das I2C verbunden mit dem Rest?

Das Display hängt am 5V und GND vom Arduino und eben an den beiden Steuersignalen direkt dran (nix dazwischen).

Hallo,

das Bordnetz solltest Du schon noch etwas filtern.

Entweder hier mal lesen: http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.23

oder so ein USB Ladeadapter kaufen und damit dem Arduino am USB versorgen. Ich hoffe/denke das ein Motorrad auch 12V hat? http://www.conrad.de/ce/de/product/325830/USB-Ladegeraet-KFZ-Hama-00014118-Ausgangsstrom-max-2000-mA-2-x-USB oder ähnliche Teile, die haben sämtliche Elektronik innen drin.

Edit: Nochwas. Hast Du auf dem I2C Bus keine Pullup Widerstände? So ca. 4,7k. Oder sind die schon im Display drin?

Es ist dieses Display: http://www.ebay.de/itm/251733362934?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Es funktioniert bisher zumindest ohne Pullups, demnach denke ich, dass keine nötig sind. Per USB oder Netzteil angeschlossen wars auch absolut kein Problem und im Stillstand (bzw. Motor aus) gibts auch kein Problem. Erst beim Fahren.

USB Adapter wäre ne Möglichkeit, Filter hab ich aber vorhin bereits zusammengelötet und will das erstmal probieren (Drossel, Zener und 2 Kondensatoren).

Und ja, ein Motorrad hat 12V. Wenns mehr wären, dann würde ich den Arduino da nicht direkt anklemmen ;)

Das Display sollte 2x 4k7 oder 2x 10k Widerstände verbaut haben, somit ist dass hier nicht das Problem. Ich kann mir vorstellen, dass die Boardspannung den Arduino zwischenzeitig zum Reset führt. Der Filter sollte ausreichen.

Reset ist eher unwahrscheinlich, ich messe ja die Wegstrecke und die war plausibel, als das Display mal wieder was angezeigt hatte (Reset hätte ja zurückgesetzt).

Ich hab den Filter vorhin eingebaut, morgen kann ich dann testen. Ich hoffe es hilft und es ist kein Kabelwackler.

Die Stromversorgung eines Motorrades, oder Autos, ist unglaublich "dreckig". Im KFZ Bereich wird erheblicher Aufwand betrieben um das Problem zu mildern. Der originale Arduino Regler kann das nicht leisten. Er steht an des Todes Grenze.

Deine I2C Verbindung ist auch sehr lang, oder? Und geht direkt an den Zündspulen lang.... Eine Tolle Antenne! :sunglasses: Evtl. Abgeschirmte Leitung verwenden. Und mit den Pullups bis an die Grenze des erträglichen gehen. Also möglichst niederohmig.

Lang: Ja
Nah an den Zündspulen: Eher nicht, da ist noch die ganze Airbox dazwischen. Aber eine Potentielle Ursache ist es allemal, da hast du Recht.

Geschirmt ist das Kabel leider nicht (ich hab halt genommen, was da ist). Falls der Filter nicht hilft, muss ich ja eh nochmal ans Kabel ran und dann besorg ich gleich was abgeschirmtes.
Jedenfalls Danke für den Hinweis.

An den Pullups kann ich nix machen, die sind ja denke ich im Display schon drin (ich hab ja keine Pullups verbaut).

TelosNox: An den Pullups kann ich nix machen, die sind ja denke ich im Display schon drin (ich hab ja keine Pullups verbaut).

Du kannst bis zum Erreichen des maximalen Stroms mehrere Pullup-Widertände verwenden. Da der Nano keine hat, könntest Du auf seiner Seite welche ergänzen.

combie: Evtl. Abgeschirmte Leitung verwenden.

Möglichst paarweise verdrillt und einzeln abgeschirmt. Abschirmung an einer Seite an Masse anschließen.

Hoffentlich bringt es was!

An den Pullups kann ich nix machen, die sind ja denke ich im Display schon drin (ich hab ja keine Pullups verbaut).

Naja.... Ob das Display welche drin hat, kann ich nicht sagen. Da müsste man mal den Schaltplan befragen, oder testen... Normalerweise haben I2C Dinger keine eigenen Pullups. Denn man kann ja ca 100 I2C Dinger an eine Strippe hängen. Der gesamt Pullup wäre damit sehr klein, zu klein. Wenige Ohm.

Die TWI Arduino Lib aktiviert die internen Pullups des AVR. (soweit mir bekannt) Die sind natürlich mit ihren 10k bis 30K, für deine Anwendung, viel zu groß. Das tuts auf dem Küchentisch, bei 20cm ganz gut....

Ich würde mal schätzen, dass du insgesamt, auf ca 2,7K runter gehen kannst. Also, die Parallelschaltung von AVR interner Pullup, Display Pullup und eigener zusätzlicher Pullup, sollte deutlich unter 5K liegen.

Doch, doch, aus meiner bescheidenen Sicht, ist das zumindest prüfenswert.

Ein kleiner Elko direkt an den Versorgungspins des Displays mag auch noch etwas Stabilität bringen.

Also der Filter ist jetzt drin. Es kommt mir vor, als ob es jetzt ein wenig besser ist, aber das Problem besteht weiterhin.

Ich hatte überlegt, ob es vielleicht am Interrupt liegt. So greife ich ja die Radumdrehungen ab. Allerdings liegt die maximale Frequenz da unter 100hz und der Interrupt macht ja auch nix anderes, als nen Zähler hochzuzählen. Ich glaube nicht, dass das Stören sollte. Außerdem ist mir vorhin im Stand aufgefallen, dass einmal der Inhalt des Displays nicht korrekt dargestellt wurde (ne Zahl war angecuttet), das hat sich aber beim nächsten Refresh (ich mach das alle 500ms) wieder gerichtet.
Somit fällt der Interrupt weg.

Ein selbständiger Reset des Arduino ist auch auszuschließen, die internen Variablen laufen brav weiter, auch wenn das Display steht (Wegstreckenmessung).

Bleibt also nur noch ein Problem mit dem Kabel selbst (Wackelkontakt, aber das glaube ich weniger) oder Störeinflüsse duch Elektromagnetismus.

Ich kann ja jetzt einfach mal 4,7k Pullups probieren, die sollten relativ schnell reingelötet sein (wird nur arg fummelig, weil ich eigentlich gar keinen Platz mehr hab auf der Platine). Dann muss ich nicht das Kabel neu löten und neu verlegen (dazu muss einiges rumgeschraubt werden und das verklebte Gehäuse muss ich aufmachen - falls das überhaupt noch zu lösen ist).

Ich werds ausprobieren und dann berichten.

Hallo,

mit den I2C Bus Pullups sind ja derzeit alles nur Vermutungen. Normalerweise sind nirgends welche verbaut, man muß sich darum selbst kümmern. Ich habe aber auch ein fertiges RTC Modul wo welche verbaut wurden. Warum weis ich nicht. Wenn das jeder einfach so macht wäre das fatal für den Bus.

Du kannst aber ganz einfach prüfen ob am Display welche dran sind oder nicht. Display ausbauen. Nimmst ein Ohmmeter, (+) Meßleitung an den Display Ub Kontakt und je einmal mit (-) Meßleitung an einen I2C Bus Kontakt. Entweder ist beides hochohmig oder Du misst jeweils niedrige kOhm.

Wie sieht es denn mit einer zusätzlichen Softwarelösung aus?

Ich nutze ja U8GLib. Kann ich da einfach alle X sekunden mal ein begin() feuern, damit das Display im Fehlerfall automatisch resettet wird?

Gute Nachricht: Ich kann das Problem jetzt im Stand reproduzieren. Ich hab einfach nen blinkenden Punkt eingebaut und sehe so sofort, wenn es hängt. Fahren muss man nicht, es tritt einfach bei Motor an im Leerlauf auf.

Schlechte Nachricht: Pullups mit 4,7k haben nichts gebracht.

Gewonnene Erkenntnis: - Es hat nix mit dem Interrupt zu tun - Es hat auch nix mit VCC zu tun (hab Boardnetz abgeklemmt und über USB gespeist, trat dann auch auf)

Jetzt gibts erstmal Futter und dann hol ich das Kabel nochmal raus und verlege es frei fliegend über den Tank. Wenn es dann weg ist, dann müssten es ja elektromagnetische Störungen sein (Wackler am Anschluss durch Vibrationen fällt dann ja auch raus).

Dann muss entweder ein geschirmtes Kabel her oder oder ich pack den ganzen Controller nach vorne, so dass das Displaykabel gar nicht mehr am Motor vorbei muss.

Kabel raus und oben über den Tank hat im Stand erstmal funktioniert (das hat aber noch nix zu heißen). Beim Probefahren war dann aber ziemlich schnell wieder der Hänger da.

Entweder hab ich unter der Sitzbank, da wo der Controller verstaut ist noch irgendwas, das stark elektromagnetisch strahlt (die Abspumpe wäre direkt daneben aber die macht doch kein Mucks), oder es strahlt so stark, dass es sogar über dem Tank noch genug abbekommt.

Oder es ist gar keine Störung durch Strahlung, sondern ein Wackler. Die beiden Enden sind ja gesteckt, vielleicht liegt ja da das Problem.

Das Problem ist jetzt vorerstmal einem anderen Problem gewichen…
Der Arduino wurde soeben gegrillt.

Ich hatte festgestellt, dass er beim Kabelwackeln hier und da resettet. Ursächlich war irgendwie der Netzfilter.
Ohne nachzudenken hab ich halt mal Masse vom Netzfilter weggenommen und somit nur die Spule dringehabt… tja… die Zenerdiode hatte wohl bisher jedesmal beim Einschalten da was weggehauen und jetzt gings zum Arduino durch.

Ergebnis: Arduino gegrillt, BT-Dongel vermutlich auch gegrillt. Display: Bisher keine Ahnung muss sich noch zeigen.
Edith sagt, dass das Display auch hinüber ist. Damit erledigt sich das Thema hier auch vorerst.

Irgendwie hab ich mit dem Projekt nur Pech.

Hallo,

auch wenn es jetzt schmerzhaft ist, glaub mir, aus solchen Rückschlägen lernt man und geht gestärkt hervor.

Vielleicht kannste Dich ja beim nächsten Arduino dazu durchringen, Schraubklemmen einzulöten statt die Buchsenleiste. Oder baust eine steckbare Adapterplatine mit den Schraubklemmen.

Bsp. Conrad: Art.Nr. 567844, die sehen auf dem Bild größer aus als in Wirklichkeit.

So Anschlussklemmen hab ich ja dran für die ganzen "Einzelteile" (Pumpe, Temperatursensor, Tachosignal, Heizgriffe, VCC, Masse). Aber fürs Display wollte ich das nicht machen, da war mir ein Stecker lieber.

Ursprünglich wollte ich ja sowieso das DOGS nehmen (kann man bei Sonne deutlich besser ablesen). Die Entscheidung fiel ja nur deshalb auf das OLED, weils zum Nachbauen auch deutlich einfacher ist. Aber ich glaube sowieso nicht, dass mal irgendjemand meinen Heizöler nachbauen will. Dann darfs auch das kompliziertere Display sein. Ich kämpfe grad damit, den Spannungsteiler zusammenzulöten. Ich hab ja eigentlich gar keinen Platz und jetzt müssen da noch 10 Widerstände rein. Sowas nervt :-[ Aber als I2C gibts ja die kleineren DOG-Displays leider nicht und die größeren sind halt deutlich zu groß.