Cambiar un Arduino personalizado entre conexión por cable e inalámbrica

Tengo un Arduino personalizado de 5 V y 16 MHz que ejecuta grbl y esperaba usar uno de los módulos bluetooth HC-05 para controlarlo de forma inalámbrica. Este Arduino se puede conectar a un puerto USB a través de un chip FTDI. Me gustaría que esto funcione con cualquiera de ellos y no con ambos. Esto funciona en su mayor parte y aquí está la 'tabla de verdad' que he experimentado:

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

Supongo que cuando ambos están encendidos, el USB no funciona porque ambos comparten las mismas líneas RX y TX del Arduino y parece que se le está dando prioridad a la conexión bluetooth. ¿Hay alguna manera de que cuando el cable USB esté conectado a la PC host, el módulo bluetooth no se pueda usar y se le dé prioridad a la conexión por cable?

Entonces, tiene un "arduino personalizado", y deberíamos adivinar cómo se construyó y qué características tiene y cómo acceder a ellas.
Es un clon de Arduino Uno R3 esencialmente, excepto que ese USB a UART se realiza a través de un chip FT232 FTDI en lugar de atmega16u2 (supongo que se parece más al Arduino Nano que al Uno). La placa se puede programar a través de las líneas RX, TX y DTR sin el chip FTDI y utilizando el IDE de Arduino con Uno seleccionado como programador. Las salidas digitales están conectadas según la guía de conectividad de grbl mencionada en su wiki.
Los diseños de Arduino suelen tener una resistencia entre la serie USB y la MCU para permitir que algo más ingrese datos; parece que desea el comportamiento opuesto, lo cual será difícil: no puede simplemente mover la resistencia al bluetooth a menos que pueda hacer que la serie USB tristate su línea TX cuando no hay un host; es posible que termine teniendo que agregar un multiplexor y la lógica para controlarlo.
¡Gracias @Chris! Estoy pensando que podría usar un interruptor MOSFET de modo que cuando el USB esté conectado, se corte el suministro al módulo Bluetooth. De todos modos, hay otro 5V a bordo que alimenta el atmega y los chips del controlador del motor. Posiblemente algo como esto: i.imgur.com/DdaJqfo.png
La desconexión de los dispositivos no suele ser una forma adecuada de anular su selección: la mayoría de los circuitos integrados modernos tienen diodos de protección que se estresan si un pin de E/S se eleva por encima del pin de suministro. Si va a seguir ese camino de todos modos, al menos coloque una resistencia para limitar la corriente. Sin embargo, probablemente sea mejor usar un multiplexor real.

Respuestas (3)

Siguiendo las sugerencias de Chris, aquí hay una solución de multiplexor que tengo la intención de probar. Cuando se desconecta el USB, las líneas de selección son bajas y se seleccionan las líneas Y0, que es el módulo BT. Cuando se conecta el cable USB, las líneas de selección aumentan y se selecciona el chip FTDI. VBUS y 5V son dos fuentes separadas de 5V. Solo el FTDI se alimenta desde el bus USB.

AGREGADO: Mientras estaba en eso, pensé que podía apagar y aislar el módulo BT por completo cuando el USB está enchufado. Usé un p-mosfet que puede manejar alrededor de 130 mA, lo cual es suficiente ya que el módulo BT en sí mismo no consume más de 50 mA.

ingrese la descripción de la imagen aquí

Es posible que no necesite cambiar la línea de transmisión de Arduino si es aceptable que ambas interfaces reciban sus transmisiones. Además, dado que el DTR está acoplado para restablecerse con un capacitor, es posible que pueda usar solo un capacitor para cada uno, si puede estar seguro de que el no utilizado no causará transiciones falsas que induzcan el reinicio. Pero esas son simplificaciones opcionales: puede diseñar la placa con interruptores y proporcionar rutas de derivación opcionales a su alrededor para experimentar.
Déjame experimentar con esta configuración por ahora. Buen punto sobre el DTR conectado al RESET de Arduino a través de un condensador. No mencioné que el capacitor está presente en el lado de Arduino y que las salidas de los multiplexores FTDI-DTR o BT-STATE eventualmente se conectan a un lado de ese límite 01.u. ¡Gracias otra vez por la idea!
@electrophile, ¿podrías volver a subir la imagen?

Cuando el cable USB está conectado a la PC anfitriona, su puerto verá VBUS = 5V. Si no hay cable, VBUS=0V. Puede alimentar esta señal a uno de GPIO (con la traducción de voltaje adecuada, el divisor de resistencia debería estar bien) y usar la señal lógica para cambiar entre USB y BT (apagar BT).

¿Y cómo propone "apagar BT"?
No sé. El OP presentó una tabla que da la impresión de que aparentemente tiene un control independiente para ambas interfaces como ENCENDIDO o APAGADO. ¿Quizás usando otro GPIO para deshabilitar el módulo BT?
Lo que OP presentó es una tabla de su experiencia, que parece ser causada por la resistencia en el diseño de stock de Arduino, y es contraria a sus deseos.

También hay una opción si desea usar dos UART en Arduino, hay soporte de Softwareserial(), cuya biblioteca ayuda a crear su segundo uart. entonces puede usar USB y Bluetooth en una sola vez y de manera fácil sin cambios en el hardware. lea cómo usar la biblioteca Softwareserial() y qué pines son compatibles.

Creo que he mencionado que la placa ejecuta grbl, que se conecta a través de Arduino RX y RX. Además, tanto el FT232 como el Bluetooth eventualmente hablan con un programa que es grbl. Tener dos métodos abiertos de comunicación en serie que puedan operarse al mismo tiempo sería desastroso. Esto también significa que tendré que modificar el código grbl, que no es lo que quiero en absoluto.