Comunicación serie bidireccional de un solo cable: configuración del hardware

2

Tengo varios servos que pueden dar datos de retroalimentación que quiero leer. Los servos usan un protocolo especial, así que necesito usar el pin Rx / Tx en mi Arduino Mega para comunicarme con ellos. El problema es que un servo solo tiene un pin de comunicación serie, por lo que no puedo usar el cableado Rx / Tx habitual.

He escuchado que hay algunas configuraciones de hardware para convertir correctamente las señales UART al tipo half duplex. Una es usar 2 resistencias conectadas a Rx y Tx de Arduino y el pin del servo. Otra es usar un transistor. Sin embargo, no pude encontrar dibujos y reglas de circuitos exactos para elegir los valores para las resistencias o el transistor. ¿Alguien puede proporcionar más información sobre eso y explicar en términos de hardware exactamente cómo estas configuraciones evitan que la Tx se escriba en el Rx y la retroalimentación del servo al Tx?

EDITAR: el servo es Dynamixel XL-320 ( enlace ). La comunicación es semidúplex serie: puedo escribir en el servo, pero también puedo leer valores, por ejemplo. carga (por lo tanto, necesito usar ambos pines Rx y Tx en mi arduino). NOTA: el manual servo propone utilizar un multiplexor y un pin digital en el arduino como un bit de selección para convertir uart en half-duplex. Sin embargo, estoy pidiendo específicamente otras alternativas más pasivas.

    
pregunta niko

2 respuestas

1

Usted dice que quiere usar un Arduino Mega, que tiene una MCU ATmega1280.

En ATmega1280 (y ATmega en general, en su mayoría) las unidades UART Tx / Rx anulan el funcionamiento normal del puerto. Por lo tanto, una vez que la unidad Tx está encendida, no puede establecer el pin Tx en Hi-Z (tri-state) a menos que desactive la unidad Tx.

El tiempo no debería ser tan crítico, ya que las velocidades en baudios son de 1Mbps máximo, mientras que el ATmega1280 funciona a 16 MHz, suponiendo que CKDIV8 no está programado .

En teoría, deberías tener tiempo para cambiar. Sin embargo, si su circuito equivalente es una indicación, en realidad conducen la línea Tx, por lo que puede producir un corto cuando las cosas van mal, es decir, su código tarda demasiado en deshabilitar la unidad Tx o escribe mientras el Dynamixel responde.

En realidad, no está claro si el dynamixel controla realmente la línea Tx o si no lo hacen (la imagen del circuito dice CM-5, que es un controlador maestro, no un esclavo).

Le sugiero que no trabaje con la desactivación / habilitación de la unidad Tx en el ATmega1280, porque tiene que codificar más y posiblemente tener en cuenta las interrupciones. En su lugar, coloque una resistencia entre las líneas Tx y Rx, así:

simular este circuito : esquema creado usando CircuitLab

A) Suponiendo que los Dynamixels tienen una resistencia de recuperación interna Rpu = 10kΩ, y suponiendo que el Voltaje de entrada máximo para un '0' Vil_max = 0.8V lógico (solo para estar seguros), necesitamos el siguiente valor de resistencia Rx para confiablemente conducir un '0': Ley de Ohm

   5V * Rx / (Rx + 10kΩ) <= 0.8V
->                    Rx <= 1.9kΩ

B) Suponiendo que los Dynamixels no tengan un pull-up interno, solo use Rx = 10kΩ..100kΩ. Su unidad Tx conducirá un '1' en el bus inactivo, lo que hará que el bus llegue hasta 5 V cuando la lógica de la máquina de estado espera que el Dynamixel responda.

En cualquier caso, la resistencia evitará cortocircuitos en caso de que el Dynamixel y su controlador se conduzcan al mismo tiempo. También actuará como un pull-up para su propia unidad Rx, por lo que no obtendrá datos falsos cuando el Dynamixel no esté conectado.

Le sugiero que use un multímetro para determinar en cuál de los dos casos cae su aplicación. En caso de duda, comience con 1.8kΩ, verifique que su código funcione. Luego pasar a 100kΩ. Si su código falla, puede estar seguro de que usan un Rpu interno, así que quédese 1.8kΩ. Si todo funciona con 100kΩ, entonces, bueno ... funciona.

    
respondido por el FRob
0

Como el servo usa un enlace semi-dúplex multipunto de nivel TTL, necesitará que su pin TX se conecte al bus a través de un búfer de tres estados, o programarlo como dirección de entrada una vez que no esté transmitiendo. El RX se puede conectar al bus constantemente, pero en este caso tendrá que ignorar los paquetes enviados automáticamente, ya que se harán eco. Recomendaría una configuración similar a esta:

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Eugene Sh.

Lea otras preguntas en las etiquetas