No conecte los pines TX juntos. Cuando un arduino esclavo está conduciendo su TX a lógica alta y el otro arduino está conduciendo su TX a lógica baja, el voltaje resultante no es un nivel lógico válido, por eso está obteniendo caracteres no válidos.
Instalado, compre un RS-485 arduino shield
prebuilt para cada uno de sus dispositivos. Detalles abajo ...
El TX / RX no está diseñado para admitir varios dispositivos esclavos; Es solo una conexión entre dos puntos. La salida de TX siempre se controla y solo puede haber un controlador.
Para conectar correctamente varios dispositivos esclavos, necesita una interfaz que realmente esté diseñada para admitir varios controladores.
Los pines Arduino TX / RX que estás usando, comúnmente se llaman RS-232
, aunque eso no es del todo exacto. RS-232 es un tipo de red muy simple que conecta dos dispositivos. Un dispositivo se llama DCE
y el otro dispositivo se llama DTE
. No te preocupes por lo que significan esos nombres; solían significar algo en la Edad Oscura cuando las personas conectaban los teléfonos con cable a los módems de teléfono acústico ( enlace ) Lo único es que un dispositivo transmite en el cable TXD
y escucha en el cable RXD
, mientras que el otro dispositivo transmite en RXD
y escucha en TXD
. Esto se vuelve confuso, ya que nos gusta conectar cables que tienen nombres similares, por lo que a menudo usamos un tipo de conexión llamada Null Modem
: la salida de TX de un dispositivo controla la entrada de RX del otro dispositivo, y viceversa.
(Estoy saltando algunos detalles sobre cómo las señales RS-232 utilizan voltajes más altos que los niveles lógicos de CMOS, no es solo una conexión lógica directa).
Pero la limitación de un módem nulo es que solo conecta dos dispositivos. No puede admitir una red de tres dispositivos, porque la conexión por cable no puede saber qué dispositivo está señalando datos válidos y qué dispositivo está inactivo. Eso requiere un nuevo tipo de red en serie llamada 'RS-485'.
El estándar RS-485
requiere el uso de un tipo especial de traductor de nivel, no solo conecta las señales de nivel lógico TX / RX. Este traductor de nivel RS-485 se encarga de conducir la interconexión de tal manera que permita compartir la conexión entre múltiples dispositivos. Aún debe tener cuidado de no permitir que los dispositivos transmitan al mismo tiempo (llamado Collision
), pero dado que ha designado un dispositivo como maestro y los otros dispositivos como esclavos, eso no debería ser un problema. El dispositivo maestro decide qué dispositivo puede hablar en el bus.
Ya que eres un usuario de Arduino y no tienes mucha experiencia con la electrónica, la forma más sencilla para ti será comprar un RS-485 arduino shield
creado previamente.
Usted mencionó I2C
(que también se abrevia con menos frecuencia como IIC
), que es un estándar de interfaz de drenaje abierto de 2 cables originalmente definido por la corporación Philips. Google i2c bus specification
para más detalles. Probablemente podría lograr lo que está tratando de hacer con RS-485 o I2C, pero RS-485 está más cerca de lo que está usando ahora.
Usted mencionó que desea alimentar los dispositivos esclavos desde la misma fuente de alimentación que alimenta el dispositivo maestro. (En cualquier caso, ya deberían estar usando la misma conexión de retorno a tierra). Si el arduino maestro está recibiendo alimentación desde un USB, eso debería estar bien siempre que la corriente de suministro total extraída por las tres placas no exceda la corriente de carga nominal. Si eso sucede, sabrá porque su PC con Windows apagará el puerto USB.