Probleme beim Auslesen eines MAX6675 Moduls bei Anschluss eines RS485 USB-Transceiver

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    zunächst einmal vielen Dank an alle aktiven Mitglieder, von denen ich als lesendes/passives Mitglied dieses Forums schon einiges lernen konnte.:thumbup:

    Nun habe ich ein Problem, bei dem ich nicht mehr so richtig weiter weiß und baue auf eure Hilfe.

    Problemstellung:

    Ich möchte gerne ein Thermoelement über einen Arduino Nano mittels eines MAX6675-Moduls auslesen und die Messwerte über RS485 mit dem Modbus RTU-Protokoll an den Raspberry übertragen und dort weiterverarbeiten. Dieser Raspberry läuft 24/7 im Keller und liest dort bisher vor allem 1-Wire Sensoren aus. Der Aufbau der Schaltung ist angehängt.

    Das Problem ist, dass die Temperaturwerte stark schwanken (+-10°C teils auch mehr), SOBALD der USB RS485 Transceiver mit Strom versorgt wird.

    Was bisher funktioniert:

    • reines Auslesen des Thermoelements mit dem Arduino Nano und Ausgabe auf der seriellen Schnittstelle --> relative Genauigkeit mit 3er-Medianfilter von +-1°C
    • Ich habe das mit dem Modbus noch nicht ganz durchstiegen. Jedoch habe ich es mit der lib minimalmodbus auf Raspberry-Seite (Python) und Modbus-Master-Slave-for-Arduinoauf Arduino Seite geschafft, die Daten, die ich im Register des Arduinos verändere auf den Raspberry zu übertragen. Kabellänge bisher 10cm. Funktioniert sowohl twisted als auch mit nicht verdrilltem Kabel.
    • Ein Testaufbau mit der im Bild beschriebenen Schaltung mit einem 2. Raspberry lieferte die genauen Temperaturwerte.

    Problem:

    • schließt man den Testaufbau im Keller an, misst der Arduino/das Thermoelementmodul Mist (die genannten hohen Abweichungen).

    vermutete Ursache:

    • der Thermosensor ist an einem ca. 1,5m 2,8m langen Kabel angeschlossen. Beim Testaufbau war es zusammengerollt und im Einsatz dann nicht mehr. Könnte es sein, dass es damit zu einer Antenne wird und sich allerlei Störungen einfängt? Wobei hier die Störung mit dem RS485 USB-Transceiver zusammen hängen muss, da es ohne auch bei ausgerolltem Kabel genaue Messwerte gibt.
    • legt man die leitende Umhüllung des Thermoelementkabels z.B. auf ein geerdetes Heizungsrohr verändert sich die Schwankungsbreite der gemessenen Werte. (Wird jeoch nicht besser)

    Versuche der Lösungsfindung:

    • Anschluss eines 10nF Kondensators (Cx im Schaltplan) zwischen T+ und T-
    • Austausch der Transceiver-Module (USB und TTL)
    • Längere Messzeiten
    • anderer USB Port an Raspi
    • Anderes USB-Stromversorgungskabel Arduino (wobei nur mit 5V Netzteil versorgt)
    • Unterschiedliche Netzteile
    • mit und ohne WLan Stick am Raspberry / Tausch des WLan Sticks

    Schwachstellen:

    • Arduino nur mit 5V versorgt. Der will eigentlich bisschen mehr soweit ich weiß.
    • Vermeintliche "Billigprodukte"
    • Immer noch unzureichendes Verständnis für Modbus Protokoll
    • Der USB Transceiver hat keinen 120 Ohm Abschlusswiderstand
    • Ich besitze kein Oszi und würde damit vermutlich in diesem Fall auch nicht wissen was damit zu tun wäre.
    • Ich drohe den Überblick zu verlieren ;)

    Fragen:

    1. Ist der Verdacht von Einkopplungen plausibel?
    2. Was könnte man gegen diese elektromagnetischen Störungen tun?
    3. Ist der Entstörkondensator Cx sinnvoll? (und mit 10nF sinnvoll bemessen). Adafruit empfiehlt das in manchen Fällen (Adafruit Kondensator).
    4. Ist es überhaupt clever diese günstigen RS485-Module zu verwendet. Es gibt wohl noch galvanisch entkoppelte und welche die einen GND mitführen.
    5. Würde es helfen, den fehlenden 120 Ohm Widerstand am USB-Modul anzuschließen? Die Kommunikation geht ja auch ohne aktuell. Hilft er also bei der evtl. erforderlichen Entstörung? Und würden fürs Erste auch 100 Ohm reichen wenn man kein 120R hat.
    6. Würde es helfen den Ground bei der Datenleitung mitzuführen.
    7. Würde es helfen, die vermeintliche Schirmung des Thermoelementkabels irgendwo an GND anzuschließen. Da wo der Sensor selbst angeschraubt ist, ist er eigentlich ja schon auf Erde.
    8. [Bisschen Offtopic] Wie kommt eigentlich die Spannungsdifferenz der Bezugsmassen zwischen 2 galvanisch getrennten Systemen zustande? Zum Beispiel hatte ich den Arduino am Laptop und den Raspi an einem Netzteil. Spannungsdifferenz von GND zu GND 1,8V. Wenn man das verbindet fließt ein Strom von ca. 1mA. Die Spannung baut sich sofort wieder auf nach dem man den "common GND" wieder trennt.
    9. [Bisschen Offtopic] Ist es legitim die Funktion slave.poll() beim Arduino Sketch öfters im loop() aufzurufen, um die eigentlich unerwünschten delays einzubringen? Oder sollte man komplett anders vorgehen?

    Hardware: (s. auch Bilder)

    • Raspberry Pi 2 Model B mit Stretch
    • Arduino Nano (billige Clon-Variante)
    • MAX6675, RS485 Transceiver (es gibt vermutlich bessere)

    Arduino (Slave):

    Raspberry (Master):

    Ich hoffe, dass ich die Fragestellung nicht zu unkonkret gestellt habe und bin über jede Anregung und ultimative Lösung dankbar. :danke_ATDE:

    Einmal editiert, zuletzt von blackberry (15. Dezember 2020 um 18:51)

  • Probleme beim Auslesen eines MAX6675 Moduls bei Anschluss eines RS485 USB-Transceiver? Schau mal ob du hier fündig wirst!

  • Da der Sensor digital ist, und dessen Kabel geschirmt (so sieht’s zumindest aus, kannst du ja mal durchmessen ob GND und shield Verbunden sind), kann ich mir einstreuen nicht vorstellen.

    Um solchen Problemen auf die Spur zu kommen bietet sich das gute alte Teile und herrsche an. Probier mal NUR deine Kommunikation zu testen. Zb indem du einfach immer den gleichen oder ggf einen fortschreitenden Wert eines Zählers kommunizierst. Wenn das sauber ist, liegt das Problem an der Messwerterfassung. Wenn nicht, dann ist die RS485 Strecke gestört. Was wohl vorkommen kann, und durch Terminierung behoben werden : https://www.janitza.de/kommunikation-…nittstelle.html

    Der Artikel erklärt auch Frage 8. Es ist IMHO eher unwahrscheinlich, das in deiner Installation das Common ground jenseits der Spezifikation liegt - aber du kannst natürlich GND von Pi & Arduino verbinden.

    Das der arduino mehr als 5V will wäre mir neu.

    Oh, und ein Nachtrag, weil hier im allgemeinen gerne geschimpft wird, und auch ich gelegentlich harsch bin in meiner Kommunikation: das ist ein sehr guter Post, mit detaillierten und umfangreichen Informationen, und im Rahmen der eigenen Kenntnisse guter Fragestellung. Sowas sieht man gerne!

    Und noch ein Nachtrag: damit RS485 seine Störunanfälligkeit ausspielen kann, braucht es verdrillte Kabel! Da kannst du zb ein Netzwerkkabel nehme, wobei natürlich (wie in meinem Artikel angeben) die richtigen Paare wichtig sind.

    Einmal editiert, zuletzt von MistyFlower59469 (14. Dezember 2020 um 21:29)

  • Hallo,

    zunächst einmal vielen Dank für deine Antwort. :)

    Zitat

    Um solchen Problemen auf die Spur zu kommen bietet sich das gute alte Teile und herrsche an. Probier mal NUR deine Kommunikation zu testen. Zb indem du einfach immer den gleichen oder ggf einen fortschreitenden Wert eines Zählers kommunizierst.

    Ja, das funktioniert. Ich übermittle aktuell den Messwert, den "LoopCounter" des Arduinos und einen festen Wert (die Zahl 99) und das kommt auch an. Ich hatte zu Beginn meine ich sogar mal einen Checksum-Error (falls das so heißt)...d. h. solche Fehler in der Datenübertragung scheint das Protokoll zum Teil sogar abzufangen.

    Ich bin ein wenig in der doofen Situation, dass ich mich ein wenig mit "trial and error" in Modbus bisher eingearbeitet habe. Sprich zunächst festen Wert erfolgreich vom Arduino übertragen [1]. Anschließend wollte ich variable Werte übertragen (also Sensor angeschlossen) [2]. Danach wollte ich mir die genaueren Sachen von Modbus anschauen [3], jedoch bin ich bei [2] schon hängengeblieben.

    ABER:

    Wie wir ja eben festgehalten haben, die Kommunikation scheint zu funktionieren. Daher vermute ich das Problem inzwischen noch deutlicher bei der Messwerterfassung/elektromagnetischen Störung und warum ausgerechnet dann, wenn der USB Transceiver mit Strom versorgt wird.

    Zitat

    Da der Sensor digital ist, und dessen Kabel geschirmt (so sieht’s zumindest aus, kannst du ja mal durchmessen ob GND und shield Verbunden sind), kann ich mir einstreuen nicht vorstellen.

    Ich bin mir nicht ganz sicher wie du das mit "digital" meinst. In der Edelstahlhülse sitzt ein Thermoelement, sprich der analoge Teil geht bis zu dem MAX6675. Das sind wie ich nochmal geprüft habe ca. 2,8m (Passe ich in #1 auch noch an). Das heißt, das Problem sitzt evtl. im letzten Eck. Danach geht es dann digital weiter. Die "Schirmung" ist zunächst nicht mit dem MAX6675 GND=Arduino GND verbunden. Waren ein paar mV die beim Messen schon eingebrochen sind. HIER stellt sich für mich die Frage, wie man da was miteinander am sinnvollsten verbindet. Der Sensor vorne liegt einbaubedingt auf Erde.

    Nachdem ich mich jetzt mehr auf das Thermoelement konzentriere, hier noch etwas zum lesen.

    Dieser Quelle nach sind lange Kabel zu vermeiden:

    Zitat

    Eine der wirksamsten Methoden, Messfehler durch elektromagnetische Störungen zu minimieren, besteht darin, die Sensorkabel so weit wie möglich zu kürzen, wodurch die Länge der „Antennen“ minimiert wird.

    Da ich noch Spielraum habe, werde ich werde vermutlich die Leitung einkürzen (sofern sich das Problem zuvor nicht in Luft auflöst).

    Was macht man jedoch, wenn eine Einkürzung nicht möglich ist?

    Aktuell führe ich ein paar Messungen mit unterschiedlichen Anschlussparametern durch. Kann ich (falls erfolgreich) dann mal teilen.

    Bin weiterhin über jeden Input erfreut!


    PS: Bezüglich Arduino dachte ich einst, dass wenn man zuverlässige 5V haben will, man den Vin mit 7-12V nehmen sollte #Spannungsregler. Jedoch scheint das mit dem 5V MicroUSB auch dauerbetriebgeeignet zu sein. Nehm ich also zurück. ;)

    Deinen Nachtrag nehme ich gerne mit. :danke_ATDE:

  • Ah, ich habe deinen Sensor falsch verstanden. Es gibt ja welche, bei denen der Sensor selbst + der Schaltkreis zur digitalen Kommunikation direkt verbunden sind. Zb beim populären BME280. Und digitale Kommunikation hat den Vorteil, dass sie robuster gegen Einstrahlung ist, und auch abgesichert werden kann (Prüfsummen oder bei I2C einfach Abbruch der Kommunikation, weil das Protokoll gestört wird). Und etwas ähnliches wird in deinem Link ja auch beschrieben. Die benutzen einen variablen Strom als Protokoll, aber das ist auch robuster.

    Aber wenn der MAX natürlich erst am Ende des Kabels hängt, dann ist das was anderes. Und der Link beschreibt ja, dass die sehr empfindlich sind.

    Laut Datenblatt des MAX sollte die Schirmung ebenso wie T- mit GND verbunden werden können. Meinen beschränkten Elektronik Kenntnissen nach sollte das etwas bringen. Wenn nicht, oder nicht genug, dann ist der vorgeschlagene Weg gangbar: Kabel zi kurz wie möglich, MAX dran, daran den Arduino. ACHTUNG: I2C ist NICHT für lange Leitungen gedacht! Wenn du also den arduino da nicht nah genug ran bringst, dann muss man I2C Bustreiber benutzen. Und mit denen würde ich gleich an den PI, da ist der RS485 dann überflüssig. Es sei denn der arduino soll noch mehrere Sachen machen.

  • Zitat

    ...RS485 dann überflüssig. Es sei denn der arduino soll noch mehrere Sachen machen.

    Ja das ist der Hintergedanke. ;)


    So die Messungen sind abgeschlossen und liefern zum Glück ein eindeutiges Ergebnis (s. Anhang). @__deets__ @all

    Fazit:

    Auch wenn die besagten Thermoelemente mit einem Kabel mit nur 2 Litzen geliefert werden. Unbedingt die Schirmung mit dem GND des Auswertemoduls verbinden!!!

    Es sei denn man möchte mehrere Tage mit einem Rätsel verbrringen, weshalb die Schaltung mal funktioniert und mal nicht. Und in meinem Fall verursacht die RS485-Kommunikation wohl so einiges an Störungen elektromagnetischer Art?!

    Zugegeben dachte ich anfangs, dass die Umhüllung vor allem dem thermischen Schutz dient. Sie ist in jedem Fall auch eine geeignete Schirmung. Es ist in meiner bisherigen Bastlerkarriere das erste Mal, dass ich so starke Probleme mit dem Thema EMV habe/hatte (Experten können vermutlich über meine Blauäugigkeit schmunzeln, wenn sie diesen Thread lesen). :wallbash:;)

    So damit ergibt sich für mich ein neuer "Fragestand":

    Zitat
    1. Ist der Verdacht von Einkopplungen plausibel?  Ja
    2. Was könnte man gegen diese elektromagnetischen Störungen tun?  s. Frage 7
    3. Ist der Entstörkondensator Cx sinnvoll? (und mit 10nF sinnvoll bemessen). Adafruit empfiehlt das in manchen Fällen (Adafruit Kondensator). nicht wirklich
    4. Ist es überhaupt clever diese günstigen RS485-Module zu verwendet. Es gibt wohl noch galvanisch entkoppelte und welche die einen GND mitführen.
    5. Würde es helfen, den fehlenden 120 Ohm Widerstand am USB-Modul anzuschließen? Die Kommunikation geht ja auch ohne aktuell. Hilft er also bei der evtl. erforderlichen Entstörung? Und würden fürs Erste auch 100 Ohm reichen wenn man kein 120R hat. wird vermutlich bei längeren Leitungen relevant
    6. Würde es helfen den Ground bei der Datenleitung mitzuführen. s. Link von _deets_
    7. Würde es helfen, die vermeintliche Schirmung des Thermoelementkabels irgendwo an GND anzuschließen. Da wo der Sensor selbst angeschraubt ist, ist er eigentlich ja schon auf Erde. zum :evil: ja
    8. [Bisschen Offtopic] Wie kommt eigentlich die Spannungsdifferenz der Bezugsmassen zwischen 2 galvanisch getrennten Systemen zustande? Zum Beispiel hatte ich den Arduino am Laptop und den Raspi an einem Netzteil. Spannungsdifferenz von GND zu GND 1,8V. Wenn man das verbindet fließt ein Strom von ca. 1mA. Die Spannung baut sich sofort wieder auf nach dem man den "common GND" wieder trennt.
    9. [Bisschen Offtopic] Ist es legitim die Funktion slave.poll() beim Arduino Sketch öfters im loop() aufzurufen, um die eigentlich unerwünschten delays einzubringen? Oder sollte man komplett anders vorgehen?

    Bezüglich 4.:

    Hat jmd. diese günstigen Module schon längerfristig erfolgreich im Einsatz? Taugen die was?

    Bezüglich 8.:

    Da würde mich noch etwas genauer interessieren. Um bei dem genannten Beispiel zu bleiben: Warum baut sich die Spannung nach dem Entfernen der gemeinsamen Bezugsmasse sofort wieder auf? Liegt das am Lüfter, der über ionisierte Teilchen der Luft eine Ladung überträgt, oder ist das einfach in der Beschaltung begründet?

    Bezüglich 9.:

    Kann sich jmd. den Arduino Code mal ansehen? Vermutlich wäre es cleverer, wenn man vom Raspi aus ein Wert (Flag) eines Registers auf 1 bzw. True setzt, diesen Wert im Arduino ausliest und nur im Falle von True den Sensor ausliest. Dementsprechend wartet der Raspi noch eine Sekunde und fragt dann das Register mit den aktualisierten Daten ab. Ist das sinnvoll oder gibt es noch bessere Lösungen (z. B. mit irgendwelche Interrupts, die ich bisher immer nur copypasted habe und mir nach 2 Wochen nicht mehr klar war wie die funktionieren?

    Vielen Dank!

  • So jetzt ist einige Zeit vergangen. Abschließend noch ein paar Dinge der Vollständigkeit halber.


    Bezüglich 9.:

    Bis heute funktioniert das Einlesen der Temperatur des Thermoelements und die Kommunikation über RS485/Modbus sehr zuverlässig.

    Meine aktuellen (& aus meiner Sicht verbesserten) Skripte dazu:

    Arduino (Slave):

    Raspberry (Master):

    [Hinweis: Falls Kompilierungsfehler auftreten, dann deshalb, weil ich vor dem Upload noch unnötiges und persönliches entfernt habe.]

    Die Funktionsweise in kurz:

    Der Arduino schaut ständig mit slave.poll() ob er vom Master angesprochen wird. Wichtig hierbei ist, dass dieser Aufruf nicht blockiert wird (#blinkWithoutDelay...) (Im alten Skript hat das mit delay() zwar funktioniert, das war aber sehr unsauber). Wenn gemessen werden soll, setzt der Master das measureEnableFlag-Register auf TRUE. Die gemessene Temperatur wird daraufhin vom Arduino in das Temperaturregister geschrieben und die Flag zurückgesetzt. Das Temperaturregister liest der Master nach einer kurzen Wartezeit aus und geht dann zur Datenverarbeitung über.

    Um die Datenbank nicht sofort vollzumüllen, werden die gemessenen Werte abhängig von der absoluten Änderung bzgl. des zuletzt gespeicherten Werts in variablen Zeitintervallen abgespeichert.


    Bezüglich 4.:

    Ich habe aktuell noch Probleme mit der zuverlässigen Anbindung eines 2. Slaves, der 10m entfernt ist. Falls ich es nicht bald hinbekomme, wird es dazu evtl. ein neues Thema geben. :helpnew:


    Bezüglich 8.:

    Antworten sind immer noch willkommen.


    Ansonsten würde ich dieses Thema nun als erledigt markieren, mich bedanken und hoffen, dass es in Zukunft dem ein oder anderen noch ein wenig weiterhilft. :)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!