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:
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.
Esto se estropea de varias maneras:
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 68
y 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 68
estará bajo al enviar 00 00 09
y 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:
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.
De todos modos, esta sería la forma de hacerlo como estabas pensando:
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.
jimmyb