Verständnissfrage

Hallo zusammen,

Eine kurze Verständnissfrage.

Ich plane mehrere Arduinos via RS485 zu steuern.
Dabei wird jeder RS485 an PIN 0 und 1 angeschlossen zwecks der Komunikation.

Frage 1:
Meine simpele Frage lautet, wenn ich am Anfang dieses Busses ein USB <-> RS485 converter hänge,
kann ich somit theoretisch über den RS485 Bus jeden einzelnen Arduino auch programieren mit der IDE ?

Schematik :

USB->RS485----------- RS485+Arduino-----------RS485+Arduino----------RS485+Arduino----…

Frage2:

Kann ich den RS485 Bus auch als Ring ausbilden ?

Tom

Erstmal ist ein Bus ein Bus und ein Ring ein Ring.

Und ja, man kann mit den 485 Bustreibern auch einen Ring bilden...
Nur: Wenn ein Teilnehmer ausfällt, dann ist der Ring tot.

Meine Kristallkugel sagt:
Wenn du einen eigenen Bootloader schreibst, kannst du den Arduino über fast alles programmieren, was ein Dateneingang und Ausgang ist, also auch über den RS485 Bus, aber dann wohl nicht mehr über einen unmodifizierten AVRDude.

Sehr hilfreiche Antwort … :roll_eyes: vielleicht gibt es jemanden der etwas präzisere ohne Ironie auf die durchaus ernst gemeinte Frage des Eingangspost antworten kann.

Zum einem mal auch erst die Frage: du hast aber auch berücksichtigt, dass du mit den reinen RX/TX-Pins nur eine geringe Reichweite für die Signale hast?

Falls ja, du weitere Entfernungen hast und dafür Reichweitenerweiterungs-IC’s eingebaut hast, kann ich jetzt mal nur aus der reinen logische Theorie sprechen:
Ja.
Sowohl über die Reichweitenerweiterungs-IC’s, also auch ohne bei geringer Entfernung sollte es rein theoretisch funktionieren: einfach alle RX-Pins der Arduino’s und des USB-Konverters zusammen hängen, ebenso die die TX-Pins.
Jetzt stellt sich mir aber die Frage: Wenn die Arduino’s beim programmieren antworten, würden die sich ja gegenseitig in die Quere kommen. Von dem her würde ich sagen: Probiers einfach aus. Würde mich auch interessieren.
(Wenn du die Reichweitenerweiterungs-IC’s verwendest, darfst du den USB-Konverter nicht auf die Leitung zwischen den IC’s hängen, sondern zwischen die IC’s und den Arduino (nur so als Hinweis).)

LG

Fipsi

Tom30:
Sehr hilfreiche Antwort ...... :roll_eyes: vielleicht gibt es jemanden der etwas präzisere ohne Ironie auf die durchaus ernst gemeinte Frage des Eingangspost antworten kann.

Oh...
Meine Antwort war durchaus ernst gemeint.

Was hast du dir denn als Antwort erwartet?
Erwünscht?

RS485 ist ein Halbduplex-Bus, dh die Daten können immer nur in eine Richtung geschickt werden und die Datenrichtung muß an jedem RS485-Wandler eingesteuert werden. Außerdem muß die SW garantieren, daß nicht 2 Wandler nicht gleichzeitig senden.

Der RS422 ist ein Vollduplex-Schnittstelle mit 4 Leitungen der aber nur Punkt zu Punkt funktioniert (1 Sender und 1 Empfänger wie RS232) oder 1 Sender und mehrere Empfänger aber nicht mehrere Geräte die sowohl als Sender und Empfänger funktionieren.

Zur automatischen Programmierung muß der Arduino von der IDE resetiert werden Bei der RS422 bzw RS485 ist keine Handshakeleitungen vorgesehen und darum keine Möglichkeit den Arduino automatisch zu resetieren. Du könntest eine 2. RS485 nur für den Reset bzw DTR verwenden. Du müßtest einen USB-Serial-Adapter nehemen und die Daten über einen RS422 schicken und den DTR über ein RS485.
Ein Upload mit manuellen Reset ist möglich aber umständlich.
Lies Dich mal ein bißchen in die RS485 und RS422 Schnittstelle zB bei Wikipedia ein.

Grüße Uwe

Jetzt stellt sich mir aber die Frage: Wenn die Arduino's beim programmieren antworten, würden die sich ja gegenseitig in die Quere kommen.

Richtig!
Jeder Bus Teilnehmer braucht eine ID, oder Adresse.
Es muss ein (software) Protokoll eingehalten werden, sonst geht die Kommunikation in die "Binsen".
Und dieses Protokoll muss man dem Bootloader und derm AVRDude erst einbauen, denn das haben sie von Hause aus nicht dabei.

Ganz simple Antwort:
Nein, man kann nicht über RS485 programmieren.

Mal auf dieser Seite nach sowas geschaut?

Bezüglich Ring, auf Seite 7.

ich habe zwar keine Erfahrung mit RS485 bei Arduinos, aber recht viel (negative) Erfahrung mit RS485 bei einem ARM7-basierten System (Lego NXT):

etwas suggestiv formuliert: RS485 sendet immer "blind in den Bus hinein", jede Nachricht erreicht also immer jeden anderen Teilnehmer.
Damit ein Teilnehmer senden kann, muss er im "Write-Modus" arbeiten, das ist dann quasi der "Master".

Damit ein Teilnehmer lesen kann, was abgeht, muss er im "Read-Modus" sein, das sind dann quasi die "Slaves".

Um zu wissen, dass er selber gemeint ist, muss man in die Nachricht (meist ein Byte array) eine ID mitsenden, die zum jweiligen Adressaten gehört, und die muss ntl eindeutig sein, wenn nur 1 gemeint ist - oder darf ntl auch uneindeutig sein, wenn mehrere oder alle anderen gemeint sind.

Es muss sichergestellt sein, dass immer nur 1 Teilnehmer im Write-Modus ist, damit nicht mehrere Teilnehmer die Bus-Nachrichten durcheinandermischen und sich stören.

Ich hatte es z.B. so gelöst, dass immer das 1. Byte einer Nachricht die ID enthielt (1-32, mehr war eh nicht sinnvoll),
wurde z.B. 128 gesendet, war sie für alle bestimmt. Auch andere Verschlüsselungen sind ntl. möglich.

Es kann daher nie ein Slave direkt zu einem anderen Slave senden.
"Slaves" können aber eine Art "Respond-Mailbox" softwaremäßig eingerichtet bekommen, der Master kann die darin abgelegten Nachrichten dann abholen und lesen und an andere Slaves weiterschicken.

Diese Art der Kommunikation mit 2 Kabeln ("halb-duplex") ist sehr aufwändig zu programmieren, insb. was Message- / Transmission Control angeht, damit du feststellen kannst, ob nachrichten korrekt übermittelt wurden und nicht z.B. verstümmelt sind oder der Empfänger grade keine Zeit hatte, sie zu empfangen - dann muss die Nachricht nämlich nochmal und nochmal gesendet werden, ggf. bis zu einem vordefinierten Time-Out.
Du musst das i.P. alles aber selber schreiben! (Es sei denn du findest was fertiges.)

Als Transmission Control Protocol könnte man z.B. das Bitbus-Protokoll verwenden (i.P. ein Teil des TCP/IP-Protokolls).

Will man mehreren Teilnehmern das abwechselnde Senden ermöglichen, brauchst du ein komplettes Netzwerkprotokoll, also z.B. Token Ring, Aloha oder TCP/IP.

Irgendwann wurde mir das alles aber selber zu aufwändig für meine Zwecke, ich habs drangegeben und nur noch i2c höchstens mit einfachen checksums zur Kontrolle verwendet - oder BT mit 1 Master und 1 Slave..

HTH!

Es kann daher nie ein Slave direkt zu einem anderen Slave senden.

Aber hallo. Wo hastn des her?
denn

Es muss sichergestellt sein, dass immer nur 1 Teilnehmer im Write-Modus ist, damit nicht mehrere Teilnehmer die Bus-Nachrichten durcheinandermischen und sich stören.

"Slaves" können aber eine Art "Respond-Mailbox" softwaremäßig eingerichtet bekommen, der Master kann die darin abgelegten Nachrichten dann abholen und lesen und an andere Slaves weiterschicken.

geht auch, wenn der Master noch sein Senf dazu abgeben möchte.

Ich hatte es z.B. so gelöst, dass immer das 1 Byte einer Nachricht die ID enthielt (1-32, mehr war eh nicht sinnvoll),
wurde z.B. 128 gesendet, war sie für alle bestimmt. Auch andere Verschlüsselungen sind ntl. möglich.

Standard

Es gibt viele Busse die als Hardwarestandart den RS485 nehmen zB CAN-Bus

Grüße Uwe

Tja… erstmal danke für all die Antworten und links.

well, ich habe mich seid mehr als 10 Tagen mit den unterschiedlichsten Bussystemen beschäftigt und die Informationsfülle ist irgendwie erschlagend wenn man das noch nie gemacht hat. Ich hatte in einem anderen Thread nach vor/Nachteilen gefragt der Bussysteme gefragt, letztlich kam die Antwort (Hinwies / Tip / Conclusion) am unproblematischen sei eben der RS485 Bus.

Nach dem was ich hier jetzt wieder lese scheine ich aber wohl damit doch falsch zu liegen. Ich bin verwirrt.

Ich möchte doch nix anderes machen als etwa 16 Arduinos mit einander zu verbinden. 15 Räume + 1 Master.
Dabei sammelt jeder Arduino die Schalt / Sensor etc informationen im jeweiligen Raum und soll diese bei gezielter Anweisung (Abfrage) durch den Master versenden. Nach dem der Master alle 15 Punkte nacheinander abgefragt sind, verschickt er wiederum an jeden Slave die Information falls etwas gemacht werden soll. (Generelles Ereigniss z.B. “Fahre alle Rolladen im Haus herunter”)
Lokale Ereignisse (Rollade rauf / runter) erfolgen wiederum direkt in jedem Raum über den entsprechenden MCU.

Sprich, der Master bekommt und sammelt alle infos um zentral die Oberhand zu behalten / generelle Befehle zu geben.
Fazit, jeder Raum agiert für sich mit der Option das der Master überschreiben kann.
(Um Vorbehalte aus dem Weg zu schaffen - die gesamte 240V Technik ist VDE gerecht ZENTRAL mit Relais(16A) auf Hutschiene geregelt. Die Steuerung dazu übernimmt der Master - Vorgeschaltete Automaten / FI etc. sind obligatorisch)

Im Anhang mal wie ich mir die Steuerung in jedem Raum Vorstelle. Ziel der Übung, Jede Steuerung ist identisch Soft- und Hardwareseitig aufgebaut. Ethernet ist optional für spätere Funktionen (oder aber falls ich bei dem RS485 Bus erfolglos bleibe)

Liege ich mit meinen Überlegungen denn so falsch ???

MCP 23017 - Multi IO
ULN 2308 - treiber
PC123 - optos
MAX1785 - RS 485 Busankoppler
Derzeit geplant etwa 250 Sensoren und 120 Aktoren + 100 Feedback LED

Liege ich mit meinen Überlegungen denn so falsch ???

Anhang :

  1. Raum Steuerung
  2. Raum Beispiel
  3. Netzaufbau

Und nochmal, es geht mir nicht darum hier 40000 Euro zu sparen für ne fertige KNX sondern weil ich SPASS DARAN HABE es selber zu bauen. Die investierte Zeit ist ganz sicher deutlich teurer. Daher bitte auch nicht der Hinweis auf Wikipedia, denn wie ich das bediene habe ich zigfach erprobt und ich poste hier NICHT AUS FAULHEIT AM SUCHEN !. Ich weiß es nicht besser und ich habe nicht E-Technik studiert oder bin Elektriker.

Danke nochmals für die bisherigen Hinweise ! Weitere sind Wilkomen.

Tom

Du hast uns gerade etwas anderes erzählt:

Die eine Sache war, dass du den Arduino umprogrammieren willst.

Die andere Sache, die du aber tatsächlich willst, ist, dass der Arduino Befehle, die bereits im Programmcode vorhanden sind, auf Anweisungen durch den Bus ausführt.

Das heißt: Du musst alle deine möglichen Befehle in den Sketch einbauen und so programmieren, dass der jeweilige Programmteil auf ein bestimmtes Bussignal reagiert. Und dabei musst du jeden Arduino einzeln ansprechen. Gib jedem eine ID (1 - 15; 0 = Master) und lass den Master in einer for-Schleife die ID's 1 - 15 abarbeiten.

LG

Fipsi

:* 240V? Hab ich was verschlafen :stuck_out_tongue_closed_eyes:

Ich weiß jetzt nicht wo das Problem sein soll. Programmieren über das Bussystem halte ich, wenn vielleicht auch irgendwie möglich, für unsinnig. Da machst du dir einen zu großen Kopf drum. Wenn das Programm einmal stimmt, ist es gut.

Vergebe jedem Arduino eine eindeutige ID. Entweder in der Software hardcoded oder über Lötpads. Dafür brächtest dann Eingänge, wenn es bei 16 Teilnehmern bleiben wird.
Die Slaves sollen ihre zusendenen Befehle in einem Array ablegen.

Beispiel wäre folgendes
0xF5 // Rolladen oben
0xF4 // Rolladen unten

Jeder Arduino kann 16 verschiedene Informationen schicken. Von 0 - 15. Das könnten Rolladen auf, etc. bedeuten. Fange nicht damit an, sinnlos Strings oder sonstige Sachen über den Bus zu schicken. Sowas ist unüblich.
Die 16 verschiedenen Information sind auf der letzten Stelle des Hex-Codes abgelegt. Im Beispiel oben 5 oder 4. Das F gibt an, dass es sich um den Client/Slave mit der Adresse F = 15 handelt.

Das Array wird solange gefüllt, bis der Master die Daten anfragt. Danach das Array wieder auf NULL setzen.

Dein Master fragt somit alle paar Sekunden deine kompletten Clients ab.

1: Anfrage Temperatur Slave 1
2: Slave 1 bekommt die Anforderung und schickt Temperatur
3: Anfrage Temperatur Slave 1 abgeschlossen,
fahre mit nächstens Slave fort.
Falls keine Antwort kommt, setze ein Timeout. Wenn sich der Slave nicht meldet entsprechend irgednwo protokollieren, dass er nicht erreichbar war.

Edit: Wenn du wie oben eine Temperatur abfragst solltest du den gesendeten Code natürlich etwas erweitern! 0 - 15 reicht dafür natürlich nicht. Kannst aber auch 0xABCC machen. A ist deine ID (0 - F), B ist deine Kategorie (zB. 1 für Temp, 2 für Druck) und CC ist dein Wert für die Kategorie (Werte von 0 - FF/255. Die Temperatur kannst du dann entsprechend darauf mappen, oder wenn dir nur ganze °C wichtig sind, direkt schicken. Dann wirst halt nur nie 255 °C erreichen :D)

@Tom30
Für das Projekt das Du beschreibst ist RS485 sicher die beste Wahl.
Die Steuerung und Meßwert- bzw Pinabfrage von 16 Arduinos durch einen Master über RS485 ist kein Problem.
Die Programmierung der Arduino (upload des Sketches) ist etwas anderes und benötigt eine Vollduplexverbindung (unabhängige RX und TX Kanäle) und die Möglichkeit, den Arduino zu resetieren.

Grüße Uwe

Habe schon überlegt eine Website extra für sowas einzurichten...
Hier kommt ja jede Woche jemand an und frägt das gleiche.

Ganz einfach:
RS485 Bus.
Modbus Protokoll.
Platinen, ähnlich diesen.
Raspberry B+.
openHAB.
Geschirmtes 4 Adriges Twisted Pair Kabel. Dieses sollte reichen. Ich bevorzuge starres Kabel.

Fasse mal zusammen:
15 Zimmer.
In jedem Zimmer ein Arduino.
etwa 250 Sensoren und 120 Aktoren + 100 Feedback LED (welche und wozu so viele?)

Schematik:
Raspberry + USB->RS485----------- MAX485+Arduino-----------MAX485+Arduino----------MAX485+Arduino

Wo sind nun deine Fragen? Ich kann viel Text sehen aber keine konkrete Fragen.
Mal ganz in ruhe von vorne anfangen.

SPITZE !!!
Das sind mal Aussagen !!! - DANKE -

Ich habe im letzten Post die Bilder ergänzt wie das ganze funktionieren soll.
@sschultewolter - 1000 Dank, ja so möchte ich das machen. Obgleich mit 100 Werten pro Stelle. Hat damit zu tun das einiege Räume
sehr viel und andere ehr weniger Sensoren haben. Ich habe mir aber gedacht das ich die Anschlüsse für jeden Sensor Statisch mache
BSP (MCP23017 - 0x20 - A0-A7 = Tastensensor für Licht etc)… Sprich jeder Slave soll jeweils das volle Programm mit 100 Werten übertragen, egal ob der Port belegt ist oder nicht.

Verstehe ich das richtig das mein zurückgeliefertes SLAVE Protokoll Folgendermaßen aussehen kann ?

Beispiel Abfrage des Masters an SLAVE 10
Übertragung Starten

SLAVE ID - Register0 - Wert = 8Bit - 8Bit - 12 Bit = 10 - 00 - 0001
.
Übertragung aller Schaltzustände / Werte der Eingänge
.
Slave ID - Register 256 - Wert = 8 Bit - 8 Bit - 12 Bit = 10 - FF - FFFF (<- FFFF nur als Beispiel für Temp)
Übertragung Ende

Beispiel Schreiben des Masters an Slave 10

Übertragung Starten
SLAVE ID - Register0 - Wert = 8Bit - 8Bit - 12 Bit = 10 - 05 - 0001 (Setzt Ausgang 5 auf 1)
.
Übertragung aller Schaltzustände / Werte der Ausgänge
.
Slave ID - Register 256 - Wert = 8 Bit - 8 Bit - 12 Bit = 10 - 08 - 0001 (Setzt Ausgang 8 auf 0)
Übertragung Ende

Schon klar das der interpreter (sketch) das intern in jeder Unit jeweils verwurstet.

Ist meine Herangehensweise RICHTIG ??? (Ich mag da ggf. Denkfehler haben bei den Bit´s aber das möge man mir verzeihen.
Hab ich das denn Generell richtig verstanden das

ID = Ansprechpartner
Register = Stelle wohin der Wert geschrieben wird
WERT = Der Wert der in das betreffende Register geschrieben wird

?

Again @ sschultewolter

Die 240 V Steuerung des gesamten Hauses ist zentral zusammen geführt. das bedeutet das all Stromkreise der Steckdosen (1-2 für jeden Raum ) + Jede Lampe zentral zusammen geführt wird im Verteiler. Dort sind alle Leitungen an 16 A Finder Relais auf Hutschiene angeschlossen. Primärseite der Relais geht auf die Automaten die wiederum Gruppenweise FI´s vorgeschaltet haben. Bis zu den Automaten 16A ist alles als 2,5mm² NYM Kable ausgeführt. Davor 4mm² zu den FI´s. die FI´s sind wiederum mit 6 mm² an die 30 A Vorsicherung angeschlossen. Das ganze 3 mal (NICHT 3 PHASEN !!!) da der Versorger nur max 30A pro Anschluss liefert. Sprich ich musste 3 Anträge Stellen und habe nun 3 Stromzähler an der Strasse hängen für die gleiche Phase. Dazu 3mal L und N (32mm² Alu die ins Haus hinein gehen) - This is Thailand !

Ich habe einen Fundament Ringerder eingebaut so wie 2 weitere Tiefenerder in der Mitte des Hauses. Alle 3 habe ich zusammen geführt. Die Frage die sich mir bis heute stellt, brücke ich das am Eingang auf N oder nicht. Es war seitens des Versorgers NICHT heraus zu bekommen welches Netz / Verfahren verwenden (TN-System) wird.

Kommentar des Versorgers zu PE : “NO NEED SIR… working with 2 line only”… na dann…

Derzeit also NOCH NICHT PE auf N gebrückt am Eingang… ich arbeite an der Lösung - Komments Welcome.

Final : Ist meine RS485 Herangehensweise immer noch RICHTIG ???

Zu guter letzt noch ein paar Fotos bezüglich meiner 240V zentral Steuerung - damit man mich hier nicht wieder als Vollpfosten oder LED Theoretiker abstempelt. Wie gesagt, ich mache das aus Freude und lerne sehr gerne dazu.

Tom

P.S. Bin ich noch davon aus gegangen das ich auch alle Taster zentral zur Steuerung führe. daher auch die 2 Eingangs Platinen. Mitlerweile will ich das eben über RS485 lösen , seis drum. die Eingangsplatinen fungieren somit als Backup wenn der Bus versagen sollte.

Mit Registern trifft es nicht ganz, aber das System hast du glaub verstanden.
Wie deine Wertebereiche dann aussehen, musst du schaun. Du kannst die natürlich xbeliebig vergrößern.

Die Bilder machen trotz Streifenrasterplatinen einen guten Eindruck :wink:

Thailand? Alles klar, das würde zumindest deine 240V erklären :wink:

Na ja @ Scorpio,

wenn ich mir Deine Threads so anschaue hast Du jja die ein oder andere ähnliche Frage / Probleme gehabt. Und das ist auch nicht all zu lange her.
Klasse wenn Du das gelöst haben solltest und eine Website dazu ist sicherlich eine tolle Sache. Ich freu mich aber sicherlich auch immer zu konkreten Links

Meine Fragen richten sich KONKRET DARAUF :

(bitte Post der Seite 1 beachten (letztes Post !!!!! mit Bildern der Zentralsteuerung !!!!)

Ist der RS 485 nun das richtige Bus System für mich ? Laut UWEFm schon und was ich so gelesen habe auch. Die Eingangspost´s habe mich nur sehr verunsichert und ich wäre SEHR FROH (!!!!!) wenn mir jemand eine Antwort geben kann ob ich das richtig verstanden habe bezüglich des Protokolls ( Seite 1, letztes Post !) .

Tom

Tom30:
Ich habe einen Fundament Ringerder eingebaut so wie 2 weitere Tiefenerder in der Mitte des Hauses. Alle 3 habe ich zusammen geführt. Die Frage die sich mir bis heute stellt, brücke ich das am Eingang auf N oder nicht. Es war seitens des Versorgers NICHT heraus zu bekommen welches Netz / Verfahren verwenden (TN-System) wird.

Kommentar des Versorgers zu PE : "NO NEED SIR...... working with 2 line only"... na dann........

Derzeit also NOCH NICHT PE auf N gebrückt am Eingang....... ich arbeite an der Lösung - Komments Welcome.

Ich kanns Dir für Italien beantworten.
NEIN.
PE und N müssen getrennt sein.

Der N Leiter ist in der Trafostation (Trafo Mittelspannung 230V) mit seiner Erdungsanlage geerdet und Dein Haus hat seine Erdungsanlage. Wenn Du nun den N-Leiter in Deinem Haus erdest wird Deine Erdungsanlage zur Erdung aller N-Leiter der gesamten Nachbarschaft und es fließt der gesamte Erdableitstrom durch Deinen Erdleiter in Deine Erdungsanlage.
Ob der N-Leiter geerdet ist erfährst Du indem Du die Spannung zwischen Deinem Erdleiter und N und L mißt. Ist zwischen PE und N einige V dann ist der N-Leiter Trafoseitig geerdet. Hast Du ca die gleiche Spannung zwischen PE und N bzw L dann ist N nicht geerdet.

NO NEED SIR...... working with 2 line only

Das schließt einen geerdeten N-leiter nicht aus. Oder will das heißen daß da gar kein 3-Phasennetz vorhanden ist?

Grüße Uwe