Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen 120 Arduinos mit möglichst wenig Verkabelungsaufwand


von Alain Z. (alzen)


Lesenswert?

Hallo Leute,

für ein aktuelles Projekt benötige ich auf einer Fläche von ungefähr 2m² 
bis zu 120 einzelne RFID Reader, die alle jeweils von einem eigenen 
MC(bsp Arduino Nano) gesteuert werden. All diese Leseeinheiten müssen 
mit einem Master kommunizieren können und Daten senden und empfangen 
können.
Der Kommunikationsumfang ist sehr gering, die Slaves müssen dem Master 
nur mitteilen ob und wenn ja, welchen Chip sie gerade vor der 
Leseeinheit haben. Das einzige relativ zeitkritische ist wenn es einen 
Wechsel vor einem der Lesegeräte gegeben hat, diese Info sollte zu jedem 
Zeitpunkt schnellstmöglich beim Master ankommen.
Die komplette Auswertung von dem RFID Reader erfolgt in dem Slave und 
ist bereits lauffähig.

Das was jetzt noch fehlt ist eine möglichst einfache Kommunikation mit 
einem übergeordneten Master, der das ganze auswertet.
Da wir von bis zu 120 Slaves auf einer Fläche von 2m² reden gibt es 
folgende Randbedingungen für die Art der Kommunikation:
- Möglichst wenig Kabel da sonst der Aufwand extrem wird
- Möglichst günstige Bauteile, da der Preis sonst extrem wird.

Ich sehe jetzt 2 grundsätzliche Möglichkeiten:
- Kabelgebundene Kommunikation über ein Bussystem, z.B. 1-Wire oder I²C.
- Funkbasierte Kommunikation z.B. mit RF24 Mesh

Bevor ich mir jetzt noch viele Bauteile kaufen um das ganze im kleinem 
Maßstab zu testen wollte ich fragen zu welchem System ihr mir raten 
würdet, welches am Ende auch problemlos auf 120 Slaves ausgebaut werden 
kann.

Danke

von H.Joachim S. (crazyhorse)


Lesenswert?

CAN.

von F. F. (foldi)


Lesenswert?

Gibt es wohl als 1-wire. Ich würde das mal damit machen.

von Einer K. (Gast)


Lesenswert?

Eine Art TokenPassing System.

Klarer:
Einen Ring bilden

Jeder Arduino (besser den pro Mini nehmen), hat eine Serielle 
Schnittstelle.
Da den Tx mit dem Rx des linken Partners verbinden, und den Rx mit dem 
Tx des rechten Partners verbinden.


Bei Erkennung eines "Dings" ein Token auf die Reise schicken.

Token mit eigener Absender Adresse verschlucken, also nicht 
weiterreichen.
Token mit fremder Absender Adresse weiterreichen.

So werden alle Arduinos über alle "Dinge" infpormiert.

von A. S. (Gast)


Lesenswert?

Fragen:
Wie schnell? Wenn 30 gleichzeitig ändern? Bidirektionale Kommunikation?

Im einfachsten Fall uart, Master an alle, slaves tristate oder per 
Diode. Ohne Inverter etc, also direkt. Und Entstörung nur außerhalb.

Falls der Master mehrere uarts hat, gerne auch als Matrix.

Wenn immer alle gleichzeitig senden können dürfen und alle funktionieren 
müssen, dann auch Punkt zu Punkt (für jeden Strang)

Als fertiges Protokoll ist Can aber sicher das einfachste, wenn es dein 
Controller schon kann.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Alain Z. schrieb:
> Ich sehe jetzt 2 grundsätzliche Möglichkeiten:
> - Kabelgebundene Kommunikation über ein Bussystem, z.B. 1-Wire oder I²C.
> - Funkbasierte Kommunikation z.B. mit RF24 Mesh

 Funk kannst du gleich vergessen, ebenso I2C.

 Am besten nur CAN-Transceiver nehmen und (da Arduinos kein CAN haben),
 eigenes Protokoll implementieren.
 Mit 2Byt Adresse, 5-6Byt Card-ID + CRC und 19200B dauert es über 4,5ms
 für eine Nachricht. Und diese muss noch bestätigt werden oder eine
 neue muss angefordert werden (bei Überlagerung).

 Und das wird mit 120 Arduinos gleichzeitig ein Zirkus.

 Du kannst aber pro 20 Arduinos einen Master spendieren, so hättest
 du nur 6 Arduinos die ausgewertet werden sollten, diese ihrerseits
 hätten jeweils 20 Arduino-Readers auszuwerten. Könnte ev. noch gut
 gehen.

 P.S.
 Diese 6 Arduinos können vom Master zyklisch abgefragt werden, da
 kann es mit Software-UART gehen.

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Naja, Arduino Nano kann ja kein CAN, zumindest nicht direkt, das geht 
nur per SPI CAN-Controller - das hat schon was hinderliches an sich.
Wobei es wohl auch Arduino Support für die 90CAN gibt.
Und ein DUE müsste CAN direkt können, dem würde nur ein Transceiver 
fehlen.

Aber warum eigentlich 120 Arduino für 120 RFID Leser?
Warum nicht mehrere Leser an einen Arduino hängen?

Und was auch immer das zu Grunde liegende Problem ist, 120 RFID Leser 
auf 2m² finde ich etwas seltsam.

von Löter (Gast)


Lesenswert?

120 Reader klingt nach Messebau Spassprojekt :)

Wie schnell musst du die Daten haben? Token Passing ist langsam, im 
schlimmsten Fall bekommst du die Nachricht erst nach 60 Hops. Wie lange 
ein Hop dauert hängt dann von deiner Software ab und ob der Controller 
grade beschäftigt ist.

CAN wäre hier echt die beste Lösung und ist simpel zu verdrahten. Wenn 
du die Möglichkeit hast, wechsel zu einem Controller mit CAN Hardware 
(kleiner STM oder dsPIC) der nur noch einen Transceiver braucht. Die 
alten externen SPI CAN Controller sind etwas krampfig und teuer.

von Joe F. (easylife)


Lesenswert?

Rudolph R. schrieb:
> Aber warum eigentlich 120 Arduino für 120 RFID Leser?
> Warum nicht mehrere Leser an einen Arduino hängen?

Sehe ich auch so.
Was benutzt ihr denn um die RFID Tags zu lesen?
Diese ICs haben in der Regel eine eingebaute FIFO, einen 
Interrupt-Ausgang und sehr häufig ein SPI Interface.

Was du dann benötigst, ist eine Schieberegister Kette, um 120 
Interupt-Signale vom Master überwachen zu lassen, und eine 
Schieberegister Kette, um 120 Chip-Select Ausgänge für die RFID 
Transceiver zu haben.

Das ganze besteht dann also aus 1 Master, 120 RFID Transceivern, 30 
Schieberegistern und 2 SPI Bussen (8 Leitungen).

Andere Frage wäre, ob sich 120 Antennen auf nur 2m^2 (also alle im 
Abstand von nur ca. 14cm) nicht heftigst gegenseitig stören...

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Unter Umständen könnte das funktionieren: Jeder Arduino kriegt eine 
IR-LED und einen Fototransistor, und alle zeigen auf eine reflektierende 
Oberfläche mit einer bestimmten Entfernung. Über ein schlaues Protokoll 
welches mit diesem shared medium klarkommt könnten die so kommunizieren. 
Man müsste evaluieren ob das billiger/einfacher als Funk ist.

von H.Joachim S. (crazyhorse)


Lesenswert?

Alain Z. schrieb:
> Das einzige relativ zeitkritische ist wenn es einen
> Wechsel vor einem der Lesegeräte gegeben hat, diese Info sollte zu jedem
> Zeitpunkt schnellstmöglich beim Master ankommen.

Möglichst schnell ist ne Quatsch-Anforderung. Sag wie schnell 
mindestens...
Aber genau der Punkt war es, warum ich CAN vorgeschlagen habe. Damit 
hast du automatisch ein Multimaster-System.
Master/slave bei 120slaves im ping-pong-Betrieb dauert ne Weile, bis du 
alle durchgeklappert hast. Sollen sie selbsttätig was melden, hast du 
(zumindest bei einfacher Verkabelung) ein Problem, Buskonflikte sind 
vorprogrammiert

Nur die CAN-Transceiver nehmen ohne Conrtroller wurde ja auch schon 
genannt. Wenn jeder alles mitliest, kann man erkennen, ob die eigene 
Botschaft zumindest erstmal korrekt auf den Bus gelegt wurde. Ist 
natürlich noch keine Garantie, ob es auch dein Master (der in dem Fall 
gar keiner mehr ist) das auch korrekt empfangen hat.

Kompletter CAN wird jedenfalls die für dich einfachste und 
betriebssicherste Realisierung sein. Inwieweit sich das mit Arduino 
realisieren lässt, weiss ich nicht. Die Software beschränkt sich 
jedenfalls mehr oder weniger darauf, die message in den CAN-Controller 
zu schreiben. Und sie wird ankommen, ohne dass du dich drum kümmern 
musst.

Letzten Endes ist aber auch die Frage: was wird es? Eher Richtung 
Spielzeug, wo es egal ist, ob es vielleicht das eine oder andere Mal 
nicht 100% funktioniert oder was Ernsthaftes?

von Alain Z. (alzen)


Lesenswert?

Hallo,

schon mal vielen Dank für die vielen Antworten.
Bei dem Projekt geht es um ein Konzept für eine Art Lagerverwaltung. 
Jedes Objekt hat ein RFID Chip zur Identifizierung und einen 
zugeordneten Lagerplatz. Die Überwachung ob das Objekt vorhanden ist 
oder nicht erfolgt über den RFID Reader an der jeweiligen Lagerstelle. 
Die Slaves sollen diese Informationen weiter an einem Master senden, der 
die eigentliche Lagerverwaltung organisiert. Dank dem RFID weiß man dann 
zu jedem Zeitpunkt welches Objekt vorhanden ist und wo es zu finden ist.

Mehrere Reader pro µC wären theoretisch möglich, allerdings würde das 
die Flexibilität etwas einschränken, da die einzelnen Lagerplätze je 
nach Objekt eine unterschiedliche Größe haben und damit auch einen 
unterschiedlichen Abstand zwischen den Lesegeräten. Sollte es aber 
möglich sein pro Arduino(oä) gleichzeitig 4 bis 8 RFID Reader zu 
betreiben und auch eindeutig zu unterscheiden, wäre das aber auch eine 
Überlegung wert.

Zu der Geschwindigkeit: Es würde gut ausreichen wenn der Master 
innerhalb von 1-2s über einen Statusupdate von einem der Lagerplätze 
informiert wird.

von Theor (Gast)


Lesenswert?

@ Alain

Darf ich fragen, was für RFID-Reader Du da konkret zu verwenden 
beabsichtigst?

von Sebastian S. (amateur)


Lesenswert?

Wenn das Datenvolumen gering ist, baue einen Ring auf.
Daten die den Empfänger nichts angehen werden einfach weiter gereicht. 
Somit reichen drei Drähte aus. 1 X Rx; 1 X Tx; ein bisschen Masse.
Zu den zu übermittelten Daten kommt dann nur noch ein Adressat hinzu.

von H.Joachim S. (crazyhorse)


Lesenswert?

Ring: tja, ist so ne Sache. Wenn einer kaputt ist/ausgesteckt oder sich 
weghängt steht der ganze Mist komplett.

Bei 1s geforderter Zykluszeit bleiben 8ms pro Teilnehmer. Das sind 
immerhin rund 100Byte für jeden bei gemächlichen 115200Baud. Da kann man 
schon jeden persönlich fragen und die Antwort entgegennehmen. Bleibt es 
bei den 120 Stück, ist das mehr als ausreichend. Bei Erweiterungen ist 
man dann aber irgendwann rel. schnell am Ende bei diesem Prinzip. Dann 
wäre ereignisgesteuerte Multimasterkommunikation das Mittel der Wahl.

Jetzt bleibt die Frage des Mediums: theoretisch reicht eine einzige 
wired-or-Leitung. Im industriellen Umfeld wirst du dann aber mit 
Störungen zu rechnen haben.
Und dann sind wir eben doch wieder bei UART+Treiber, also CAN- oder 
RS485-Transceiver. RS485 kann schneller als CAN betrieben werden, 
benötigt aber Sende/Empfangsumschaltung, ist aber keine grosse Sache. 
Und nun musst du nur noch jedem Knoten irgendwie eine Adresse geben.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sebastian S. schrieb:
> Wenn das Datenvolumen gering ist, baue einen Ring auf.
> Daten die den Empfänger nichts angehen werden einfach weiter gereicht.
> Somit reichen drei Drähte aus. 1 X Rx; 1 X Tx; ein bisschen Masse.

 Und 119 Mal 10 Mal 52us ergibt wieviel us Verzögerung bei 19,2KB ?

von Frank L. (hermastersvoice)


Lesenswert?

Ich bezweifele dass man so viele Reader rückwirkungsfrei auf so kleiner 
Fläche unterbringen kann.

von Helmut H. (helmuth)


Lesenswert?

Würde für die RFID Reader die I2C-Variante nehmen. Da kann man bis zu 64 
Adressen am MFRC522 einstellen. Das reduziert die Anzahl der 
erforderlichen Arduinos und den damit verbundenen Verdrahtungsaufwand 
ganz erheblich.

von Wolfgang (Gast)


Lesenswert?

Frank L. schrieb:
> Ich bezweifele dass man so viele Reader rückwirkungsfrei auf so kleiner
> Fläche unterbringen kann.

Pro RFID ist das immerhin eine Fläche mit einem Durchmesser von gut 
14cm. Halte mal beispielsweise ein Tag 10cm neben die Sendeantenne. Bei 
einem 13.56MHz Reader mit einer vielleich 4cm großen Antenne sehe ich da 
keine Gefahr. Probieren sollte man es natürlich.

Notfalls kann man die Reader synchronisiert, so dass benachbarte nicht 
gleichzeitig abfragen.

von rmu (Gast)


Lesenswert?

Da die Abstände nicht recht gross sind könnte auch SPI funktionieren, 
alle Arduinos seriell aneinander hängen. (MISO an MOSI). Die Clock wird 
man ein paar mal puffern müssen.

Bei geschätzten 10000 Bit pro Durchlauf könnte man da schon auf ganz 
ordentliche Update-Raten kommen.

von Frager (Gast)


Lesenswert?

Wie immer, alle diskutieren wie wild über eine vielleicht untaugliche 
Teillösung und niemand fragt, was das Ganze eigentlich bezwecken soll 
und ob das nicht anders zu lösen wäre.

von Kolja L. (kolja82)


Lesenswert?

Frager schrieb:
> was das Ganze eigentlich bezwecken soll

Ich mutmaße mal, dass immer nur einer der 120 Reader zu einem bestimmten 
Zeitpunkt benötigt wird.
Warum dann so kompliziert?

Alle in Reihe  schalten?

von Frager (Gast)


Lesenswert?

Sorry, der Beitrag von 19:45 ist mir irgendwie durchgerutscht. Hab 
nichts geschrieben. ;-)

von Jim M. (turboj)


Lesenswert?

Alain Z. schrieb:
> Sollte es aber
> möglich sein pro Arduino(oä) gleichzeitig 4 bis 8 RFID Reader zu
> betreiben und auch eindeutig zu unterscheiden, wäre das aber auch eine
> Überlegung wert.

Wenn die RFID Reader als I²C Slave angesteuert werden können, dann 
könntest Du einfach 4-8 Software I²C Busse mittels GPIOs implementieren. 
Braucht dann 2 Portpins pro Bus.

Der I²C Master ist in Software überhaupt kein Problem, da sollte es 
Beispielcode geben.

Wenn die Kabel nicht zu lang werden dann könnte man auch mehr als einen 
Reader an einen I²C Bus hängen. Voraussetzung: Sie haben verschiedene 
I²C Addressen, da gibts aber oft einstellbare Bits.

von A. S. (Gast)


Lesenswert?

Alain Z. schrieb:
> Die Überwachung ob das Objekt vorhanden ist oder nicht erfolgt über den
> RFID Reader an der jeweiligen Lagerstelle


Wie passt das zu den 2qm?

Und ist das "möglichst schnell“ jetzt wirklich 1 bis 2 Sekunden?

Dann reicht UART mit wired or oder can tranceiver .

von Pandur S. (jetztnicht)


Lesenswert?

Ein Tokenring ist eine gute Wahl. Auch wenn die Nachricht 60 Hops 
dauert, kann man ja pipelinen, und alle senden ihren Status in dieser 
Globalmeldung.

Dieselbe Statusmeldung geht immer rund rum. Einfach in der passenden 
Position den eigenen Status einfuellen.

von Half (Gast)


Lesenswert?

Marc V. schrieb:
> Funk kannst du gleich vergessen, ebenso I2C.

Warum soll das mit I2C nicht gehen?
I2C sollte problemlos einen Master mit 127 Slaves verbinden können. Es 
muss nur jeder Slave seine eigene I2C-Adresse haben.

von CAN (Gast)


Lesenswert?

Ich votiere für CAN.

Meist kommen noch Anforderungen dazu da ist man mit einem vernünftigen 
Bussystem auf der sicheren Seite.

Wenn CAN zu teuer wird sollte man RS485 nehmen. Wenn das nicht geht 
könnte man auch an LIN denken.

von Der Andere (Gast)


Lesenswert?

Alain Z. schrieb:
> Bei dem Projekt geht es um ein Konzept für eine Art Lagerverwaltung.

Wenn das ein ernsthaftes Konzept sein soll, dann muss es später auch mit 
dem Zehn oder Hundertfachen Anzahl Lesern funktionieren.
Also ist das Zusammenschalten aller Leser zu einem Token Ring etc Unfug.

Sowas baut man modular und mehrstufig auf.

von (prx) A. K. (prx)


Lesenswert?

CAN schrieb:
> Ich votiere für CAN.

Was man bei Alternativen wie RS485 oder Token Passing in Software 
realisieren muss, das ist bei CAN in Hardware drin. Hat man also mehr 
Geld als Zeit, ist man mit CAN besser dran.

Wobei man bei einem einzigen CAN Bus mit 121 Nodes schon mal nachrechnen 
sollte, ob die Transceiver das überhaupt können.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Half schrieb:
> Marc V. schrieb:
>> Funk kannst du gleich vergessen, ebenso I2C.
>
> Warum soll das mit I2C nicht gehen?
> I2C sollte problemlos einen Master mit 127 Slaves verbinden können. Es
> muss nur jeder Slave seine eigene I2C-Adresse haben.

 Weil es nicht geht.
 Oder es wird (aber nur vielleicht) gehen, mit Zeiten die mit I2C
 Spezifikationen nicht mehr das Geringste gemeinsam haben...

 ATMEL sagt folgendes:
1
Capacitance for each I/O Pin = 10pF
2
Output Fall Time from VIHmin to VILmax  (10pF < Cb < 400pF)
3
Cb = capacitance of one bus line in pF.

 Auch nach I2C Spezifikationen ist Max. 400pF erlaubt.

 120 Arduinos ergeben aber ?

von Michael B. (laberkopp)


Lesenswert?

Alain Z. schrieb:
> Ich sehe jetzt 2 grundsätzliche Möglichkeiten:
> - Kabelgebundene Kommunikation über ein Bussystem, z.B. 1-Wire oder I²C.
> - Funkbasierte Kommunikation z.B. mit RF24 Mesh

Wow, Funk, wie wahnsinnig. Wie kommt man auf so abstruse Ideen ? Die 
Stromversorgung erfordert eh schon mal 2 Leitungen, da kommt es auf die 
dritte kaum an.

Vernünftig wäre es wohl, an statt den Overkill mit vorgefertigen Modulen 
zu vollziehen einfach eine 11 x 11 Antennenmatrix umzuschalten an einem 
einzigen RFID Reader (je nach RFID Prinzip).

Aber dazu müsste man Hf-Kenntnisse haben und nicht bloss Legos 
zusammenstöpseln...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sapperlot W. schrieb:
> Ein Tokenring ist eine gute Wahl. Auch wenn die Nachricht 60 Hops
> dauert, kann man ja pipelinen, und alle senden ihren Status in dieser
> Globalmeldung.

 Das ist kein Funk, geht nur in einer Richtung, wird wohl nix mit 60.

A. K. schrieb:
> Wobei man bei einem einzigen CAN Bus mit 121 Nodes schon mal nachrechnen
> sollte, ob die Transceiver das überhaupt können.

 Genau.
 Deswegen CAN - 6 Netze a 20 Arduino Reader, welche von einem Master
 zyklisch abgefragt werden. Selbst wenn das mit nur 19200B passiert,
 braucht es nur etwa 1ms für Anfrage und Antwort (jeweils 1 Byt).
 TAG-ID + CRC (falls es etwas zu melden gibt) dauert weitere 3ms.
 Ergibt 4ms * 6 = 24ms wenn alle etwas zu melden haben.
 Also sind theoretisch mehr als 40Hz Abfragefrequenz möglich.

: Bearbeitet durch User
von Brummbär (Gast)


Lesenswert?

Frank L. schrieb:
> Ich bezweifele dass man so viele Reader rückwirkungsfrei auf so kleiner
> Fläche unterbringen kann.

Doch, das geht problemlos. Wird in großen Rechenzentren an den RJ45 
Patchfeldern gemacht. Jedes Patchkabel hat zwei RFID-Chips (pro Stecker 
einen). Am Patchfeld sind mehrere RFID-Reader verbaut, womit erkannt 
wird, welches Kabel wo steckt.

von Brummbär (Gast)


Lesenswert?

Alain Z. schrieb:
> Bei dem Projekt geht es um ein Konzept für eine Art Lagerverwaltung.
> Jedes Objekt hat ein RFID Chip zur Identifizierung und einen
> zugeordneten Lagerplatz.

Normalerweise macht man das mittels chaotischer Lagerhaltung. Der 
Lagerist stellt ein Paket einfach an einem beliebigen freien Ort uns 
teils dies dem Verwaltungssystem mit - natürlich muss dazu eine 
eindeutige Paketnummer und der Lagerort gescannt werden (das ginge auch 
per RFID). Das Verwaltungssystem "kennt" nun die Lagerorte jedes 
Paketes.
Hier darf natürlich niemand die Pakete umlagern ohne dem 
Verwaltungssystem bescheid zu geben.

von Marc (Gast)


Lesenswert?

Wenn wir schon bei CAN sind, wie wäre es mit nem bidirektionalen 
Eindrahtbus ala ISO 9141 ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.