5 votos

Medio dúplex: ¿Cómo evitar el cortocircuito?

Considere dos Arduinos (ATmega328P), con los pines 2 conectados para la comunicación semidúplex (por ejemplo, utilizando SoftwareSerialWithHalfDuplex ):

Direct connection of pins 2

Ambos Arduinos pueden estar transmitiendo al mismo tiempo, ya sea por razones lógicas, o si algo está mal. En este caso, un Arduino puede poner el pin 2 en alto, y el otro Arduino puede ponerlo en bajo. El resultado es un cortocircuito. Para limitar la corriente a 5mA, podría añadir una resistencia de 1k:

Connection with resistor

¿Es esa la solución preferida? ¿Me estoy perdiendo algo?

0 votos

Lee atentamente la respuesta de Pipe. El diagrama de su respuesta no está completo. Como no sabes la solución, sospecho que no sabes lo que es una resistencia pull-up. Busca en Google "pull-up resistor". Y sí, pipe es correcto: no te comuniques poniendo el pin alto y bajo. Comunícate poniendo el pin a bajo y configurándolo como entrada y salida. Cuando está en modo de salida intentará drenar todo el voltaje de la línea dando 0. En modo de entrada no producirá ningún voltaje por lo que la resistencia pull-up es libre de suministrar voltaje dando 1. Si ambos transmiten 0 = no hay problema. Si ambos transmiten 1 tampoco hay problema

1 votos

@slebetman Por favor, vea el sección de ayuda en los comentarios para saber cómo se utilizan los comentarios en el intercambio de pilas. Si hay problemas con mi respuesta, el comentario debe estar ahí. Si quieres responder a la pregunta, debes publicarla como una respuesta real que pueda ser votada. Las respuestas en los comentarios van en contra del modelo de Stack Exchange de las respuestas examinadas por la comunidad.

11voto

pipe Puntos 314

Es una forma razonable de resolver el problema de las colisiones accidentales.

Otro método habitual es utilizar un drenaje abierto salida. Es el método utilizado por I2C para asegurar que dos controladores que colisionan no consuman demasiada corriente, y para asegurar que la señal sea baja o alta, y no algo intermedio.

enter image description here

De esta manera puedes conectar tantas salidas como quieras, porque o no hacen nada, o tiran de la salida a tierra. Si dos o más pines llevan la misma señal a tierra, no pasa nada malo.

Para que esto funcione, se necesita una sola resistencia pull-up en el bus, y como nadie está activamente conduciendo la señal alta, esto hace que la tasa de bits máxima sea menor.

Dado que está utilizando una interfaz de serie controlada por software, debería ser fácil de adaptar a sus necesidades. En lugar de configurar los puertos como salidas push-pull y luego configurarlos como bajos o altos, los configuras como entradas con pull-up cuando se supone que son salida alta o entrada y los configuramos como salida baja cuando se supone que son salida baja .

4 votos

Puedes imitar el drenaje abierto utilizando las funciones de Arduino. En la función setup(), pon el pin a nivel bajo con digitalWrite(pin,LOW) . Al realizar las comunicaciones, se debe alternar entre la entrada y la salida mediante pinMode(pin,INPUT) para la alta, y pinMode(pin,OUTPUT) para la baja. O utilizar los registros IO directamente, estableciendo el correspondiente PORT y la conmutación del correspondiente DDR poco.

4 votos

Incluso puede utilizar pinMode(pin, INPUT_PULLUP) para enviar 'high' haciendo uso de las resistencias pull-up internas del AVR.

1 votos

@JimmyB: Aunque eso no protege de los errores de programación.

2voto

GSerg Puntos 33571

Es tan bueno como cualquier otro. Una alternativa sería operar los pines en modo de drenaje abierto, pero entonces necesitarías una resistencia externa de pullup.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X