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.
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
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.
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 shield
para 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 DCE
y 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 TXD
cable y escucha por el RXD
cable, mientras que el otro dispositivo transmite 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 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-485
está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 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.
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.
https://www.arduino.cc/en/Tutorial/TwoPortReceive
pasa por configurar otros pines digitales en otros pines TX y RX.
escarcha0_0
DoxyLover