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.
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:
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.9kΩ
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.
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:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Eugen Sch.
DoxyLover
Arjun
Niko