Ich habe versucht, mit einem Arduino Nano einen seriellen Open-Drain-Ausgang zu implementieren. Im folgenden Beispiel habe ich 2 Arduino Nanos (beide mit 5 V Vcc) verwendet, wobei ein Arduino als Sender und der andere als Empfänger verwendet wurde.
Der Sender ist so programmiert, dass er die folgende Reihe von Bytes sendet:
fe fe 68 60 39 12 11 81 16 68 c1 1 35 1a 16 fe fe
Vom Empfänger wird natürlich erwartet, dass er dasselbe erhält. Aber stattdessen scheint der Empfänger Folgendes zu empfangen:
0 0 9 2 63 3b 77 3f 3a 9 1f 7f 65 39 3a 0 0
Das Folgende ist die Schaltung, die ich als Schnittstelle zwischen den beiden Arduinos verwende:
Ich entschuldige mich, wenn die Terminologie, die ich hier verwendet habe, nicht ganz korrekt ist, da ich nur ein Anfänger auf dem Gebiet bin. Übersehe ich etwas in der Schaltung? Ist der N-Kanal-MOSFET, den ich hier verwende, für diese Anwendung geeignet? Jeder Einblick wäre sehr dankbar, danke im Voraus.
Dies wird auf verschiedene Weise durcheinander gebracht:
Zunächst einmal: Warum willst du den MOSFET dort verwenden?
Und welchen Nutzen soll R1 haben?
Zweite:
Durch die Verwendung eines einzelnen MOSFET wird der Ausgang des ICs invertiert. Wenn der IC also einen hohen Pegel am Tx-Pin ausgibt, erhalten Sie einen niedrigen Pegel am Rx-Pin und umgekehrt!
Ich habe nur die Wellenform von fe fe 68
und die Wellenform von überprüft 00 00 09
. Unter der Annahme einiger Zeitparameter (Zeit zwischen zwei Bytes) ist eine der beiden Wellenformen genau die Umkehrung der anderen Wellenform.
Wenn also der Tx-Pin beim Senden hoch ist, fe fe 68
ist er beim Senden niedrig 00 00 09
, und wenn er für die erste Sequenz niedrig ist, ist er für die zweite Sequenz hoch.
Das ist also der Grund, warum Sie nicht das erhalten, was Sie erwarten: Der MOSFET fungiert als NICHT-Gatter.
Hinweis: Ich gehe davon aus, dass Ihr Ziel bei der Open-Drain-Suche darin besteht, schließlich eine Vielzahl von Arduino-Senderknoten mit einem einzigen Empfänger zu verbinden.
Die übliche serielle Klasse des Arduino verwendet den Hardware-UART und ist im Leerlauf hoch (und ist natürlich ein Push-Pull-Ausgang). Der Chipdesigner erwartet, dass Sie einen invertierenden RS232-Treiber und einen invertierenden RS232-Empfänger verwenden.
Wenn Sie also ein „oder“ erstellen möchten, das zwei Sender und einen Empfänger zulässt, können Sie entweder zweimal mit einem Paar PNP-BJTs oder p-Kanal-MOSFETs am Sender (mit einem Pulldown-Widerstand) und einem Inverter am Empfänger invertieren , oder Sie können Dioden wie die unten gezeigte mit einem Pull-up-Widerstand verwenden:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Denken Sie daran, dass RS232-Treiber und -Empfänger mit Pegeln, Impedanzen und Schutz für einen robusten Betrieb mit langen Kabeln entwickelt wurden, und wenn Sie so etwas mit CMOS-Eingängen/Ausgängen versuchen, werden Sie sich allen möglichen Problemen öffnen.
Die bevorzugte Lösung in diesem Fall wäre meiner Meinung nach die Verwendung von RS485-Treibern und -Empfängern mit einem ordnungsgemäß terminierten Twisted Pair (plus gemeinsamer Masse) und die Aktivierung nur des aktiven Senders. Sie würden einen zusätzlichen GPIO verwenden, um den aktiven Sender zu aktivieren.
Wie auch immer, das wäre der Weg, es zu tun, wie Sie dachten:
Simulieren Sie diese Schaltung
Schließlich können Sie möglicherweise die SoftwareSerial-Klasse ändern, um das DDR-Bit anstelle des Ausgangs zu verändern und Open Drain direkt mit dem AtMega-Ausgang zu simulieren (wobei nur ein Widerstand und keine Transistoren erforderlich sind), dies ist jedoch mehr Arbeit und hat andere Nachteile (z Mangel an Geschwindigkeit) über die Verwendung der bereitgestellten Hardware auf dem Chip.
JimmyB