RS485/Modbus mit ESP8266 zum Auslesen eines Modbus-Zählers

Seit einigen Jahren lese ich den Zähler meiner Wallbox per Modbus aus. Anfangs mit einem Pi Zero W über ein MAX485-Modul, danach mit einem D1 Mini auch über MAX485-Modul. Nun wollte ich das etwas professioneller machen mit eigener Platine und dort auch direkt richtigerweise den MAX3485 benutzen.

Schaltplan:

Nach kleiner Fehlersuche lief jetzt die Platine auch soweit. Ich hatte im Siebdruck die Beschriftung für R1 und C1 vertauscht und nach Siebdruck bestückt (weil grade das HTML-BOM-Tool auf dem Mac nicht funktioniert hat). Der ESP bootete natürlich nicht.

Nun läuft die Schaltung, aber zwei Dinge irritieren mich. Einerseits ist es jetzt ein paarmal vorgekommen, daß plötzlich kein Datentransfer mehr stattfindet (LEDs blinken nicht mehr, ESP bootet auch dann nicht mehr korrekt, sondern bleibt stehen) und der MAX3485 heiß wird. Wenn der MAX abgekühlt ist, läuft es wieder.

ESP-Console wenn dies der Fall ist:

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4 
tail 4
chksum 0xc9
csum 0xc9
v00046ce0
~ld

Hat jemand dazu eine Erklärung? Passiert ist das allerdings auch wenn ich an den Datenleitungen dran war (Modbus zum Zähler anschließen im Betrieb) bzw. als ich den Modbus-Ground nicht angeschlossen hatte.

Gerade läufts seit 20 minuten oder so fehlerfrei (mit A, B und GND zum Zähler).

Zweite Frage: Ich schaue mir A und B am Oszi an. Sind auch invertiert. Aber nach oben verschoben. Sollte nicht A grundsätzlich nur positiv sein und B grundsätzlich das invertierte A negativ?


Gelb = A
Cyan = B
Magenta = DE_RE

Wie wir sehen ist aber A zwischen 800 mV und +2,5 V sowie B zwischen 0 V und -1 V beim Senden (DE_RE high). Beim Empfang (DE_RE low) liegt A zwischen +1 V und knapp +4 V sowie B zwischen +2,5 V und -0,4 V.

Daten kommen korrekt am ESP an.

Hätte ich vllt. die Schaltung vom @theBrutzler reviewen lassen sollen? :grinning:


Ich kenne Modbus nicht, aber ich hab schon mal mit CAN Bus gearbeitet.
Alles was ich über den Modbus weiß habe ich aus diesem Dokument: https://modbus.org/docs/Modbus_over_serial_line_V1.pdf

Was mir auf die Schnelle auffällt ist, dass MODBUS_A Signal an 3,3V hängt. Laut Spezifikation soll die an 5V.

Nach ein wenig mehr Recherche sehe ich auch, daß die Spezifikation für die beiden BIAS Widerstände jeweils 450-650 Ω vorschreibt. Verstehe ich nicht, warum die fertigen MAX485-Module für den Arduino da mit 20k arbeiten. Aber egal. Ich werde es da mit 560 Ω versuchen.
Weiter sollte man beachten, daß die Spezifikation die Leitungen andersherum bezeichnet als die meisten Treiberhersteller das in ihren Datenblättern tun.

Spezifikation: D1=B mit Pull Up, D0=A mit Pull Down
Herstellerangaben sind zumeist A mit Pull Up und B mit Pull Down

Auch werde ich den Pull Up mal auf 5V legen.

Widerstände ausgetauscht und den A-Pull Up aufrecht gestellt und nach 5V gelegt. Ändert aber nix an der höhe den Pegeln wenn die Leitungen aktiv sind. Die werden beim Senden vom MAX3485 immer zwischen ca. 800 mV (low) und 2,5 V (high) betrieben. Passt auch zu den Angaben im Datenblatt. Meine gestrige Messung war einfach falsch, da einer der beiden Kanäle AC gekoppelt war. :roll_eyes:

Allerdings tritt mein Problem nach wie vor auf. Wenn ich den angeschlossenen Modbus-Zähler vom Netz trenne, dann crasht der ESP in der Regel mit einer Exception und lässt sich auch mit dem Reset nicht mehr booten. Nur Spannung trennen hilft. Wenn der ESP hängt, dann habe ich auf allen IOs zum MAX3485, also auf IO 4, 5 und 16 ca. 1,6-1,7 V. Keine Ahnung, woher das kommt. Gäbe es noch sinnvolle Verbesserungen an der Schaltung? ESP und MAX485 mit Optokopplern trennen? RS485 galvanisch trennen?

Funktionieren tut die Schaltung ja einwandfrei. Ich habe nur kein gutes Gefühl wegen des ESP-Crash.

Hi kenbinobi.
WIrd nur der MAX heiß oder auch der Spannungsregler?
Es könnte dein, dass die Pull-Ups und Downs zu schwach sind. Änder die mal an GPIO 0 2 und 15 auf 1K Ohm. Ist deine Spannungsversorgung stabiel?
Ich hätte eine kleine Verständnissfrage. Was machen die beiden Transistoren an den LED’s?
Grüße theBrutzler

Moin. Glaube, der Regler wird nicht heiß. Habs jetzt länger nicht mehr ausprobiert, sondern stattdessen heute einfach mal die Platine in die Verteilung eingebaut. Bisher läufts auch stabil so. Spannungsversorgung beim Testen war ein altes USB-Steckernetzteil, was rumlag (5.5V, 700mA). Im Produktivbetrieb hängt das an einem 5V Hutschienen-Netzteil von Meanwell.
Die Widerstände ändere ich mal bei der nächsten Boardversion.
Die FETs sollen nur dafür sorgen, daß die LEDs schön blinken wenn Daten über den BUS flitzen. Grundsätzlich war die gleiche Schaltung schon mit dem Pi Zero vor Jahren in Betrieb und auf Lochraster mit einem D1 Mini auch seit einem Jahr ca. Nun wollte ich das auf eine schöne eigene Platine bringen.
Sollte ich dem Regler noch einen weiteren C spendieren davor oder dahinter?
Wie schauts in Richtung RS485 aus? Sollte ich da noch was machen z. B. bzgl. Überspannungsschutz? Die Leitung zwischen Zähler und Platine sind zwar nur ein paar 10 cm, aber schaden könnte es ja nicht. Was würde ich da nehmen?

Danke, daß Du draufschaust. :+1:

Okay. So Transistoren an zu klemmen um LEDs zum blinken zu bringen hab ich auch noch nicht gesehen. :stuck_out_tongue_winking_eye:
Denke wenn die Schaltung jetzt stabiler läuft war es bestimmt das Netzteil.
Grüßle

Die Schaltung mit den FETs war aus der ursprünglichen Schaltung mit dem Raspberry Pi. Aber ist ja nur ein Inverter. Die LED soll ja bei ner 1 auf dem Bus leuchten und nicht bei einer 0.