Kommunikation zwischen Pi & µC

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,
    ich bin aktuell an einem Projektaufbau am arbeiten, bevor ich aber jetzt in die völlig falsche Richtung arbeite frage ich schonmal nach, später werde ich das Projekt (wenn's dann läuft) auch hier veröffentlichen, damit alle was davon haben.

    Ich möchte mehrere Mikrocontroller mit einer zentralen Einheit verbinden um dort etwas abzufragen. Aktuell sieht das ganze wie folgt aus:

    - 3x Arduino Uno
    - 1x Raspberry Pi

    Die 3 Arduinos stellen die Ausleseeinheit für RFID Tags, der Pi soll die zentrale Einheit des Systems werden. An jeder zu steuernden Tür hängt ein RFID Leser zusammen mit einem Arduino Uno. Dieser liest den Tag aus und speichert die benötigten Informationen in einer Variablen.
    Da für jede Tür die gleichen Tags gültig sein sollen und ich nicht bei jeder Änderung an jeden Arduino ran möchte, soll der Zugang über den Pi geregelt werden. Das heißt, die Arduinos sollen bei erfolgreichem lesen automatisch am Pi nachfragen ob diese ID eine Zutrittsberechtigung hat --> Der Pi soll dann nur Ja/Nein antworten und der Arduino soll entsprechend Türöffner bedienen oder eben nicht.

    Dazu dachte ich eine kleine Datenbank auf dem Pi anzulegen, worin die ganzen Informationen gespeichert sind. Diese sollen später von überall verändert werden können, also irgendwie mit Netzwerkanbindung über eine Eingabemaske, dass ist aber alles spätere Entwicklung und relativ einfach umgesetzt.

    Die Entfernung von den Arduinos zum Pi ist zwischen 5 und 15 Meter. Wie bekomme ich da jetzt eine stabile und möglichst schnelle Verbindung hin? Ich kenne mich mit den nutzbaren Übertragunssystemen garnicht aus, also CAN/i2c und was es da alles gibt...
    Wenn jemand mir zumindest sagen kann, welche Übertragung überhaupt geeignet ist würde ich mich schon sehr freuen, vielleicht hat ja jemand einen passenden Tutorial/Projektlink verfügbar ;)

    ---------------------------------------------------------------------------------

    Es ist auch möglich die Geräte zu ersetzen. Aktuell habe ich das alles hier, weil es eben in meinem Besitz ist, ich kann aber auch gerne auf andere Sachen umschwenken. Ich gehe davon aus, dass ein vollständiger Uno sowieso überdimensioniert ist, für eine fertige Lösung benötige ich doch fast nur einen einzelnen µC oder sehe ich das falsch? Desdo kleiner das ganze wird, desdo besser eigentlich, da nicht unendlich viel Platz vorhanden ist. Wenn jemand Erfahrung damit hat löte ich mir auch gerne eine kleine Sache zurecht oder kaufe andere Arduinos (vielleicht Arduino Nano???).

    Gruß
    JumpY

  • Hallo Jumpy,

    meiner Meinung nach müsste ein System genügen, also entweder ein Raspberry Pi oder ein Arduino.

    Das System fragt regelmäßig die RFID-Leseeinheiten ab. Wenn ein System mit einer Kennung antwortet, dann weiß das System, welche Tür dahintersteckt. Die Kennung muss dann nur mit den erlaubten Kennungen verglichen werden. Ob dazu nun eine Datenbank erforderlich ist, na ja, das musst Du wissen. Ich hätte es über eine verschlüsselte Textdatei gemacht. Ist die Kennung erlaubt, dann erhält der Türöffner einen Impuls - sonst nicht.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo,
    der Pi soll später auch noch weiter verwendet werden (so zumindest meine Überlegung dazu). Wenn ich diesen jetzt fertig installiere und eingebaut habe, lassen sich damit leicht andere Sachen umsetzen (Lichtsteuerung o.ä.). Natürlich könnte das auch ein Arduino an dieser Stelle übernehmen, wünsche mir aber eigentlich gerne den Pi dort.
    Du meinst also komplett anders herum, dass die "Haupteinheit" alle 3 Leseeinheiten abfragt und auf Reaktion wartet und nicht, dass die Leseeinheiten bei der Hauptstation einen abgleich machen? Gibt es dafür einen besonderen Grund, oder ist das vollkommen egal wie das passiert.

    Die "Datenbank" kann natürlich auch einfach eine Textdatei sein, zum testen sowieso. Geht nur darum, wie ich die Kommunikation umsetze, also Client fragt mit Kennung XY und Server prüft dies.

  • Ich gehe mal davon aus das du die Arduinos nicht über ein Kabel an den PI binden willst - also käme nur WLAN oder Funk in Frage und dann kann ich dir entweder ESP8266 oder RFM12B empfehlen :fies:
    Die Endgeräte (Arduino's) erkennst du dann anhand derer IP oder eben der NodeID

  • Ja das klappt für gewöhnlich auch problemlos - siehe 2.Link in meiner Signatur. Allerdings sind 15 Meter USB-Kabel sone Sache für Sich... Die Qualität der Kabel ist bei solchen Längen sehr wichtig, könnte aber auch passieren das es nicht funktioniert, zumindest nicht ohne aktiven USB-Hub. Aber genau wissen tu ichs nicht.

    Wie gesagt hätte ich jetzt eher vermutet das eine Kabellose Lösung angestrebt wird, die sind eigentlich auch sehr zuverlässig ;)

  • So, hier bin ich wieder:
    USB fällt weg, soweit ich mich erinner ist USB auch absolut nicht für diese Entfernungen geeignet. Ich möchte nochmal erwähnen, dass die Sache über Kabel laufen soll und die Kommunikation bei ~15m stabil und zügig laufen soll!

    I2C .. Das hatte ich auch so überall mal gelesen, konnte aber bislang nichts richtiges damit anfangen. Da ich mir (wie oben angesprochen) noch Arduinos & sonstiges bestellen muss, bitte auch dazu um kurze Einschätzung:

    - Müssen bei I2C die Arduinos durch einen Spannungswandler bearbeitet werden? Normalerweise läuft dort ja alles in 5V, der Pi aber auf 3,3V. Bei serieller Übertragung (TX/RX) muss das ja aufjedenfall begrenzt werden, sonst zerschießt man die Ports sofort. Wenn das bei I2C auch so ist (wovon ich ausgehe), gibt es alternative µC mit 3,3V oder aber wandel ich das einfach?
    - Wenn gewandelt wird: Werden alle 3 Arduinos am Input auf eine Schnittstelle für den Pi gelegt, also bräuchte ich nur einen Wandler von 5V auf 3,3V oder muss ich jedes Signal einzelnd wandeln, weil jedes auf einer anderen Schnittstelle am Pi liegt? Kenne mich mit I2C nicht aus wie das gehandhabt wird.
    - Ist die Leitungslänge (15m!!!) für I2C kein Problem?
    - Wie würde ich 3 Arduinos gleichzeitig anklemmen? Alle 3 Leitungen einfach zusammenführen am Pi eingang, oder muss ich da was bestimmtes machen. (In der Regel wird nur von einem ein Signal gesendet, wäre warscheinlich auch Müll wenn 2 gleichzeitig senden, oder würde das sogar gehen?)

    Da ich noch Sachen bestellen muss für eine Festinstallation, bitte da sagen wieviele Spannungswandler ich brauche. Dann würde ich mir auch 3 Nano Arduinos bestellen, die sind in der Wand deutlich besser zu verstecken. Sonst noch was, was ich unbedingt benötige für erste Tests?

    Gruß

  • Hallöle,

    -> hier <- kannst Du was zum Thema Arduino und Vernetzung über I2C nachlesen ...

    aaaber ... i2c :s ... eher nicht, fürchte ich ... 10/15 m ist imho zu viel.Du könntest das mal mit einem Leitungstreiber probieren.
    Alternativ sehe ich noch RS485 ( die USB-Adapter kriegst Du mittlerweile in der Bucht nachgeschmissen ) oder 1Wire ...

    cu,
    -ds-

  • Hallo,

    Mir fallen selber 2 Möglichkeiten ein:

    1. 1-Wire
    ich selber habe im Haus oneWire DS18B20 verteilt. Diese im Stern verschaltet, und habe ich Pegelwandler als "Repeater" verwendet um die Struktur auszugleichen. Geht wunderbar und läuft seit 2 Jahre stabil.
    Ich habe auf Arduino schon Librarys gesehen. Problem ist nur, das dann der Raspberry immer "pollen" müste, da dieser der Master wäre.

    2. RS485
    Andere möglichkeit ist es über RS485. Dazu habe ich auch stabil Quer durch Haus ein Stern Struktur System mit mehreren Arduino`s. Dazu brauchst du nur ein MAX485 und die Lib hier: Link
    Die library gibt es auch für Raspberry aber in C, hab ich selber aber nicht in Betrieb! ich habe in meinem Schaltschrank ein extra Arduino sitzen, welcher die "Mainstation" ist.
    Ich hatte mal Angefangen ein Python Programm für die ICSC Lib zu schreiben, aber noch nicht komplettiert. Am Raspi könntest du dann ein USB/RS485 Wandler benutzen: Link. Den Adapter hatte ich auch schonmal getestet am Raspi, und der ist als Com Schnitstelle ansprechbar.
    Vorteil des RS485 Buses ist ,dass jeder Teilnehmer senden kann, und so schnell eine Antwort bekommen könnte. Der RS485 Bus läuft bei mir auch schon ein halbes Jahr Problemlos mit einer Baudrate von 250 kB.

    Mfg
    Olli

  • Also die generelle Kommunikation mit einem Arduino und Pi per I2C funktioniert, habe gerade testweise ein ~20m Cat Kabel eingesteckt, da kommt allerdings nichtsmehr an... Ich werde das morgen nochmal testen, das war gerade nur gebastel könnte auch daran gelegen haben.
    Ich werde mir die verschiedenen Systeme mal durchlesen, gibt es dabei Geschwindigkeitsunterschiede? Wenn ich jetzt 3 dieser USB/RS485 Wandler nutze hätte ich nurnoch 1 USB Frei, falls da noch was erweitert wird, oder reicht ein Wandler und alle 3 Arduinos können über eine RS485 Leitung gehen? Kenne mich damit wie schon gesagt nicht sonderlich aus, ob das alles auseinander zu halten ist welcher Arduino da gerade anspricht.

  • Ja alle 2 Arduinos hängen an den selben 2 Stippen. Die Arduinos brauchen aber ein MAX485 Chip. Schau die mal in der ICSC Library im Wiki nach, da steht einige Infos über RS485.
    Also Einkaufsliste:
    - 1x USB/RS485 Wander am Raspi
    - 2x MAX485 für jeden Arduino einen. Könntest direkt den IC nehmen, oder so ein Modul. Achtung Links sind aus China, hast 3 Wochen Lieferzeit, aber der Preis macht es :)

    Dein I2C Buss Versuch kannst du dir meines erachten Sparen, wird auf die Distanz nicht Sicher genug Funktionieren! I2C is nur für Kurze Distanzen ausgelegt.


  • ... ein ~20m Cat Kabel eingesteckt, da kommt allerdings nichtsmehr an...
    ...


    das habe ich befürchtet.
    Möglicherweise schafft -> so ein Chip <- Abhilfe.
    Vielleicht ist auch -> hier <- was Passendes dabei ...
    Und -> hier <- ist was direkt von Philips zu dem Thema ...



    ...
    ... Systeme mal durchlesen, gibt es dabei Geschwindigkeitsunterschiede?
    ...

    Aba sischa ... ;) ... 1wire ist erfahrungsgemäß eher langsam (Dallas DS18B20).
    RS485 dagegen ist afaik relativ flott ...


    ...
    ... oder reicht ein Wandler und alle 3 Arduinos können über eine RS485 Leitung gehen?
    ..


    da reicht einer am Raspi und jeweils z.B. ein -> solches <- Modul pro Arduino ...


    ...
    ... ob das alles auseinander zu halten ist welcher Arduino da gerade anspricht.
    ...


    RS485 ist für einen "Master" uns bis zu 32 Slaves (Empfänger) ausgelegt.
    Näheres findest Du z.B. -> hier <- ...


    Ich hoffe, ich hab' jetzt nix vergessen :s

    cheers,
    -ds-

  • Was auch noch gehen würde, wäre UART bzw. RS232, dann müsstest du jeden Arduino mit dem PI verbinden, die USB-Kommunikation ist nur ein USB-UART Wandler, soweit ich weiß, man müsste wahrscheinlich Treiber integrieren, um die Daten über diese "lange" Strecke zu senden.
    Und ich würde bei Kabeln dieser länge relativ niedrige Baudraten/Frequenzen benutzen.

    MfG ProfDrFisch


    Ein "Gefällt mir" oder eine Bewertung wäre nett. :danke_ATDE:

    Support per [PM]

  • Hallo ProfDrFisch,


    ... wäre UART bzw. RS232, ...
    ...


    na ... da hab' ich meine Zweifel, dass das funktioniert. Eine RS232 Verbindung ist kein Bus und deshalb auch nicht für mehrere Slaves ausgelegt sondern ist typischerweise eine Punkt-zu-Punkt-Verbindung.
    Ich könnte jetzt allerdings gar nicht sagen, inwieweit sich die Schaltungen gegenseitig beeinflussen ...


    ... wahrscheinlich Treiber integrieren, um die Daten über diese "lange" Strecke zu senden.
    ...


    na mit einem Treiber könnte ja sogar i2c funktionieren ...

    cu,
    -ds-

  • Ich habe jetzt mit jemandem im Chat gesprochen, wenn ich alles richtig drin habe jetzt, gibts bei RS485 ja ebenfalls Probleme. Und zwar:
    Die Arduinos stellen ja zusammen mit der Ausleseeinheit die "Lesestation" dar. Dadurch wird z.B. ein 8 Stelliger Code ermittelt, der auf Wahr/Falsch geprüft werden soll. Jetzt hätte ich eigentlich gerne, dass der Arduino bei Bedarf dies am Pi abfragt, geht aber ja nicht, weil der Pi der Master ist und für die Frage zuständig.
    Möglich wäre es noch, dass der Master per Nachricht an alle 3 Slaves die Zutrittsberechtigten Codes sendet. Dies würde dann nur einmal passieren und bei jeder Änderung der Codes, wäre also umsetzbar.
    Jetzt habe ich aber ja noch folgende Probleme:
    Der User sagte mir, dass man nicht einfach 3 RS485 Leitungen zusammen in eine RS485 to USB Schnittstelle einpacken kann und das in den Pi stecken, bzw. müsste ich vorher ja die Spannung von 5V auf 3,3V Wandeln. Das mit der Umwandlung soll nicht so einfach gehen, da RS485 differetiell sei. (Weiß zwar nicht was das ist, aber scheint ein Problem zu sein).

    Ist das genau so, oder gibts da simple umzusetzende Sachen zu? Wenn ich die Methode mit den Codes pushen vom Master aus nur bei Änderung mache, bräuchte ich noch eine Möglichkeit um eine "Zutrittsausfzeichnung" zu machen. Ich möchte nämlich gerne jeden Zutrittsversuch mitschreiben, deswegen wäre mir die Anfrage von Arduino an Pi deutlich lieber aber das scheint ja nicht zu funktionieren??

    Wenn das nun wirklich alles nicht geht, vielleicht halt doch Ethernet. Kostet deutlich mehr für etwas was ich eigentlich ja garnicht so wirklich brauche, Zeit für 2 Monate auf China zu warten ist eigentlich nicht, da das ganze möglich zeitlich umgesetzt werden soll/muss.. Wäre es mit Ethernet einfacher umzusetzen oder stehe ich da nachher vor den gleichen Problemen?

    Ich hoffe ihr versteht was ich genau meine und könnt darauf nochmal eingehen.

    Vielen Dank nochmal! ;)

    EDIT: Wie ich jetzt nochmal gefragt habe, scheints zu gehen RS485 soll keine 5V auf der Leitung haben. Dementsprechend werde ich mir die Sachen zulegen und das auch mal testen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!