Convertir señal serial (12V-5V) y leerla usando Arduino

Estoy tratando de leer algunos comandos de un dispositivo que usa niveles de voltaje no estándar para la comunicación en serie. Utiliza 0V para 0 y 12V para 1. Por lo que sé, los niveles de TTL son de 0-5V, por lo que si quiero comunicarme con él usando mi Arduino, necesito nivelar los 12V para que coincidan con los 5V. El Arduino Mega proporciona un pin con una salida de 5V, así que pensé que podría usarlo, agregar un diodo y obtener unos 5V que puedo conectar a RX. Por ahora solo necesito leer los datos. El pin TX permanece intacto.

Hice un esquema, presentado a continuación:ingrese la descripción de la imagen aquí

Pensé que la caída en el diodo (alrededor de 1,8 V) me permitirá tener (~) 5 V en el pin RX cuando la señal del dispositivo sea de 12 V y 0, cuando sea de 0 V. 12V - 5V - 1,8V = 5,2V. El R1 es de 3kOhm. ¿Alguien podría explicarme por qué no funciona? ¿Es esta solución incluso adecuada? ¿Qué debo cambiar para que funcione?

EDITAR: Logré que funcionara. Modifiqué el circuito:Nuevo circuito

El diodo es un diodo rojo simple, que tiene una caída de 1.8V. Las tres resistencias son todas de 1kOhm. Según mis cálculos, si el voltaje máximo de la señal es de 12 V, ahora puedo obtener 5 V después de volver a conectar el diodo a GND.

Lo que no entiendo es que, cuando la línea roja de la imagen está desconectada, no obtengo nada, mi Arduino no responde. ¡PERO cuando conecto el RX del dispositivo con TX, leo los datos exactos que quería! Ahora eso no es muy obvio para mí, lo obtuve accidentalmente jugando con el tablero. ¿Hay alguna razón obvia por la que el dispositivo comience a transmitir después de conectar el cable rojo?

EDIT2: A continuación se muestra el esquema del dispositivo. SISTEMA DE CONTROL es el único conector al que puedo acceder. 12V proviene de un adaptador simple de 12V, la tierra también está conectada al adaptador. Rx está conectado a arduino, el resto es exactamente como en la imagen con el cable rojo. Versión más grande en Imgur Esquema del dispositivo

No estoy muy seguro, solo me dijeron que los conceptos básicos de comunicación siguen siendo los mismos, la única diferencia es que necesita convertir 12V a 5V. Además, me dijeron que este diseño podría tener fallas porque supuse que el pin de +5 V en Arduino puede absorber la corriente de la señal, que es de aproximadamente 2,1 mA. No estoy muy seguro de si se puede.
Probablemente respondiste a mi comentario que eliminé anteriormente sobre que es posible que necesites un inversor porque al volver a leer la pregunta que mencionaste, 12V era lógica. Pero si no estás seguro de eso, puede ser el caso. Cuando la serie TTL inactiva es normalmente alta, por lo que si es 0 V mientras está inactiva, probablemente necesite un inversor (además, están los otros problemas que Russell ha mencionado).
Podría lanzarme a un "es posible que no funcione porque..." y "podría intentarlo..." PERO sería muy útil si pudiera describir el dispositivo secreto hasta ahora al que está tratando de conectarse y proporcionar detalles sobre su protocolo de comunicaciones / conexiones / circuito / lo que sea. Nos estás diciendo cosas que crees que sabes pero no es obvio por qué crees que las sabes. Algunos de ellos probablemente estén equivocados. Si tenemos la misma fuente de información que usted, probablemente será de ayuda. || No hay vaca azul, ni un diodo rojo estándar. Ningún diodo "ordinario" tiene una caída de voltaje de 1.8V. ...
... La mayoría de los diodos tienen marcas que le indican qué son. O usted puede saber de dónde vino. O. ... || El nuevo circuito es "más seguro" y PUEDE conectar a tierra la parte inferior de la resistencia inferior y quitar el diodo. || La línea RX puede estar proporcionando voltaje de accionamiento que TX reduce según sea necesario. Saber qué hay en la entrada debería ayudar mucho.
Actualmente no puedo tener en mis manos ningún esquema o documento en el dispositivo, pero probablemente sea el jueves. Voy a tratar de proporcionarle una mejor información. ¡Gracias por la ayuda!
He añadido el esquema. ¿Proporciona alguna información útil sobre por qué todo funciona cuando el cable rojo está conectado? Probablemente sea el problema actual del sumidero/fuente, pero no puedo resolverlo.

Respuestas (3)

Para la dirección de 12V->5V, un simple divisor de voltaje de 2 resistencias (por ejemplo, 7kOhm + 5kOhm) probablemente estará perfectamente bien.

Por lo general, no puede simplemente suponer que la fuente de + 5 V puede absorber cualquier cantidad de corriente.

Además, los diodos normales tienen un ancho de banda relativamente bajo, por lo que sus señales pueden distorsionarse más o menos incluso por unos pocos kBit/s. Los diodos Schottky mitigan este problema.

Otra solución simple podría ser así (use Schottky si es posible):

esquemático

simular este circuito : esquema creado con CircuitLab

+1 La idea general es buena. Sus comentarios sobre la conexión de RX a TX para obtener datos sugieren que PUEDE estar trabajando con un TX de colector abierto o similar. Difícil de decir. Con suerte, proporcionará información adicional según lo solicitado.

Vea a continuación un circuito que funcionará.

La serie "RS232" es intrínsecamente muy simple, pero puede tener una cantidad sorprendentemente grande de "magia oscura" agregada que significa que no está viendo lo que cree que está viendo. Abordar sus requisitos de hardware es fácil. Estar seguro de que realmente funciona como se indica puede ser más difícil.

Usted dice que "no funciona", pero no da información sobre lo que hace cuando no hace lo que esperaba. Y, algo de información sobre qué niveles ve, dónde/cuándo y cómo los midió puede ayudar.

Lo que está haciendo es "ilegal" y puede hacer que el procesador funcione mal o incluso que lo destruya. La base de su fórmula es oscura. El dropp de diodo que usa es incorrecto si es un diodo de silicio estándar y debe decir cuál es si es un zener u otro dispositivo. Y es casi seguro que su fórmula es incorrecta si el circuito es como se muestra O el circuito es incorrecto (o ambos).

Como se muestra, el diodo sujetará Vin a un máximo de +5 V MÁS una caída de diodo. Si usamos Vdiode = 0.6V entonces Vin_max =5+0.6 = 5.6V. Esto excede el voltaje operativo máximo permitido en los pines de entrada y puede hacer que el procesador se comporte mal o muera.

A continuación se muestra un circuito 'más seguro'.
Vout max es Vzener en la oferta actual. Como se muestra, si se usa un zener 4V7, la corriente será de aproximadamente 0,7 mA y Voutmax será algo menor que 4V7, ya que los voltajes del zener generalmente se especifican en más de 0,7 mA.

Un zener de 5V1 probablemente dará <5V máx. como se muestra.

Si no tiene diodos zener y tiene varios diodos de silicio estándar, podría hacer una solución temporal usando varios diodos en serie. Aproximadamente 6 es probablemente correcto. Pruébelo y vea: cambie R1 (corriente que afecta) o la cantidad de diodos para ajustar.

esquemático

simular este circuito : esquema creado con CircuitLab

Edité la publicación anterior y agregué un nuevo circuito. ¿Podría echar un vistazo? No estoy seguro de si la edición activa alguna notificación.

Suponiendo que las polaridades de "marca" y "espacio" son las mismas para la salida de la fuente de 12 voltios y la entrada de Arduino, que la señal de 12 V proviene de una fuente de voltaje que es lo suficientemente rígida como para generar al menos 1 mA y permanecer dentro de un par por ciento de 12V, y que la corriente en la E/S de Arduino es << 1mA, esto funcionará:

    0-12V in
       |
     [10k]
       |
       +-->0 to 4.86V out to Arduino
       |
     [6k8]
       |
      GND