Conecte varios dispositivos Arduino esclavos a un dispositivo Arduino maestro

Quiero usar la comunicación en serie entre un maestro y varios esclavos.

Ya conecté el RX del maestro a los pines TX de ambos esclavos, y viceversa (así conecté el pin TX del maestro a los pines RX de ambos esclavos). También conecté los pines GND.

Pero ahora tengo caracteres extraños cuando abro la ventana del monitor serial.

Ahora, ¿cómo conecto correctamente un dispositivo Arduino maestro con al menos dos dispositivos Arduino esclavos usando los pines RX y TX? ¿Necesito conectar pines de 5V?

PD: Veo muchas palabras como "SPI" e "I2C", y la gente empieza a usar terminología. Pero no tengo tanta experiencia, así que por favor, si usa los términos, explíquelos.
Otra PD: quiero que los dispositivos Arduino usen energía del dispositivo Arduino maestro.

Puede conectar un pin TX a varios pines RX. Cuando conecta varios pines TX a un pin RX, tiene problemas porque la señal de un TX interfiere con el otro. Debe usar varios UARTS (puertos serie) en el maestro para separar los que se conectan a cada esclavo.

Respuestas (3)

Ahora, ¿cómo conecto correctamente un dispositivo Arduino maestro con al menos dos dispositivos Arduino esclavos usando los pines RX y TX? ¿Necesito conectar pines de 5V?

Redes de pobres:

El siguiente circuito es "travieso" en extremo, pero se puede hacer que funcione "lo suficientemente bien".
Puedes hacer lo mismo usando puertas formales.

Circuito superior:

Maestro + N secundarios.
El maestro siempre es escuchado por todos los secundarios.
El maestro puede escuchar cualquier secundario.
Los secundarios no pueden escuchar a otros secundarios.
Múltiples secundarios que transmiten simultáneamente corrompen ambas señales.

Master RX es levantado por la resistencia.
Cualquiera de los esclavos puede bajar el Master RX configurando su TX bajo.
Solo un esclavo puede "hablar" a la vez si se quieren evitar transmisiones corruptas. Máx. limitado por la constante de tiempo de R más la capacitancia del circuito.
Una R demasiado baja no puede ser bajada correctamente por TX.

Circuito inferior: todos los compañeros.

Cualquiera puede enviar (uno a la vez).
Todos recibirán cualquier cosa enviada.
El remitente recibirá su propia transmisión y podrá juzgar si la transmisión se corrompió.

Útil, por ejemplo, para operaciones de ALOHAnet puro o ALOHAnet ranurado .
O, para el caso, token ring, round robin o la mayoría de los otros sistemas de red. Incluso CSMA/CD

ingrese la descripción de la imagen aquí

El valor de la resistencia pullup se deja como ejercicio para el estudiante.

La polaridad que se muestra supone que el nivel de inactividad de TX es alto.
Invierta las polaridades del diodo y use el pulldown para TX inactivo es bajo.

Estaba a punto de sugerir algo similar, ¡pero me ganaste! Acabo de terminar un diseño que hace algo muy similar, excepto que hay optoaisladores en cada nodo. No obstante, es un esquema semidúplex de un cable muy parecido al que ha mostrado anteriormente.
FWIW: el esquema optoaislado que mencioné anteriormente funciona bien a 2400 baudios con 200 metros de un cable de par trenzado blindado (+5 V, señal, el blindaje es tierra).

No conecte los pines TX juntos. Cuando un arduino esclavo está conduciendo su TX a una lógica alta y el otro arduino está conduciendo su TX a una lógica baja, el voltaje resultante no es un nivel lógico válido, es por eso que está obteniendo caracteres no válidos.

En cambio, compre uno preconstruido RS-485 arduino shieldpara cada uno de sus dispositivos. Detalles abajo...

El TX/RX no está diseñado para soportar múltiples dispositivos esclavos; es solo una conexión entre dos puntos. La salida TX siempre está controlada y solo puede haber un controlador.

Para conectar correctamente varios dispositivos esclavos, necesita una interfaz que esté diseñada para admitir varios controladores.

Los pines Arduino TX/RX que está utilizando se denominan comúnmente RS-232, aunque no es del todo exacto. RS-232 es un tipo de red muy simple que conecta dos dispositivos. Un dispositivo se llama DCEy el otro dispositivo se llama DTE. No se preocupe por lo que significan esos nombres; solían significar algo en la Edad Media cuando las personas conectaban teléfonos con cable a módems telefónicos acústicos ( http://en.wikipedia.org/wiki/Acoustic_coupler ) Lo único es que un dispositivo transmite por el TXDcable y escucha por el RXDcable, mientras que el otro dispositivo transmite RXDy 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 llamadoNull Modem-- la salida TX de un dispositivo impulsa la entrada RX del otro dispositivo y viceversa.

(Me estoy saltando algunos detalles sobre cómo las señales RS-232 usan voltajes más altos que los niveles lógicos 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á enviando señales de datos válidos y qué dispositivo está inactivo. Eso requiere un nuevo tipo de red serial llamada 'RS-485'.

El RS-485estándar requiere el uso de un tipo especial de traductor de nivel, no solo conecta las señales TX/RX de nivel lógico. Este traductor de nivel RS-485 se encarga de manejar la interconexión de tal forma que permite compartir la conexión entre múltiples dispositivos. Todavía 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.

Dado que es un usuario de Arduino y no tiene mucha experiencia con la electrónica, la forma más sencilla para usted será comprar un RS-485 arduino shield.

Mencionó I2C(también abreviado con menos frecuencia como IIC), que es un estándar de interfaz de drenaje abierto de 2 cables definido originalmente por la corporación Philips. Google i2c bus specificationpara 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.

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 se alimenta desde USB, debería estar bien siempre que la corriente de suministro total consumida por las tres placas no exceda la corriente de carga nominal. Si eso sucede, lo sabrá porque su PC con Windows apagará el puerto USB.

Lo que no ha mencionado al hablar de RS-485 es el control de dirección que se requiere en cada nodo. Puede hacer esto en hardware si es necesario (Jan Axelson publicó un circuito limpio que funciona bien), pero el microcontrolador normalmente maneja el control de dirección.
@DwayneReid El control de dirección solo es necesario para RS485 semidúplex . Si tiene pares TX y RX de dúplex completo separados, entonces no es necesario.

https://www.arduino.cc/en/Tutorial/TwoPortReceive

pasa por configurar otros pines digitales en otros pines TX y RX.

escarcha0_0