Dynamische Vernetzung

Hallo zusammen,

Ich stelle gerade ein paar Vorüberlegungen für ein neues Projekt an und wäre über euer Feedback dankbar.

Es sollen Arduino Module über ein Bus System miteinander vernetzt werden ohne das ich im Vorfeld eine Hardware Adresse vorgegeben habe. Die Anzahl der Module geht später denke ich schnell in die hunderte (die Strecken zwischen Modulen sind sehr gering, da diese direkt zusammen gesteckt werden sollen.

Das Bussystem ist für mich noch nicht festgelegt. Ich denke aber es könnte der I2C in Frage kommen .

Meine ersten Überlegungen bestehen darin auf jedem Modul einen ic zu verbauen der die erste Adresse vergibt irgend ein 64 Bit ic...

Jetzt soll ausgehend vom ersten Master im Raster neu adressiert werden falls ein Modul angesteckt ist.

Alles nach rechts um eine einer Stelle erhöhen und alles nach oben um eine Zehner Stelle.

20,21,22,23,24,25,26,...
10,11,12,13,14,15,16,...
00,01,02,03,04,06,07,...

So will ich später entweder an alle Module einen Befehl senden um z. B. Eine Funktion zu aktivieren, oder alternativ einzelne Module gezielt ansprechen.

Ist das so vom Prinzip möglich?

Gibt es vielleicht sinnvollere Bus Systeme?

Danke schonmal für eure inputs.

Gruß tweak

tweak87:
Die Anzahl der Module geht später denke ich schnell in die hunderte

I2C kann nur eine begrenzte Anzahl von weniger als 127 Adressen (praktisch weniger) verwalten. Bei programmierbaren Modulen würden sich also gegebenenfalls mehrere Module gleichzeitig angesprochen fühlen, aber mit dem nächsten Datenbyte könnte dann eine weitere Adresse geliefert werden, die per Sketch ausgewertet werden könnte. Spannende Frage wäre, ob man den drohenden Datensalat dann verhindern kann.

Ja die Begrenzung bezieht sich ja auf die Anzahl der Slaves... Ggfls müsste dann sagen wir alle 100 Module ein zusätzliches Master Modul dazu... Mann könnte dieses auch je Reihe vorsehen.

Würde ich damit dieses Problem nicht umgehen?

Alternativ kann ich ja auch sein seriellen Bus nutzen, wieviel Teilnehmer ich daran hängen kann weiß ich gerade aber aus dem stehgreif nicht :wink:

Frage: woher weiß der jeweilige Master, welchen Slave er ansprechen möchte? Insbesondere wenn sich die Adressierung aller Knoten beim Hinzufügen eines weiteren Knoten komplett ändert...

Bei fest zugeordneten Steckplätzen wäre das Problem, woher jeder Knoten weiß, wo er in der Matrix gerade eingestöpselt ist. Dann müßte man entsprechend große Stecker verwenden, an denen man jeden Platz eindeutig codieren kann.

Bei völlig dynamischer Adressierung könnte jeder Knoten nach dem Einstöpseln nachschauen, welche Adressen bereits vergeben sind, und sich eine freie Adresse aussuchen.

Falls die Knoten unterschiedlich aufgebaut/verkabelt sind, könnte es hilfreich sein, wenn jeder Knoten mitteilen kann, was für eine Aufgabe bzw. angeschlossene Sensoren/Aktoren er hat.

Kannst Du etwas ausführlicher erklären, was die einzelnen Rechner in Deinem Netzwerk für Aufgaben haben, und wie das ganze System mit ein- oder ausgestöpselten Modulen umgehen soll?
Gibt es einen Master-Controller?
Kommunizieren beliebige Knoten untereinander?

Danke erstmal für den input,

Also der Hintergrund ist folgender, ich will eine Fläche oder kompletten raum mit diesen Modulen auslegen über die dan unterschiedliche Funktionen realisiert werden, z. B. Die Erkennung einer Person über Drucksensoren, oder die Beleuchtung bestimmter Bereiche z. B. Notausgang etc.

Hierzu muss ich jedes Modul eindeutig im Raum identifizieren können, unabhängig davon wie groß der Raum oder die Fläche ist.

Ein Maximum wird es sicherlich geben das wird sich aber zeigen.

Ob es einen Master Controller gibt der die Knoten ansteuert und diese wiederum nur mir den ihnen zugeordneten Slaves kann ich noch nicht sagen, da ich mich wie gesagt noch ganz am Anfang befinde und erstmal ein Brainstorming machen wollte.

Vielleicht vom Aufbau in etwa so

Mastercontroller
I I I
Master Master Master
Slave Slave Slave
Slave Slave Slave
Slave Slave Slave
... .... ....

tweak87:
Ja die Begrenzung bezieht sich ja auf die Anzahl der Slaves... Ggfls müsste dann sagen wir alle 100 Module ein zusätzliches Master Modul dazu... Mann könnte dieses auch je Reihe vorsehen.

Würde ich damit dieses Problem nicht umgehen?

Jein, zumindest braucht so ein Master dann zwei unabhängige I2C Kanäle. Oder die Master kommunizieren untereinander über ein anderes Bus-System. Zwar lassen sich in den erweiterten I2C Protokollen längere Adressen verwenden, aber die Arduinos könnten elektrische Probleme mit so vielen Teilnehmern bekommen. Insofern wäre eine Unterteilung des Netzwerks durchaus sinnvoll.

Alternativ kann ich ja auch sein seriellen Bus nutzen, wieviel Teilnehmer ich daran hängen kann weiß ich gerade aber aus dem stehgreif nicht :wink:

Du mußt Dich wohl entscheiden, ob die Netzwerkknoten über Adressen im Protokoll (software, I2C) oder über Chipselect-Leitungen (CS, hardware, SPI) angesprochen werden sollen. Mit CS wären die Steckplätze direkt adressierbar, mit 2 Eingängen sogar als X/Y Matrix mit weniger Aufwand für die Decodierung und Verkabelung. Aber für rein serielle Punkt-zu-Punkt Verbindungen (RS-232...) wäre ein zusätzlicher Aufwand für das Multiplexen der Datenleitungen notwendig. Hinzu kommen mögliche Konflikte, da ja immer nur ein einziger Master-Controller die CS Leitungen bedienen darf.

tweak87:
Also der Hintergrund ist folgender, ich will eine Fläche oder kompletten raum mit diesen Modulen auslegen über die dan unterschiedliche Funktionen realisiert werden, z. B. Die Erkennung einer Person über Drucksensoren, oder die Beleuchtung bestimmter Bereiche z. B. Notausgang etc.

Hierzu muss ich jedes Modul eindeutig im Raum identifizieren können, unabhängig davon wie groß der Raum oder die Fläche ist.

Das spricht IMO eindeutig für eine feste Adressierung aller Steckplätze, als X/Y Matrix. Die Matrix kann natürlich für jeden Raum unterschiedlich groß werden, aber damit muß Deine Software sowieso irgendwie fertig werden.

Die Erkennung per Drucksensor ist einfach, jeder Knoten kann so einen Sensor haben. Aber wie willst Du die Beleuchtung für Notausgänge etc. realisieren? Diese Lampen wären ja irgendwie außerhalb der Matrix, und fest an den Wänden installiert. Die müssen dann wohl vom Master direkt gesteuert werden, auch kein Problem wenn alle Lampen gemeinsam ein-/ausgeschaltet werden sollen.

Wenn du I2C einsetzen möchtest, dann setze auf jedem Slave einfach einen 7er Schalterblock (diese Roten kleichen Kästchen mit weißen Schaltern) ein, womit du die Adressen einstellst. Sinnvoll wäre es, wenn du das ganze unterteilst, in dem du mehrere Masters einsetzt mit jeweils zB 32 Slaves. Die Masters kommunizieren dann über bestenfalls über SPI, damit du hier auch einen ordentlicheren Datendurchsatz schaffst.

Also an das Thema dipschalter zur Codierung hatte ich auch schon gedacht, macht es aber wieder weniger anwenderfreundlich....

Mit der Beleuchtung z. B. Für den Notausgang war eher so gedacht das die Module jeweils eine Beleuchtung bekommen und so der Weg zum Notausgang beleuchtet werden könnte.

Die drucksensoren sollen auch jeweils in ein Modul verbaut werden :wink:

So könnte ich z. B. Module auf denen länger schon ein Hindernis steht deaktivieren.

Die Matrix Lösung wäre aber eine gute Idee, und anstatt dipschalter je Modul, könnte ich vielleicht eine grundmatte entwickeln auf die die Module aufgesteckt werden können, und in der schon eine Adressierung vorgegeben ist. So konnte ich die Adressen bestimmen und einfach nur die Erreichbarkeit abfragen. Die Größe wäre somit auch variabel.

I2C hat mehrere Limits. Eines ist die Mögliche Anzahl der Adressen für den Slave die auf ca 100 begrenzt sind (einige Adressen sind reserviert) und andererseits die max Last an den Leitungen ( Last als Strom für die Eingänge und die Kabelkapazität die durch die Pullupwiderstände wieder geladen werden muß.

Grüße Uwe

uwefed:
I2C hat mehrere Limits. Eines ist die Mögliche Anzahl der Adressen für den Slave die auf ca 100 begrenzt sind (einige Adressen sind reserviert) und andererseits die max Last an den Leitungen ( Last als Strom für die Eingänge und die Kabelkapazität die durch die Pullupwiderstände wieder geladen werden muß.

Schon richtig, aber auf welches Bus-System trifft das nicht ebenfalls zu?
Bei unidirektionalen Bus-Leitungen kann man zwar Verstärker dazwischensetzen, aber die verlängern dann ebenfalls die Signallaufzeiten.

Mir deucht, daß das Projekt noch eine lange Reifungsphase vor sich hat...

Nach dem ich mir das mal durchgelesen habe, glaube ich dass I2C nicht das Mittel der Wahl ist.
Alleine schon die Entfernungen.

Alternativvorschlag:
Serielle Verkettung von Arduinos.

Arduino1  Arduino2  Arduino3  Arduino4  
Tx    Rx  Tx    Rx  Tx    Rx  Tx    Rx  
|      |   |     |   |     |   |     | 
|      \___/     \___/     \___/     |
\____________________________________/

Softwarseitig müsste man sowas wie ein TokenRing Protokoll entwerfen.

Um daraus Bäume von Ringen zu entwickeln sind dann Arduinos mit mehreren seriellen Schnittstellen nötig, welche dann als Router zwischen den Ringen fungieren.

Ja die Vermutung das noch viel Arbeit vor mir liegt hatte ich schon lange :wink:

Combie, der Lösungsansatz klingt sehr interessant allerdings vermute ich das ich da zumindest aktuell mit meinen C++ Kenntnissen noch an meine Grenzen stoßen könnte...
Aber das soll ja kein Hindernis sein :stuck_out_tongue:

Hast du schon mal etwas in der art versucht? Die einzelnen Ringe haben ja sicherlich auch Ihre Grenzen, bis jetzt hab ich hierzu aber noch nichts gefunden, bin aber auch gerade erst auf die Suche gegangen :wink: ...

tweak87:
Hast du schon mal etwas in der art versucht?

Nöö...
Würde mich aber reizen....

Wenn die Zeit es zulässt baue ich mal einen kleinen Versuchsaufbau zusammen , ein paar Controller sollte ich noch hier rumfliegen haben;)

Wenn dir/euch noch was einfällt immer raus damit ich bin für jeden Input offen und freue mich über weitere Anregungen.