jm24cule@gmail.com:
¿Pero al usar I2C no usa Serial no? Usaría la librería wire, o al menos eso he visto.
La confusión quizá venga del hecho de que ambos son "comunicación serial". I2C viene identificado por los pines SDA y SCL; y el que se identifica por RX y TX, en realidad se llama UART.
Por lo tanto, son buses de datos totalmente independientes.
Y sí, Wire es el que maneja el bus I2C.
jm24cule@gmail.com:
Pero mi pregunta es donde conectar los cables entre la MEGA y las otras dos placas NANO, ya que SCL y SDA solo hay para una conexion I2C, a menos que pueda conectar mas de un aparato para la comunicacion I2C en los pines SCL/SDA.
De hecho, la arquitectura y protocolo de I2C permite que tanto maestros como esclavos compartan la misma línea de datos y de reloj.
Si los quieres conectar por I2C, solamente tienes que unificar todos los SDA, SCL y GND.
jm24cule@gmail.com:
en el sketch como sabría identificar el dispositivo 1, 2 o 3 por ejemplo si están en la misma conexión que los demás. Me refiero al momento de especificar la comunicación:
Wire.beginTransmission("numero del dispositivo"); <---- aquí cómo podría saber qué numero identifica a la NANO1 o NANO2
Como la conexión es compartida (topología de bus), cada esclavo tiene un identificador de 7 bits llamado "dirección"; con un rango válido del 1 al 127 (el cero está reservado para el maestro; y el MSB sirve para diferenciar un envío de una petición).
Si no me equivoco, beginTransmission y requestFrom solamente el maestro lo puede utilizar. Los esclavos están limitados a recibir y enviar sólo cuando les corresponde.
Un Arduino puede hacer el rol de esclavo o maestro dependiendo de cómo hayas llamado a Wire.begin():
- Sin parámetros: el controlador del I2C se inicia en la dirección cero, lo que lo convierte en el maestro.
- Con un valor entre 1 y 127: el controlador del I2C se inicia en la dirección dada, lo que lo convierte en un esclavo identificado por dicha dirección.
Con esto último quiero decir que si un Nano inicia con:
Wire.begin(10);
// Escuchará solo las transmisiones que inicien con la dirección 10
Entonces el maestro se le referirá de esta manera:
Wire.beginTransmission(10);
// Envía datos a quien escuche en la dirección 10
jm24cule@gmail.com:
Puede que me esté haciendo un lío y sea mejor usar los pines RX1-TX1 de MEGA con una NANO y TX2-RX2 de la MEGA para la otra NANO, ¿que es a lo que te refieres no?, declarar Serial1.write() a NANO1 y Serial2.write() a NANO2.
Es lo recomendable ya que las líneas RX0 y TX0 comparten las del convertidor USB a UART.
Por cierto los puertos no se inicializan con write, es con begin.
jm24cule@gmail.com:
Si no usara I2C y la librería correspondiente, y tuviese que usar Serial, ¿quedaría así?
MEGA:
Serial.begin(9600);
Serial1.begin(9600);
Serial.write(9600); <--- Para enviar cadena de texto a NANO1
Serial1.write(9600);<--- Para enviar cadena de texto a NANO2
NANO1:
Serial.begin(9600);
Serial.read(9600);
NANO2:
Serial.begin(9600);
Serial.read(9600);
Todo correcto excepto por lo siguiente:
También debes conectar GND con GND, si no simplemente no va a funcionar o la señal se corrompe.
Serial.write(9600);
Espero que sea solo de ejemplo porque write solo enviará un byte/char; que por desbordamiento equivaldría a 127 (no es un caracter imprimible).
Serial.read(9600);
Eso es para dar un error de compilación. Serial no implementa ninguna función con la firma void Serial::read(int), pero sí una sin parámetros (la que se usa para leer un byte/caracter).
Además de que es una mala práctica asumir que el búfer siempre tendrá datos para leer; de antemano se debe corroborar con available.