Abra la salida Drain Serial TX en Arduino

He estado tratando de implementar una salida en serie de drenaje abierto usando 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 16 68 c1 1 35 1a 16 fe fe

Obviamente, se espera que el receptor reciba lo 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 65 39 3a 0 0

El siguiente es el circuito que estoy usando como interfaz entre los dos Arduinos:

Circuito de interfaz

Me disculpo 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 idea sería muy apreciada, gracias de antemano.

Tenga en cuenta que puede alternar un pin GPIO directamente desde el modo de entrada (= tristate) a salida baja y viceversa desde el software. Por lo tanto, si implementa una interfaz serial de software, ni siquiera necesita un transistor externo para crear un equivalente a una salida de drenaje abierta. Básicamente, solo envía sus datos al DDRx en lugar del registro PORTx.

Respuestas (3)

Esto se estropea de varias maneras:

  1. Usted dice que la salida digital es de drenaje abierto, pero no ha proporcionado nada que haga que la señal sea alta, nunca.
  2. Un MOSFET de 60 V y 55 A es una exageración. Al menos este se puede encender de manera útil con solo un controlador de compuerta de 5 V. Entonces, si bien es una tontería, al menos debería funcionar.
  3. El transistor se invierte. Eso significa que los UART de transmisión y recepción deben configurarse para polaridad opuesta. Eso no es posible con la mayoría de los microcontroladores. Dichos UART generalmente se arreglan con un nivel alto de inactividad de la línea.
  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 tasa de baudios tiene que ser lo suficientemente lenta para que el pull-up pasivo pueda subir la línea en una pequeña fracción del tiempo de bits.
  6. Es un verdadero rascador de cabeza por qué no conectaste los dos pines directamente con un pullup. ¿Cómo es que eso no es lo obvio? No hay necesidad de un esquema de cerebro de cabello aquí.
"usted no ha proporcionado nada que haga que la señal sea alta, nunca"?! ¿Qué pasa con R2?
@Jim: R2 extrae la salida del FET, no la salida de drenaje abierto del procesador que impulsa TX1.
Según tengo entendido, el µC solo tiene una salida TX push/pull, y el OP está tratando de convertirlo en un drenaje abierto a través de un transistor externo (quizás para multimaestro).
@Jim: El OP se refiere a una "salida en serie de drenaje abierto". Parece que quiere usar uno, no hacer uno, especialmente porque no ha dado ninguna razón por la que querría hacer uno. Si su interpretación es correcta, entonces esa es una pregunta totalmente diferente.
"intentar implementar un desagüe abierto" fue donde leí el énfasis en implementar . Además, IIRC el Arduino Nano no tiene una salida serial de drenaje abierto (hardware).
No creo que la salida digital esté abierta. El Arduino Nano se basa en el ATmega328. Que yo sepa (después de leer la hoja de datos), solo tiene salida de drenaje abierto para la interfaz I²C (llamada "Interfaz serial de 2 hilos" (TWI)) para señales SDA y SCL (página 108), no la salida serial .

Primero que nada: ¿Por qué quieres usar el MOSFET allí?

¿Y qué uso tendrá R1?

Segundo:

El uso de un solo MOSFET invertirá la salida del IC, de modo que cuando el IC emita 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 68y la forma de onda de 00 00 09. Suponiendo algunos parámetros de temporización (tiempo entre dos bytes), una de las dos formas de onda es exactamente la inversa de la otra forma de onda.

Entonces, cuando el pin Tx está alto al enviar, fe fe 68estará bajo al enviar 00 00 09y cuando está bajo para la primera secuencia, está alto para la segunda secuencia.

Entonces, esta es la razón por la que no recibe lo que espera: el MOSFET actúa como una puerta NOT.

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

La clase serial habitual del Arduino usa el hardware UART y está inactivo alto (y, por supuesto, es una salida push-pull). La expectativa del diseñador del chip 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 pull-up:

esquemático

simular este circuito : esquema creado con CircuitLab

Tenga en cuenta que los controladores y receptores RS232 fueron diseñados con niveles, impedancias y protección para una operación robusta con cables largos y si intenta ese tipo de cosas con entradas/salidas CMOS, se expondrá a todo tipo de problemas.


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

ingrese la descripción de la imagen aquí


De todos modos, esta sería la forma de hacerlo como estabas pensando:

esquemático

simular este circuito


Finalmente, es posible que pueda modificar la clase SoftwareSerial para manipular el bit DDR en lugar de la salida y simular un drenaje abierto usando la salida AtMega directamente (requiriendo solo una resistencia y sin transistores), sin embargo, eso es más trabajo y tiene otras desventajas (como falta de velocidad) sobre el uso del hardware provisto en el chip.