Schalten Sie ein benutzerdefiniertes Arduino zwischen kabelgebundener und drahtloser Verbindung um

Ich habe einen benutzerdefinierten 5-V-16-MHz-Arduino, auf dem grbl ausgeführt wird , und ich hatte gehofft, eines der HC-05-Bluetooth-Module verwenden zu können, um es drahtlos zu steuern. Dieser Arduino kann über einen FTDI-Chip an einen USB-Anschluss angeschlossen werden. Ich möchte, dass dies mit beiden funktioniert und nicht mit beiden. Dies funktioniert größtenteils und hier ist die 'Wahrheitstabelle', die ich erlebt habe:

USB  Bluetooth  Works over  Works over
ON   ON         USB?        Bluetooth?
---  ---------  ----------  ----------
Y    Y          N           Y
Y    N          Y           N
N    Y          N           Y

Ich vermute, wenn beide eingeschaltet sind, funktioniert der USB nicht, weil beide die gleichen RX- und TX-Leitungen des Arduino teilen und es scheint, dass der Bluetooth-Verbindung Priorität eingeräumt wird. Gibt es eine Möglichkeit, dass das Bluetooth-Modul nicht verwendet werden kann, wenn das USB-Kabel an den Host-PC angeschlossen ist, und der kabelgebundenen Verbindung Priorität eingeräumt wird?

Sie haben also ein "benutzerdefiniertes Arduino", und wir sollten für Sie raten, wie es gebaut wurde und welche Funktionen es hat und wie Sie darauf zugreifen können?
Es ist im Wesentlichen ein Arduino Uno R3-Klon, außer dass USB zu UART über einen FT232 FTDI-Chip und nicht über den atmega16u2 erfolgt (ich denke, es ähnelt eher dem Arduino Nano als dem Uno). Das Board kann über die RX-, TX- und DTR-Leitungen programmiert werden, die aus dem FTDI-Chip herauslaufen, und mit der Arduino IDE, wobei Uno als Programmierer ausgewählt ist. Die digitalen Ausgänge sind gemäß dem Konnektivitätsleitfaden von grbl in ihrem Wiki verbunden.
Die Arduino-Designs haben normalerweise einen Widerstand zwischen der USB-Serie und der MCU, damit etwas anderes Daten einspeisen kann; Sie scheinen das gegenteilige Verhalten zu wollen, was schwierig sein wird - Sie können den Widerstand nicht einfach auf das Bluetooth verschieben, es sei denn, Sie können die USB-Serie dazu bringen, ihre TX-Leitung zu tristate, wenn kein Host vorhanden ist - Sie müssen möglicherweise einen Multiplexer hinzufügen und Logik, um es zu kontrollieren.
Danke @Chris! Ich denke, ich könnte einen MOSFET-Schalter verwenden, so dass die Versorgung des Bluetooth-Moduls unterbrochen wird, wenn der USB-Anschluss angeschlossen ist. Es gibt sowieso weitere 5V an Bord, die den Atmega und die Motortreiberchips mit Strom versorgen. Möglicherweise so etwas - i.imgur.com/DdaJqfo.png
Das Ausschalten von Geräten ist normalerweise kein geeigneter Weg, um sie abzuwählen - die meisten modernen ICs haben Schutzdioden, die belastet werden, wenn ein I/O-Pin über den Versorgungspin angehoben wird. Wenn Sie diesen Weg trotzdem verfolgen, platzieren Sie zumindest einen Widerstand, um den Strom zu begrenzen. Es ist jedoch wahrscheinlich besser, einen tatsächlichen Multiplexer zu verwenden.

Antworten (3)

Nach den Vorschlägen von Chris ist hier eine Multiplexer-Lösung, die ich ausprobieren möchte. Wenn der USB abgezogen wird, sind die Auswahlleitungen niedrig und die Y0-Leitungen werden ausgewählt, was das BT-Modul ist. Wenn das USB-Kabel eingesteckt ist, gehen die Auswahlleitungen hoch und der FTDI-Chip wird ausgewählt. VBUS und 5V sind zwei separate 5V-Quellen. Nur der FTDI wird über den USB-Bus mit Strom versorgt.

HINZUGEFÜGT: Während ich dabei war, dachte ich, ich könnte das BT-Modul vollständig ausschalten und isolieren, wenn der USB-Anschluss angeschlossen ist. Verwendet ein p-Mosfet, das etwa 130 mA verarbeiten kann, was ausreichend ist, da das BT-Modul selbst nicht mehr als verbraucht 50mA.

Geben Sie hier die Bildbeschreibung ein

Möglicherweise müssen Sie die Sendeleitung des Arduino nicht umschalten, wenn es akzeptabel ist, dass beide Schnittstellen ihre Übertragungen empfangen. Da der DTR mit einem Kondensator zum Zurücksetzen gekoppelt ist, können Sie möglicherweise auch nur einen Kondensator für jeden verwenden, wenn Sie sicher sein können, dass der unbenutzte keine störenden Rücksetzübergänge verursacht. Aber das sind optionale Vereinfachungen - Sie können die Platine mit Schaltern entwerfen und optionale Bypass-Pfade um sie herum zum Experimentieren bereitstellen.
Lassen Sie mich jetzt mit diesem Setup experimentieren. Guter Punkt, dass der DTR über einen Kondensator mit Arduinos RESET verbunden ist. Ich habe vergessen zu erwähnen, dass der Kondensator auf der Arduino-Seite vorhanden ist und die Ausgänge des FTDI-DTR oder der BT-STATE-Multiplexer schließlich mit einer Seite dieser 01.u-Kappe verbunden sind. Nochmals vielen Dank für die Idee!
@electrophile könntest du bitte das Bild erneut hochladen?

Wenn das USB-Kabel an den Host-PC angeschlossen ist, sieht Ihr Port VBUS=5V. Wenn kein Kabel, VBUS=0V. Sie können dieses Signal in einen der GPIO einspeisen (bei richtiger Spannungsübersetzung sollte der Widerstandsteiler in Ordnung sein) und das Logiksignal verwenden, um zwischen USB und BT umzuschalten (BT ausschalten).

Und wie schlagen Sie vor, "BT auszuschalten"?
Ich weiß nicht. Das OP präsentierte eine Tabelle, die den Eindruck erweckte, dass er anscheinend eine unabhängige Kontrolle für beide Schnittstellen als EIN oder AUS hat. Vielleicht mit einem anderen GPIO, um das BT-Modul zu deaktivieren?
Was OP präsentierte, ist eine Tabelle ihrer Erfahrungen, die anscheinend durch den Widerstand im Standard-Arduino-Design verursacht wurde und ihren Wünschen widerspricht.

Es gibt auch eine Option, wenn Sie zwei UART in Arduino verwenden möchten, es gibt Unterstützung von Softwareserial (), die Ihnen hilft, einen zweiten UART zu erstellen. dann können Sie sowohl USB als auch Bluetooth in einer einzigen Zeit und auf einfache Weise ohne Änderungen an der Hardware verwenden. Bitte lesen Sie, wie Sie die Softwareserial()-Bibliothek verwenden und welche Pins unterstützt werden.

Ich glaube, ich habe erwähnt, dass das Board grbl ausführt, das über Arduino RX und RX verbunden ist. Außerdem sprechen sowohl der FT232 als auch Bluetooth schließlich mit einem Programm, das grbl ist. Zwei offene serielle Kommunikationsmethoden zu haben, die gleichzeitig betrieben werden können, wäre katastrophal. Das bedeutet auch, dass ich den Grbl-Code selbst optimieren muss, was ich überhaupt nicht will.