Eindrahtige serielle Zwei-Wege-Kommunikation - Hardwarekonfiguration

Ich habe mehrere Servos, die Feedback-Daten geben können, die ich lesen möchte. Die Servos verwenden ein spezielles Protokoll, daher muss ich den Rx / Tx-Pin auf meinem Arduino Mega verwenden, um mit ihnen zu kommunizieren. Das Problem ist, dass ein Servo nur einen seriellen Kommunikationsstift hat, sodass ich die übliche Rx/Tx-Verkabelung nicht verwenden kann.

Ich habe gehört, dass es einige Hardwarekonfigurationen gibt, um UART-Signale ordnungsgemäß in Halbduplex-Typen umzuwandeln. Einer besteht darin, 2 Widerstände zu verwenden, die mit Rx und Tx von Arduino und dem Pin des Servos verbunden sind. Eine andere besteht darin, einen Transistor zu verwenden. Ich konnte jedoch keine genauen Schaltpläne und Regeln finden, um die Werte für die Widerstände oder den Transistor zu wählen. Kann jemand weitere Informationen dazu liefern und in Bezug auf die Hardware genau erklären, wie diese Konfigurationen verhindern, dass das Tx auf den Rx und das Servo-Feedback auf den Tx schreibt.

BEARBEITEN: Das Servo ist Dynamixel XL-320 ( http://support.robotis.com/en/product/dynamixel/xl-320/xl-320.htm ). Die Kommunikation ist halbduplex seriell: Ich kann auf das Servo schreiben, aber ich kann auch Werte lesen, zB laden (daher muss ich sowohl Rx- als auch Tx-Pins auf meinem Arduino verwenden). HINWEIS: Das Servo-Handbuch schlägt vor, einen Multiplexer und einen digitalen Pin auf dem Arduino als Auswahlbit zu verwenden, um uart auf Halbduplex umzuwandeln. Ich bitte jedoch ausdrücklich um andere, passivere Alternativen.

Was ist ein „Sonderprotokoll“? Ist es halbduplex seriell? Oder ist es nur ein Weg? Wenn letzteres, warum brauchen Sie Zweiwege?
Oder verwendet es die "One-Wire"-Schnittstelle ( en.wikipedia.org/wiki/1-Wire )? Wie wäre es mit einer Teilenummer und einem Datenblatt-Link für Ihr Servo?
Gib uns ein paar mehr Informationen zu deinen Servos Niko
EDIT: Das Servo ist Dynamixel XL-320 support.robotis.com/en/product/dynamixel/xl-320/xl-320.htm . Die Kommunikation ist halbduplex seriell: Ich kann auf das Servo schreiben, aber ich kann auch Werte lesen, zB laden (daher muss ich sowohl Rx- als auch Tx-Pins auf meinem Arduino verwenden). HINWEIS: Das Servo-Handbuch schlägt vor, einen Multiplexer und einen digitalen Pin auf dem Arduino als Auswahlbit zu verwenden, um uart auf Halbduplex umzuwandeln. Ich frage jedoch ausdrücklich nach anderen, passiveren Methoden.

Antworten (2)

Sie sagen, Sie möchten ein Arduino Mega verwenden, das über eine ATmega1280-MCU verfügt.

Auf ATmega1280 (und ATmega im Allgemeinen meistens) setzen UART Tx/Rx-Einheiten den normalen Portbetrieb außer Kraft. Sobald die Tx-Einheit eingeschaltet ist, können Sie den Tx-Pin nicht auf Hi-Z (Tri-State) setzen, es sei denn, Sie deaktivieren zuerst die Tx-Einheit.

Das Timing sollte nicht so kritisch sein, da die Baudraten maximal 1 Mbit / s betragen, während der ATmega1280 mit 16 MHz läuft, vorausgesetzt, CKDIV8 ist nicht programmiert.

Theoretisch solltest du also Zeit zum Wechseln haben. Wenn ihr Ersatzschaltbild jedoch ein Hinweis darauf ist, treiben sie tatsächlich die Tx-Leitung an, sodass Sie möglicherweise einen Kurzschluss erzeugen, wenn etwas schief geht, dh entweder Ihr Code zu lange braucht, um die Tx-Einheit zu deaktivieren, oder Sie schreiben, während das Dynamixel antwortet.

Es ist eigentlich nicht klar, ob der Dynamixel tatsächlich die Tx-Leitung antreibt oder nicht (auf dem Schaltbild steht CM-5, das ist ein Master-Controller, kein Slave).

Ich schlage vor, dass Sie nicht mit dem Deaktivieren / Aktivieren der Tx-Einheit im ATmega1280 herumspielen, da Sie mehr codieren und möglicherweise Interrupts berücksichtigen müssen. Setzen Sie stattdessen einen Widerstand wie folgt zwischen die Tx- und Rx-Leitungen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

A) Unter der Annahme, dass die Dynamixels einen internen Pull-up-Widerstand Rpu = 10 kΩ haben und unter der Annahme einer maximalen Eingangsspannung für eine logische '0' Vil_max = 0,8 V (nur um sicherzugehen), benötigen wir den folgenden Widerstandswert Rx, um einen ' 0': Ohmsches Gesetz

   5V * Rx / (Rx + 10kΩ) <= 0.8V
->                    Rx <= 1.9

B) Angenommen, die Dynamixels haben keinen internen Pull-up, verwenden Sie einfach Rx = 10kΩ..100kΩ. Ihre Tx-Einheit steuert im Bus-Leerlauf eine '1', wodurch der Bus bequem auf 5 V hochgezogen wird, wenn Ihre Zustandsmaschinenlogik erwartet, dass der Dynamixel antwortet.

In jedem Fall verhindert der Widerstand Kurzschlüsse, falls der Dynamixel und Ihr Controller gleichzeitig betrieben werden. Es fungiert auch als Pull-up für Ihre eigene Rx-Einheit, sodass Sie keine falschen Dateneingaben erhalten, wenn der Dynamixel nicht angeschlossen ist.

Ich schlage vor, Sie verwenden ein Multimeter, um festzustellen, in welchen der beiden Fälle Ihre Anwendung fällt. Beginnen Sie im Zweifelsfall mit 1,8 kΩ und sehen Sie nach, ob Ihr Code funktioniert. Fahren Sie dann mit 100 kΩ fort. Wenn Ihr Code fehlschlägt, können Sie sicher sein, dass sie eine interne Rpu verwenden, bleiben Sie also bei 1,8 kΩ. Wenn alles mit 100kΩ funktioniert, dann, naja... es funktioniert.

Das war wirklich informativ, danke FRob. Ich werde es heute versuchen.
Hallo FRob, ich habe mich gefragt, ob Sie einen Vorschlag haben, wie man vermeiden kann, dass tx auf rx schreibt?
Hallo. Hat meine Antwort für Sie funktioniert? Dann akzeptiere bitte. Ich würde empfehlen, dass Sie tx in Ihrer rd-Logik nicht ignorieren. Verwenden Sie stattdessen die tx-Nachricht, um zu überprüfen, ob Ihre tx-Operation funktioniert.
Ja, es funktioniert mit jedem von Ihnen vorgeschlagenen Widerstandswert. Sollte der tx-Betrieb nicht trotzdem funktionieren? Ich nehme an, ich kann auch einen Widerstand an rx anschließen, um zu vermeiden, dass Arduino an sich selbst schreibt, bin mir aber nicht sicher, wie ich den Wert wählen soll.
@niko Ich fürchte, das kannst du nicht. Sie kommen nur an einen Punkt, an dem Sie auf diese Weise nichts mehr empfangen können. Sie müssen in Software filtern, was nicht so schwer sein sollte.
Ja, ich habe den Filter bereits in der Software. Vielen Dank für die Hilfe!

Da das Servo eine Multidrop-Halbduplex-Verbindung auf TTL-Ebene verwendet, müssen Sie entweder Ihren TX-Pin über einen Tri-State-Puffer mit dem Bus verbinden oder ihn programmgesteuert als Eingangsrichtung einstellen, wenn er nicht sendet. Der RX kann ständig mit dem Bus verbunden sein, aber in diesem Fall müssen Sie die selbst gesendeten Pakete ignorieren, da sie zurückgemeldet werden. Ich würde ein ähnliches Setup empfehlen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Vielen Dank Eugene Sh. Ich bin wirklich neu auf diesem Gebiet, also verzeihen Sie mir bitte meine Inkompetenz. Was ist das anfängliche Problem mit dem TX-Pin? Wenn es als Ausgang des Arduino konfiguriert ist, würde das nicht alle eingehenden Daten ignorieren? Was genau bedeutet das Echo eines Pakets über den RX-Pin?
Tx zieht die Leitung hoch, wenn nicht gesendet wird, so dass es jede andere Übertragung stört, also müssen Sie es zu diesem Zeitpunkt trennen. Mit Echo meine ich, dass, wenn Sie tx mit rx verbinden, es schließlich die eigenen Sende-s empfängt