Considere dos Arduinos (ATmega328P), con los pines 2 conectados para comunicación semidúplex (por ejemplo, usando SoftwareSerialWithHalfDuplex ):
Ambos Arduinos pueden estar transmitiendo al mismo tiempo, ya sea por razones lógicas o si algo anda mal. En este caso, un Arduino puede configurar el pin 2 en alto, el otro Arduino puede configurarlo en bajo. El resultado es un cortocircuito. Para limitar la corriente a 5 mA, podría agregar una resistencia de 1 kΩ:
¿Es esa la solución preferida? ¿Me estoy perdiendo de algo?
Esa es una forma razonable de resolver el problema de las colisiones accidentales.
Otro método común es usar una salida de drenaje abierta . Es el método utilizado por I2C para garantizar que dos controladores en colisión no consumirán demasiada corriente y para garantizar que la señal sea baja o alta, y no algo intermedio.
De esta manera, puede conectar tantas salidas como desee, porque no hacen nada o conectan la salida a tierra. Si dos o más pines conducen la misma señal a tierra, no sucede nada malo.
Para que esto funcione, necesita una sola resistencia pull-up en el bus, y dado que nadie está elevando activamente la señal, esto genera una tasa de bits máxima más baja.
Dado que está utilizando una interfaz serial 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 bajo o alto, los configura como entradas con pull-up cuando se supone que deben tener salida alta o entrada , y configurarlos como salida baja cuando se supone que deben tener una salida baja .
digitalWrite(pin,LOW)
. Al realizar comunicaciones, alterne entre entrada y salida usando pinMode(pin,INPUT)
para alto y pinMode(pin,OUTPUT)
para bajo. O use los registros IO directamente, configurando el PORT
bit correspondiente bajo y alternando el DDR
bit correspondiente.pinMode(pin, INPUT_PULLUP)
para enviar 'alto' haciendo uso de las resistencias pull-up internas del AVR.Es tan bueno como cualquier otra cosa. Una alternativa sería operar los pines en modo de drenaje abierto, pero luego necesitaría una resistencia pull-up externa.
dormilón
tubo