Abra la salida de Drain Serial TX en Arduino

1

He estado intentando implementar una salida serial de drenaje abierto utilizando un Arduino Nano. En el siguiente ejemplo, he usado 2 Arduino Nanos (ambos operando a 5V Vcc), usando un Arduino como transmisor y el otro como receptor.

El transmisor está programado para enviar la siguiente serie de bytes:

fe fe 68 60 39 12 11 81 dieciséis 68 c1 1 35 1a dieciséis fe fe

Obviamente, se espera que el receptor reciba el mismo. Pero en cambio, esto es lo que el receptor parece estar recibiendo:

0 0 9 2 63 3b 77 3f 3a 9 1f 7f sesenta y cinco 39 3a 0 0

El siguiente es el circuito que estoy usando para interactuar entre los dos Arduinos:

Pido disculpas si la terminología que he usado aquí no es totalmente precisa, ya que solo soy un principiante en el campo. ¿Me estoy perdiendo algo en el circuito? ¿El MOSFET de canal N que estoy usando aquí es apropiado para esta aplicación? Cualquier apreciación sería muy apreciada, gracias de antemano.

    
pregunta John918

3 respuestas

3

Esto se confunde de varias maneras:

  1. Dice que la salida digital tiene un drenaje abierto, pero no ha proporcionado nada que haga que la señal suba, nunca.
  2. Un MOSFET de 60 V 55 A es un exceso excesivo aquí. Al menos este se puede encender de manera útil con solo una unidad de puerta de 5 V. Así que mientras tonto, al menos debería funcionar.
  3. El transistor se invierte. Eso significa que los UART de transmisión y recepción deben configurarse para una polaridad opuesta. Eso no es posible con la mayoría de los microcontroladores. Dichas UART se fijan generalmente con el nivel de ralentí de línea alto.
  4. No mencionó nada sobre la velocidad en baudios o el protocolo de hardware, como 8-N-1. Esto no es algo que puedas pasar por alto.
  5. La velocidad en baudios tiene que ser lo suficientemente lenta para que el pullup pasivo pueda tirar de la línea en una pequeña fracción del tiempo de bit.
  6. Es un verdadero rasguño de cabeza porque no solo conectaste los dos pines directamente con un pullup. ¿Cómo es que eso no es lo obvio? No hay necesidad de un esquema de hairbrain aquí.
respondido por el Olin Lathrop
2

Primero que todo: ¿Por qué quieres usar el MOSFET?

¿Y qué uso tendrá R1?

Segundo:

El uso de un solo MOSFET invertirá la salida del IC, de modo que cuando el IC salga a un nivel alto en el pin Tx, obtendrá un nivel bajo en el pin Rx y viceversa.

Estaba comprobando la forma de onda de fe fe 68 y la forma de onda de 00 00 09 . Suponiendo que algunos parámetros de tiempo (tiempo entre dos bytes) una de las dos formas de onda es exactamente el inverso de la otra forma de onda.

Entonces, cuando el pin Tx es alto cuando se envía fe fe 68 , será bajo cuando se envía 00 00 09 y cuando es bajo para la primera secuencia es alto para la segunda secuencia.

Esta es la razón por la que no recibes lo que esperas: el MOSFET actúa como una puerta NO.

    
respondido por el Martin Rosenau
1

Nota: Supongo que su objetivo en la búsqueda de drenaje abierto es tener una pluralidad de nodos transmisores Arduino conectados a un solo receptor.

La clase en serie habitual de Arduino utiliza el hardware UART y los ralentí altos (y, por supuesto, es una salida push-pull). La expectativa del diseñador de chips es que utilizará un controlador RS232 inversor y un receptor RS232 inversor.

Entonces, si desea hacer un 'o' que permita dos transmisores y un receptor, puede invertir dos veces usando un par de BJT PNP o MOSFET de canal p en el transmisor (con una resistencia desplegable) y un inversor en el receptor, o puede usar diodos como el doble que se muestra a continuación, con una resistencia de pull-up:

simular este circuito : esquema creado usando CircuitLab

Tenga en cuenta que los controladores y receptores RS232 se diseñaron con niveles, impedancias y protección para un funcionamiento robusto con cables largos y si intenta ese tipo de cosas con las entradas / salidas CMOS, se abrirá a todo tipo de problemas .

La solución preferida en este caso, en mi opinión, sería utilizar controladores y receptores RS485 con un par trenzado debidamente terminado (más una conexión a tierra común) y habilitar solo el transmisor que está activo. Usaría un GPIO adicional para habilitar el transmisor activo.

Detodosmodos,estaseríalamaneradehacerlocomoestabapensando:

simular este circuito

Finalmente, es posible que pueda modificar la clase de Serie de Software para igualar el bit DDR en lugar de la salida y simular el drenaje abierto utilizando la salida de AtMega directamente (que requiere solo una resistencia y no transistores), sin embargo, eso es más trabajo y tiene otras desventajas. (como la falta de velocidad) sobre el uso del hardware proporcionado en el chip.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas