Protocolo de comunicación I2C El bus I2C es un protocolo de comunicación serie. Su extructura es muy simple ya que con tan solo dos cables podemos conectar multitud de sensores, controladores, actuadores hasta un límite de 400pF. Funcionamiento del bus I2C Este bus tiene varias características a tener en cuenta: Requiere dos líneas de comunicación, por un lado SDA (Signal Data) y por otro lado SCL (Signal Clock). Las dos líneas son bidireccionales. Ambas líneas de comunicación deben tener conectadas unas resistencias pull-up de 10KΩ. Éstas se conectan para provocar que en el momento que no exista comunicación alguna entre los dispositivos que conformen la red, las líneas se encuentren a nivel alto (5V). Ambas líneas de comunicación son las que transportan la información a los dispositivos que conforman la red, estos datos están formados por palabras de 8 bits. El protocolo de comunicación es Master-Slave. Está permitida la conexión de varios masters. Todos los dispositivos conectados pueden ser Master o Slave. Cada uno de los dispositivos conectados disponen de un código propio para ser reconocido por el resto de dispositivos, por lo que en el momento de iniciar la comunicación, el dispositivo que quiera comunicarse con otro, deberá hacerlo mediante la dirección del dispositivo destinatario. Funcionamiento de la comunicación La transmisión bidireccional serie se puede realizar a dos velocidades, el modo más común de funcionamiento es el estándar de 100kbit/s. Esta velocidad también puede llegar a 400kbit/s en modo rápido o 3,4Mbit/s para aplicaciones industriales. Una vez montada la red tendrá una apariencia como la que mostraremos a continuación. En esta imagen podemos observar ambas resistencias de pull-up en las dos líneas de comunicación y la conexión de los diversos dispositivos. Podemos observar también como el uC de la derecha está funcionando como Master, es decir, estaría enviando un mensaje a uno de los otros dispositivos. El Master es el dispositivo emisor, es decir, es el que decide a “quien” y el “que” enviará. Cuando el Master inicia la transferencia de información hacia el Slave, genera la señal de Clock, es decir, tal y como se observa en la figura posterior, enviaremos la información y unos microsegundos después generamos la señal de Clock (SCL). Ejemplo Comunicación entre Arduino UNO y Arduino MEGA Necesitaremos dos arduinos, los cuales, el Uno funcionará como Master con su propio código y un MEGA, que funcionará como Slave con otro código propio. Con este montaje lo que haremos será que cada vez que pulsemos el pulsador, enviaremos un dato por I2C al SLAVE que llegará al MEGA y decidirá encender o apagar el led dependiendo de cómo se encuentre el pulsador. Código MAESTRO #include <Wire.h> int pulsador=0; int lectPulsa=0; byte x = 0; void setup(){ Wire.begin(); pinMode(pulsador,INPUT); } void loop(){ Wire.beginTransmission(9); Wire.write(x); Wire.endTransmission(); lectPulsa=analogRead(pulsador); if(lectPulsa==HIGH){ x=1; } else{ x=0; } } Código SLAVE #include <Wire.h> int x=0; int led=13; void setup(){ Wire.begin(9); Wire.onReceive(recepcion); pinMode(led,OUTPUT); digitalWrite(led,HIGH); } void loop(){ if (x==0){ digitalWrite(led,LOW); } if (x==1){ digitalWrite(led,HIGH); } } void recepcion(int valor){ x= Wire.read(); }