Vielen Dank für den Tipp! Ich habe mal im Netz rumgeschaut und Homematic RS485 soll tatsächlich auf 19200 laufen. Hätte dann allerdings auf ein paar “Schmierzeichen” im 9600 “Modus” gehofft. Außerdem hätte dann
hexdump -C < /dev/ttyS0
zum Erfolg führen müssen.
Aber vielliecht habe ich mit 19200 ja Erfolg.
So,
nachdem ich den RPi3 mit Modul auf 19200 getestet hatte (kein Erfolg), habe ich ein Multimeter bemüht.
Siehe da, ich glaube das Problem gefunden zu haben.
Während ich mit dem RPi am HM Bus auf A und B jeweils um die 1,2V - 1,3V habe und sich dies beim Schalten im 50mV Bereich nur verändert, habe ich bei der CCU auf A 5V und auf B 0,4V (eigenartigerweise).
Es handelt sich um um einen Arduino Uno an dem auf der seriellen Schnittstelle ein Bluetoothadapter horcht. Zusätzlich ist mit einer softwarebasierenden seriellen Schnittstelle ein RS485 Modul angeschlossen. Das Bluetoothmodul operiert mit 9600 Baud und die RS485 mit 19200 Baud. Alles was das RS485 Modul empfängt, wird an das Bluetoothmodul weitergeleitet.
Der Unterschied zum RPi; wir arbeiten jetzt mit 5V.
Der Test war erfolgreich! Über mein Handy (bluetooth terminal) sehe ich nun den gewünschten HEX output, wenn ich schalte.
Super! Der Pi hat ja zum Glück auch 5V. Die Frage bleibt dann nur, ob du die Datenleitungen des Max485 bei 5V-Betrieb direkt auf die Pins des Pi’ klemmen darfst. Zur not nen Level-Shifter dazwischen.
Ich muss aber sagen, dass ich irritiert bin. Wir haben an nem ATMega 328p (wie im Uno) schon Modbus (RS485) mit 3,3V bei 8MHz gemacht.
Ist dein Arduino Pro Mini, unten rechts, nicht ein 3,3V? Dann könntest du es mal gegentesten.
Genau das ist meine Befürchtung, daß ich mit Level-Shifter arbeiten muss. Ich werde es auf jeden Fall testen.
Nein, der Arduino Pro Mini ist leider ein 5V Version (ein Fehlkauf, wollte eigentlich die 3,3V Version haben).
Waren denn alle Teilnehmer auf 3,3V ? Ich denke mittlerweile, daß ich nicht einfach beliebige Teilnehmer mit verschiedenen Spannungen an einen Bus hängen kann und daher mich nach der Spannung der CCU, beziehungsweise der wired-Komponnenten richten muss.
Den Atmega kanst du auch auf 3,3V laufen lassen. Einfach Spannungswandler austauschen, Quartz durch ein 8MHz ersetzen. Eventuell würde es auch ohne Quarz gehen, dann musst du aber die Fuses im Mikrocontroller per ISP umsetzen. Und mit intern getaktetem 8MHz läuft er nicht so gut bei timingintensiven Anwednungen.
Wir haben wie gesagt Modbus mit eine 400V Stromzähler. Der hat also “plump” RS485/Modbus raus geschmissen. Von da auf den 485 und von da an den 3,3V 328p direkt. Ohne Levelshifter, etc.
Ich schau mal nach, ob wir den MAX auf 5V oder 3,3V hatten.
Die Pull-Up’s/Pull-Down’s hat deine Platine da (siehe Schaltplan oben) schon mit drin.
//edit:
Wobei die Pull-Up’s auf RO/DI an deinem 485-Board ein Problem sein könnten, wenn Sie die Datenleitungen zum Pi auf 5V ziehen. Sie hängen ja auf der Platine an VCC, was ja durch den Anschluss “rechts” 5V wären…
jeweils 1,2 bis 1,3V mit <50mV Spannungsdifferenz klingt nach Bus Idle. Bist Du sicher, dass Du mit dem Multimeter ein kurzes Zucken bei einem Frame überhaupt detektieren kannst? Oder hast Du die Funktion des MAX485 mit der GPIO-Funktion des TxD-Pins oder fliegend mit Breadbord-Kabeln überprüft? Ist die Versorgungsspannung korrekt? Hast Du RxD und TxD richtig herum angeschlossen? Wird DE/RE# während des Sendens auf HIGH und während des Empfangs auf LOW gezogen? Hängt DE/RE# am richtigen GPIO-Pin des RPi und ist dieser auch als GPIO konfiguriert und in der Homegear-Konfigurationsdatei korrekt eingetragen? Funktioniert es ohne den(?!) 120Ohm-Terminator?
An A und B liegen irgendetwas zwischen 0V und VCC an. Differenzielles Signal. Unbelastet fast bis an die Rails. Belastet weniger. Erkennungsschwelle +/-200mV Differenz. Idle <50mV Differenz. Die Specs von -7/+12V kannst Du nur bei unterschliedlichen Massepotentialen oder Blitzschlag o.ä. verletzen. TSV-Schutzdiode ist aber trotzdem nie verkehrt.
Einen Levelshifter kann man sich zwischen 3.3V und 5V oft sparen, muss dann aber einen Schutzwiderstand von 1k bis 10k (besser 10k) in Serie verwenden. Der 3.3V-HIGH-Pegel wird am 5V-Device praktisch immer zuverlässig als HIGH erkannt und die 5V-HIGH-Spannung am Eingang des 3.3V-Devices wird durch den Schutzwiderstand und die interne ESD-Schutzdiode auf einen ungefährlichen Wert begrenzt. Ist aber außerhalb der Specs und ohne Garantie oder Haftungsansprüche. Funktioniert bei sehr hohen Bit/Baudraten >1MBd/1MHz nicht mehr zuverlässig, bei 9600 oder 19200Bd aber kein Problem.
Jeweils ein 120 Ohm-Terminator an beiden Enden des Busses, eine Bustopologie mit kurzen Stichleitungen und eine impedanzangepasste Leitung mit 120 Ohm Wellenwiderstand sind bei einem langen Bus mit großen Baudraten nötig, bei einer typsichen Hausinstallation spielt das aber keine Rolle.
UART (und RS485 nutzt bei allen verbreiteten Protokollen HM Wired etc. ebenfalls UART-Frames) toleriert nur etwa 3% Frequenzabweichung, funktioniert daher nur mit Quarz (100ppm Frequenzgenauigkeit) zuverlässig und nicht mit nichtkalibriertem internem RC-Oszillator (10% Genauigkeit).
Der 100nF-Kondensator parallel zum MAX485 nahe an dem VCC- und GND-Pin ist wichtig!
Der MAX232 arbeitet technisch deutlich anders als der MAX485: er hat keinen DE/RE#-Pin, arbeitet mit single-ended-Leitungen und hat einen eingebauten Spannungswandler auf +/-10V. Aber logisch sind beides Wandler zwischen 5V-Logikpegel und dem jeweiligen PHY.
Trick 17: Eine LED (mit Vorwiderstand!) an DE/RE#, eine an TxD und eine an RxD (jeweils gegen VCC) und ich sehe sofort ohne Multimeter oder Logic-Analyzer, ob der Raspi sendet, empfangsbereit ist und eine Antwort ankommt oder ob auf dem PHY irgendetwas nicht stimmt (Pinkonfiguration o.dgl.).
Trick 18: DE und RE# auf separaten GPIO-Pins, RE# ständig auf LOW und ich sehe, ob das, was ich sende, auch auf dem Bus ankommt oder ob es einem Kurzschluss oder einer Kollision zum Opfer gefallen ist.
Holla die Waldfee!!!
Das muss ich jetzt erstmal alles verarbeiten Nein, ich bin mir nicht sicher, ob ich mit dem Multimeter die Spannungsdifferenz genaustens detektieren kann. Ich habe wie oben beschrieben, nur den Unterschied zwischen den beiden Konstellationen aufgezeigt.
Ich muss gestehen, daß ich nicht ganz genau verstehe was Du damit meinst.
RxD und TxD sind korrekt, das Modul arbeitet am RPi momentan mit 3,3V Versogungsspannung.
K.A. Wie kann ich das überprüfen? Ich dachte die homegear “Intelligenz” erledigt das für mich
DE/RE# hängen an zwei freien GPIO Pins und sind auch in der homegear config hinterlegt.
Ich habe mich bei der RPi + RS485 Modul an HM485 Bus an die “Anleitung” von homegear gehalten. Auf dem Bild (etwas weiter unten) ist der Terminator zu sehen (120Ohm). Dieser scheint fest eingebunden zu sein. Das Modul funktioniert ja aber mit dem Arduino, daher glaube ich nicht das er eine Rolle bei der Fehlersuche spielt.
Das A und B irgendwo zwischen 0V und VCC liegen, ist mir bewußt. Allerdings müsste man mal gucken was VCC an den wired-Komponenten ist, da die Komponenten selber mit 24V betrieben werden, dies aber außerhalb der Spezifikation des RS485 Busses liegt. Da ich mit dem Multimeter (siehe einen Post weiter oben von mir) 5V am Bus gemessen habe, gehe ich von 5V Versorgungsspannung aus.
Die Levelshifter würde ich trotzdem bevorzugen, da es sich ja um einen Dauereinsatz handeln soll und nicht um eine Testinstallation. Ich möchte mir ungern die 3,3V Pins mit 5V Signalen “zerschießen”.
Da der HM485 Bus eh nur mit 19200 (was für die Datenmenge auch völlig ausreichend ist) abeitet, interessieren mich höhere Baudraten nicht.
Das Ende meines HM Busses hat einen Terminator von HM auf Hutschiene. Das Modul hat einen fest eingebaut und der Testbau mit dem Arduino gibt ja Werte zurück. Hier sind aber auch DE/RE# beide auf HIGH gezogen. Bei der RPi Lösung bin ich noch gar nicht auf die Idee gekommen nachzugucken (werde ich auf jeden Fall nachholen!).
Im Hinblick auf den Arduino kann ich das verstehen, der benutzt den externen Quarz, aber wie sieht das beim RPi aus?
So sieht mein Modul aus (pmayer hatte das gleiche Bild schon einmal hier gepostet:
Danke für die Info!
Die Tricks hören sich super an! Ich werde sie auf jeden Fall ausprobieren!
Vielen Dank für Deine ausführliche Erklärung, spitze!
Wie malli schon sagt, ist RS485 ein zweidraht Bus, der durch den Unterschied von 200mV funktioniert. Es können also 50V, 24V oder was auch immer auf dem Bus sein. Hauptsache es sind 200mV Unterschied zwischen A und B. Siehe https://de.wikipedia.org/wiki/EIA-485#Technik
Eine wichtige Frage hat er aber aufgeworfen: Ist TX-Enable verdrahtet?
Dadurch entscheiden der Microcontroller (Arduino, Pi) ob er senden möchte oder nicht. Wenn die GPIOs vom Pi richtig verkabelt sind, sollte das ja schon mal funktionieren.
Der MAX485 kommt mit dem 3,3V Pegel des Pi klar - siehe Datenblatt. Bei deinem Adapter (siehe Schaltplan) ist aber - wie schon erwähnt - das Problem, dass die Datenleitungen (TTL) zum MCU/Pi mit 5V auch high gepulled werden. RE/DE genauso.
Schau dir mal Seite 7 im Datenblatt des Max an: http://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf
RE/DE müssten beide High bekommen, wenn der MCU senden will, Low zum Empfangen. Beachte auch, dass RE negiert ist (der Strich über RE).
Meiner Meinung nach sollte es funktionieren - völlig ohne Level-Shifter - wenn du die Pull-Ups (R1-R4) mit 3,3V versorgst und Pin 8 des Max auf 5V belässt. Siehe mein Schaltplan oben.
Ich habe leider keine Wired Geräte hier, sonst würde ich mal nen Testaufbau machen. Das RS485 Modul hab ich in der Grabbelkiste und auch noch ein paar einzelne MAX485.
## GPIO to enable RX (RE)
gpio1 = 18
## Set GPIO to this value to enable RX
enableRXValue = 0
## GPIO to enable TX (DE)
gpio2 = 17
## Set GPIO to this value to enable TX
enableTXValue = 1
Vielleicht habe ich mich da unglücklich ausgedrückt. Es könnten diese Spannungen vorhanden sein. High von Low kann durch den Pegelunterscheid von 0,2V erkannt werden, egal ob 24,2V/24V oder 5,2V/5V.
Eventuell kann @malli das mal richtig erklären, nicht dass ich hier mit zu viel Halbwissen glänze
Genau das regelst du in der Config. Als Beispiel hast du ja enableTXValue und enableRXValue genau entgegen gesetzt.
In meinem Beispiel haben wir ja RE und DE an den gleichen Pin gehangen, da RE ja negiert. Evtl. musst du enableTXValue noch auf 0 setzen. Das kann ich dir durch fehlendes “hands on” nicht sagen.
Meines Verständnisses nach, genau das
Die Pin’s die von R1-R4 gefüttert werden sind ja, wenn du nicht Low anlegt immer high. Das ist ja egal ob mit 3,3V oder 5V.
Nur der Eingang deines Pi’s mag die 5V nicht… deswegen Pull-Up mit 3,3V auf Eingangsseite des Max.
So, ich habe gestern das RS485 zumindest so weit ans Laufen gebracht, daß er mir mit
screen /dev/ttyS0 19200
od -x < /dev/ttyS0
Daten ausgibt.
Eigenartigerweise läuft jetzt das Modul auch komplett mit 3,3V. Allerdings findet homegear keine wired-Komponenten
Ich habe das log-level auf 5 gesetzt und es hagelt auch fleißig Meldungen; ich werde nur nicht schlau draus.
Auszug aus der homegear.err
11/17/16 22:14:48.195 Module HomeMatic Wired: Error: HomeMatic Wired Central: Could not pair device with address 0x00005AEB. Could not read master config from EEPROM.
Warning: Connection to client number 24 closed (3).
Warning: Connection to client number 25 closed (3).
Warning: Connection to client number 26 closed (3).
Removing server "Homegear". Server has to send "init" again.
11/17/16 22:17:33.382 Module HomeMatic Wired: Error: HomeMatic Wired Central: Could not pair device with address 0x00005A2D. Could not read master config from EEPROM.
Warning: Connection to client number 53 closed (3).
Warning: Connection to client number 54 closed (3).
Warning: Connection to client number 55 closed (3).
Removing server "Homegear". Server has to send "init" again.
11/17/16 22:17:36.256 Module HomeMatic Wired: Error: HomeMatic Wired Central: Could not pair device with address 0x00005A2D. Could not read master config from EEPROM.
11/17/16 22:17:40.775 Module HomeMatic Wired: Error: HomeMatic Wired Central: Could not pair device with address 0x00005A2D. Could not read master config from EEPROM.
11/17/16 22:17:55.622 Module HomeMatic Wired: Error: HomeMatic Wired Central: Could not pair device with address 0x00005A2D. Could not read master config from EEPROM.
11/18/16 06:25:09.921 Info: Backing up database...
Vielen Dank, daß Du das noch auf dem Schirm hast
Ich versuche es mal:
Hier ein Auszug vom Startup:
12/07/16 13:53:57.367 /etc/homegear/families/homematicwired.conf
12/07/16 13:53:57.367 Debug: Loading section "RS485 - Serial Module"
12/07/16 13:53:57.367 Debug: id set to HM-RS485
12/07/16 13:53:57.367 Debug: deviceType set to rs485
12/07/16 13:53:57.367 Debug: device set to /dev/ttyS0
12/07/16 13:53:57.367 Debug: responseDelay set to 13
12/07/16 13:53:57.367 Debug: oneWay set to 0
12/07/16 13:53:57.367 Debug: GPIO1 set to 17
12/07/16 13:53:57.367 Debug: enableRXValue set to 0
12/07/16 13:53:57.367 Debug: GPIO2 set to 18
12/07/16 13:53:57.367 Debug: enableTXValue set to 1
12/07/16 13:53:57.368 Module HomeMatic Wired: Debug: Loading module...
12/07/16 13:53:57.368 Module HomeMatic Wired: Debug: Creating physical device. Type defined in homematicwired.conf is: rs485`
12/07/16 13:53:57.455 Info: Setting up physical interfaces and GPIOs...
12/07/16 13:53:57.456 Debug: Setting up physical device.
12/07/16 13:53:57.456 Debug: GPIO path for GPIO with index 1 and device rs485 set to "/sys/class/gpio/gpio17".
12/07/16 13:53:57.456 Debug: Unexporting GPIO with index 1 and number 17 for device "rs485".
12/07/16 13:53:57.457 Debug: Exporting GPIO with index 1 and number 17 for device "rs485".
12/07/16 13:53:57.458 Debug: GPIO path for GPIO with index 1 and device rs485 set to "/sys/class/gpio/gpio17".
12/07/16 13:53:57.459 Debug: GPIO path for GPIO with index 2 and device rs485 set to "/sys/class/gpio/gpio18".
12/07/16 13:53:57.460 Debug: Unexporting GPIO with index 2 and number 18 for device "rs485".
12/07/16 13:53:57.460 Debug: Exporting GPIO with index 2 and number 18 for device "rs485".
12/07/16 13:53:57.461 Debug: GPIO path for GPIO with index 2 and device rs485 set to "/sys/class/gpio/gpio18".
12/07/16 13:53:57.462 Debug: Setting up physical device.
12/07/16 13:53:57.462 Debug: Setting up physical device.
hmm, da kommt nichts an Paketen in Homegear an. Das Paket vom Schalten sollte auch in Homegear angezeigt werden. Ist dies der Fall? Da das Paket in screen angezeigt wird, ist eine Möglichkeit, warum wir keine Pakete in Homegear empfangen, dass ein zweites Programm auf das serielle Gerät zugreift. Ist das möglich?