Ich möchte mit der Implementierung eines Systems aus N Mikrocontrollern (N> = 2 MCUs) beginnen, möchte aber die Möglichkeiten kennen, mit denen sie miteinander kommunizieren können.
Im Idealfall werden (N-1) Mikrocontroller als Clients im Haus platziert, während der letzte (der "Server") über USB mit einem PC verbunden ist. Die Probleme, die ich momentan habe, sind, wie man diese (N-1) Mikrocontroller an den "Server" anschließt. Die Client-MCUs führen sehr einfache Aufgaben aus. Daher ist es möglicherweise keine gute Lösung, ARMs für solche einfachen Aufgaben zu verwenden, nur weil sie CAN / PHY-MAC bereitstellen .
Die Kommunikation wird bei den meisten Geräten nur einmal alle paar Minuten und bei Bedarf bei anderen Geräten stattfinden. Die Geschwindigkeit ist nicht sehr kritisch (Meldung ist kurz): 1 Mbit / s halte ich für WEG für übertrieben.
Die von mir geplanten MCUs sind die folgenden.
- Atmel AVR Tiny / Mega
- TI MSP430
- ARM Cortex M3 / M4
- (Möglicherweise Atmel AVR UC3 - 32-Bit)
Ich möchte PICs vermeiden nach Möglichkeit (persönliche Wahl), einfach weil es weniger Möglichkeiten gibt, sie zu programmieren (alle oben genannten haben mehr oder weniger Open-Source-Tools sowie einige offizielle Tools).
Ich weiß, dass einige ARMs CAN- Funktionalität bieten und bin mir bei den anderen nicht so sicher.
Im Moment habe ich mir folgende Möglichkeiten ausgedacht:
- Einfaches GPIO zum Senden von Daten (sagen wir> 16 Bits bei HIGH, um den Beginn der Nachricht anzuzeigen,> 16 Bits bei LOW, um das Ende der Nachricht anzuzeigen). Es muss sich jedoch um eine Standardfrequenz << (frequency_client, frequency_server) handeln, um alle Bits erkennen zu können. Benötigen Sie nur ein Kabel pro Client-MCU.
- RS-232 : Ich denke, dies ist das bei weitem am häufigsten verwendete Kommunikationsprotokoll, aber ich weiß nicht, wie gut es skaliert. Ich erwäge derzeit bis zu 64 Client-MCUs (wahrscheinlich später mehr)
- USB: AFAIK, das ist meistens wie RS-232, aber ich denke nicht, dass es in diesem Fall sehr gut skaliert (obwohl USB viele Geräte unterstützt - 255, wenn ich mich richtig erinnere - kann es für diese Anwendung zu kompliziert sein)
- RJ45 / Ethernet: Das würde ich sehr gerne nutzen, denn es ermöglicht die problemlose Übertragung über große Entfernungen (zumindest mit geschirmtem> Cat 6- Kabel). Das Problem sind die Kosten (PHY, MAC, Transformator, ...). Ich weiß aber nicht, ob man es zu Hause wirklich gut löten kann. Auf diese Weise würde ich keine Client-MCU benötigen
- Wireless / ZigBee : Module sind sehr teuer, obwohl es der richtige Weg ist, um "Spaghetti" hinter dem Schreibtisch zu vermeiden
- HF-Module / Transceiver: Ich spreche von denen im 300-MHz-1-GHz-Band, daher sollten sie zu Hause schwierig zu löten sein. Die Module sind alle eingebaut, aber sie sind ziemlich teuer wie das ZigBee (zumindest die RF-Module bei Mouser, bei Sparkfun scheinen es billigere zu sein).
- KÖNNEN? Es scheint sehr robust zu sein. Auch wenn ich nicht vorhabe, es in Automobilanwendungen zu verwenden, kann es dennoch eine gute Alternative sein.
- I²C / SPI / UART ? Nochmals - besser "Spaghetti" mit den Kabeln vermeiden, wenn möglich
- SPS sind eigentlich keine Option. Die Leistung nimmt mit zunehmender Länge ziemlich schnell ab und hängt von der Kapazitätsbelastung des Stromnetzes ab. Ich denke, preislich ist das ungefähr dasselbe wie Ethernet.
Welches Protokoll wäre außerdem bei gleichzeitiger Übertragung "besser" (nehmen wir den seltenen Fall an, dass zwei Geräte gleichzeitig mit der Übertragung beginnen: Welches Protokoll bietet das beste "Konfliktmanagementsystem" / "Kollisionsmanagementsystem"?
Etwas zusammenfassen : Ich würde gerne hören, welche Lösung für ein verteiltes Client-System, das eine sehr leichte Datenkommunikation bietet, die beste ist, wenn man sowohl die Flexibilität (maximale Anzahl von Geräten, Konflikt- / Kollisionsmanagementsystem, ...) als auch den Preis berücksichtigt , einfach zu Hause zu machen (löten), ... Ich möchte vermeiden, 20 $ nur für das Kommunikationsmodul auszugeben, aber gleichzeitig 30 Drähte hinter dem Schreibtisch zu haben, wäre zum Kotzen.
Die Lösung, die ich mir gerade vorstelle, wäre die einfache Kommunikation zwischen Near-MCUs über GPIO oder RS-232 ( billig !) Und die Verwendung von Ethernet / ZigBee / Wi-Fi auf einer MCU pro "Zone" für die Kommunikation mit dem Server ( teuer !) , aber es ist immer noch viel billiger als ein Ethernet-Modul pro Client-MCU).
Anstelle von Kabeln können auch Lichtwellenleiter / Lichtwellenleiter verwendet werden. Es sind jedoch zusätzliche Konvertierungen erforderlich, und ich bin nicht sicher, ob dies in diesem Fall die beste Lösung ist. Ich würde gerne weitere Details darüber erfahren.
quelle
Antworten:
CAN klingt in diesem Fall am besten. Die Entfernungen innerhalb eines Hauses können per CAN mit 500 kbit / s bewältigt werden, was nach einer ausreichenden Bandbreite für Ihre Bedürfnisse klingt. Der letzte Knoten kann eine handelsübliche USB-CAN-Schnittstelle sein. Auf diese Weise kann die Software auf dem Computer CAN-Nachrichten senden und alle Nachrichten auf dem Bus anzeigen. Der Rest ist Software, wenn Sie dies der Außenwelt als TCP-Server oder so etwas präsentieren möchten.
CAN ist das einzige Kommunikationsmittel, von dem Sie gesprochen haben, dass es sich tatsächlich um einen Bus handelt. Alle anderen sind Punkt zu Punkt, einschließlich Ethernet. Ethernet kann logisch wie ein Bus mit Switches aussehen, einzelne Verbindungen sind jedoch immer noch Punkt-zu-Punkt-Verbindungen, und das Abrufen der logischen Bustopologie ist teuer. Der Firmware-Overhead auf jedem Prozessor ist ebenfalls erheblich höher als bei CAN.
Das Schöne an CAN ist, dass die wenigsten Protokollschichten in der Hardware behandelt werden. Beispielsweise können mehrere Knoten versuchen, gleichzeitig zu senden, aber die Hardware kümmert sich um die Erkennung und den Umgang mit Kollisionen. Die Hardware übernimmt das Senden und Empfangen ganzer Pakete, einschließlich der Generierung und Validierung von CRC-Prüfsummen.
Ihre Gründe für die Vermeidung von PICs ergeben keinen Sinn. Es gibt viele Entwürfe für Programmierer, mit denen Sie Ihre eigenen erstellen können. Eines davon ist mein LProg . Das Schema finden Sie unten auf dieser Seite. Der Bau Ihrer eigenen ist jedoch nur dann kosteneffektiv, wenn Sie Ihre Zeit auf ein paar Cent pro Stunde festlegen. Es geht auch um mehr als nur den Programmierer. Sie benötigen etwas, das beim Debuggen hilft. Die Microchip PicKit 2 oder 3 sind sehr kostengünstige Programmierer und Debugger. Obwohl ich keine persönlichen Erfahrungen mit ihnen habe, höre ich von anderen, die sie routinemäßig benutzen.
Hinzugefügt:
Ich sehe einige Empfehlungen für RS-485, aber das ist keine gute Idee im Vergleich zu CAN. RS-485 ist ein rein elektrischer Standard. Es handelt sich um einen Differenzialbus, der mehrere Knoten zulässt und eine gute Störfestigkeit aufweist. Aber CAN hat all das und noch viel mehr. CAN wird üblicherweise auch als Differentialbus ausgeführt. Einige argumentieren, dass RS-485 einfach elektrisch anzuschließen ist. Das stimmt, aber CAN auch. So oder so macht es ein einzelner Chip. Bei CAN ist der MCP2551 ein gutes Beispiel.
CAN und RS-485 haben also elektrisch fast die gleichen Vorteile. Der große Vorteil von CAN liegt darüber. Bei RS-485 befindet sich nichts über dieser Schicht. Du bist allein. Es ist möglich, ein Protokoll zu entwerfen, das sich mit Busarbitrierung, Paketüberprüfung, Zeitüberschreitungen, Wiederholungsversuchen usw. befasst. Tatsächlich ist es jedoch viel schwieriger, dies zu erreichen, als die meisten Menschen erkennen.
Das CAN-Protokoll definiert Pakete, Prüfsummen, Kollisionsbehandlung, Wiederholungsversuche usw. Es ist nicht nur bereits vorhanden und durchdacht und getestet, sondern der große Vorteil besteht darin, dass es auf vielen Mikrocontrollern direkt in Silizium implementiert ist. Die Firmware ist auf der Ebene des Sendens und Empfangens von Paketen mit dem CAN-Peripheriegerät verbunden. Zum Senden führt die Hardware die Kollisionserkennung, das Backoff, den Neuversuch und die CRC-Prüfsummengenerierung durch. Zum Empfangen werden die Paketerkennung, die Taktversatzanpassung und die CRC-Prüfsummenvalidierung durchgeführt. Ja, das CAN-Peripheriegerät benötigt mehr Firmware als ein UART, wie er häufig mit RS-485 verwendet wird. Insgesamt wird jedoch viel weniger Code benötigt, da das Silizium so viele Protokolldetails auf niedriger Ebene verarbeitet.
Kurz gesagt, RS-485 ist aus einer vergangenen Ära und macht für neue Systeme heutzutage wenig Sinn. Das Hauptproblem scheinen Leute zu sein, die in der Vergangenheit RS-485 verwendet haben, sich daran festzuhalten und der Meinung sind, CAN sei irgendwie "kompliziert". Das niedrige CAN-Niveau ist kompliziert, ebenso wie jede kompetente RS-485-Implementierung. Beachten Sie, dass einige bekannte Protokolle auf Basis von RS-485 durch neuere Versionen auf Basis von CAN ersetzt wurden. NMEA2000 ist ein Beispiel für einen solchen neueren CAN-basierten Standard. Es gibt einen weiteren Automobilstandard J-J1708 (basierend auf RS-485), der mit dem CAN-basierten OBD-II und J-1939 mittlerweile ziemlich veraltet ist.
quelle
Ich würde Controller mit CAN empfehlen, da diese Funktion genau für die Controller-Vernetzung gedacht ist.
RS232 kann leicht implementiert werden, aber es wird eine echte Herausforderung, wenn Sie versuchen, eine Kommunikation mit mehr als 2 Knoten zu implementieren (weil sie nicht für diesen Zweck erstellt wurde).
Ethernet kann auch eine nette Option sein, da Sie einige Host- und Client-Verbindungen erwähnt haben, die für die Ethernet-Implementierung selbstverständlich sind.
quelle
RS-485 mit mehreren Kabeln könnte hier gut funktionieren, wenn die Möglichkeit besteht, dieselbe Leitung mit allen Geräten zu verbinden.
Wenn es zum Beispiel mit einem herkömmlichen Netzwerkkabel der Kategorie 5e verwendet wird, können Sie zwei Paare für die Datenübertragung in beide Richtungen verwenden (mit einem Vollduplexmodul), ein Paar oder sogar einen einzelnen Draht als gemeinsame Masse verwenden und den Rest aushandeln welches Gerät wird in welchem Moment senden. Es ist etwas komplizierter als RS-232, aber die Module sind billiger als CAN und Ethernet und die Kabelbegrenzung beträgt 1200 m. Der Nachteil ist, dass Sie Ihr eigenes Konfliktlösungsprotokoll erstellen müssen. Lassen Sie das Gerät, das senden möchte, möglicherweise ein bestimmtes Kabel überprüfen und prüfen, ob es hoch ist. Wenn dies nicht der Fall ist, bringen Sie es in die Höhe und beginnen Sie mit der Kommunikation. Wenn dies der Fall ist, warten Sie auf eine zufällige Zeitspanne. Trotzdem bin ich mir nicht sicher, wie gut das auf langen Strecken funktionieren würde.
quelle
Ich würde einen RS-485-Bus wählen, der mit Manchester Encoding arbeitet Daten arbeitet.
RS-485 weil:
Manchester-Codierung, weil:
Aus Gründen der Datenintegrität kann die Nachricht eine Länge und ein CRC-Feld enthalten.
Beispiel einer CRC-Funktion:
CRC_INIT
undCRC_POLY
sind beliebige Werte, die zur Berechnung der CRC verwendet werden.Beispiel einer Nachricht mit Längen- und CRC-Feldern:
quelle
Lassen Sie mich Ihre bevorzugte Wahl, Ethernet, mit meiner bevorzugten Wahl, CAN, vergleichen.
Erforderliche Komponenten:
Sie sprechen von Mikrocontrollern für 1 USD. Der Bus kostet viel mehr als die MCU. Sie müssen die Gesamtkosten jeder Lösung addieren, um zu wissen, welche Lösung tatsächlich billiger ist. Addieren Sie die Kosten für MCU, Steckverbinder, Transceiver, passive Komponenten, PCB, Kabel usw.
quelle
In LPC11C24 von NXP ist auch der CAN-Transceiver integriert, und CANOpen wird im ROM unterstützt (wodurch Ihr 32-K-Daten-Flash nicht zerstört wird). Die LPCXpresso 11c24-Karte kostet 20 EUR (hat Platz für den DB9-Anschluss bereitgestellt), sodass Sie wirklich nur Kabel hinzufügen müssen :-)
quelle
Repost von einer anderen ähnlichen Frage. Kostengünstige einfache Kommunikation zwischen zwei Mikrocontrollern
TLDR : Nicht besonders billig, aber in einigen Anwendungsfällen zuverlässig.
Wenn ich über den Tellerrand hinausschaue, könnte es hier einige andere Lösungen geben, wie zum Beispiel den folgenden Chip, auf den ich in letzter Zeit gestoßen bin. Natürlich hängt alles davon ab, was Sie tun möchten. So etwas wie UART fällt Ihnen ein, wenn Sie beide MCUs auf der gleichen Platine haben oder sogar vorhaben, sie manuell gegen elektrostatische Entladungen zu schützen, wenn sie getrennt werden.
Master- und Device-Lösung für IO-Link-Anwendungen
Wann würden Sie eine Lösung wie diese in Betracht ziehen:
Vcc(in) 7~30v, Vdd(out) 3.3/5v
Es klang interessant für mich, also dachte ich, ich werde es da rausbringen.
quelle
Dies hängt vom Umfang Ihrer Anwendung und Ihrer Mikrocontroller ab. Du hast Atmel winzig / mega erwähnt, sie sind ziemlich klein. In ihrem Fall haben I2C / SPI / UART den Vorteil, dass sie in Hardware implementiert sind und somit einfach zu bedienen sind.
quelle