Escritura Maestro / Lectura Esclavo

En algunas situaciones, puede ser de utilidad la configuración de dos (o más) placas Arduino y Genuino para compartir información entre sí. En este ejemplo, dos placas están programadas para comunicarse entre sí en una configuración de Lector Maestro / Esclavo Remitente a través del protocolo serie síncrono I2C Para lograr esto se utilizan varias funciones de la Biblioteca Wire. Arduino 1, el Maestro, está programado para solicitar, y después leer, 6 bytes de datos enviados desde un solo Esclavo Arduino direccionado. Una vez que se recibe ese mensaje, a continuación se puede ver en la ventana de monitor serie del Software (IDE)Arduino .

El protocolo I2C implica el uso de dos líneas para enviar y recibir datos:
  • un pin de reloj serie (SCL) envía los impulsos de la placa Arduino o Genuino Maestro a intervalos regulares,
  • un pin de datos serie (SDA) sobre el cual se envían los datos entre los dos dispositivos.
A medida que cambian las líneas de reloj de LOW a HIGH (conocido como el flanco de subida del pulso de reloj), un único bit de información - que va a formar de la secuencia de la dirección de un dispositivo específico y mando de datos - se transfiere desde la placa para el dispositivoI2C a través de la línea SDA. Cuando se envía esta información - bit a bit -, la llamada del dispositivo ejecuta la solicitud y transmite datos de nuevo es - si es necesario - a la placa sobre la misma línea utilizando la señal de reloj que sigue siendo generada por el Maestro en SCL como la sincronización.

Debido a que el protocolo I2Cpermite a cada dispositivo habilitado a tener su propia dirección única, y como los dispositivos maestro y esclavo hacen turnos para comunicarse a través de una sola línea, es posible que la placa Arduino o Genuino se comunique (a su vez) con muchos dispositivos , u otras plataformas, utilizandp sólo dos pines del microcontrolador.

Hardware necesario

  • 2 placas Arduino o Genuino
  • cable de conexionado


Circuito


Conecte el pin 4 (pin d datos o SDA) y el pin 5 (pin de reloj, o SCL) en la placa principal con sus homólogos en la placa esclavo. Asegúrese de que ambas placas comparten el común (GND). Con el fin de permitir la comunicación serie, la placa maestra debe estar conectada a su ordenador a través de USB.
Si la alimentación de los tableros de forma independiente es un problema, conecte la salida de 5 V del Maestro al pin VIN en el esclavo.

Esquema


Código

Código para Escritura Maestro 

// Wire Master Writer
 // por Nicholas Zambetti <http://www.zambetti.com>
 
 // Demuestra el uso de la biblioteca Wire
 // Lee los datos de un dispositivo esclavo I2C/TWI
 // Referirse al ejemplo de "Wire Slave Sender" para usarlo con este
 
 // Creado el 29 Marzo de 2006
 
 // Este código es de dominio publico.

#include <Wire.h>

void setup() {
  Wire.begin(); // se une al bus i2c (Dirección opcional para el Maestro)
}

byte x = 0;

void loop() {
  Wire.beginTransmission(8); // transmite al dispositivo numero 8
  Wire.write("x is ");        // envia 5 bytes
  Wire.write(x);              //  envia un byte
  Wire.endTransmission();    // parada de transmision

  x++;
  delay(500);
}


Código para Esclavo Receptor - Programa para Arduino 2
// Wire Slave Receiver
// por Nicholas Zambetti <http://www.zambetti.com>

// Demuestra el uso de la biblioteca Wire 
// Recibe datoa como un dispositivo esclavo I2C/TWI 
// Ver el ejemplo "Wire Master Writer" para usarlo con este

// Creado el  29 Marzo de 2006

// Este código es de dominio ublico.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // se une al bus i2c con la direccion numero 8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

No hay comentarios:

Publicar un comentario