¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

En el mundo de la electrónica y la programación, la comunicación entre dispositivos es fundamental. ¿Alguna vez te has preguntado cómo funciona la comunicación I2C? En este tutorial de Arduino e I2C, te explicaremos de manera sencilla y práctica cómo utilizar este protocolo de comunicación para conectar diferentes dispositivos. ¡Descubre todo lo que necesitas saber para dominar la comunicación I2C y potenciar tus proyectos de Arduino!

En este tutorial aprenderemos cómo funciona el protocolo de comunicación I2C y haremos un ejemplo práctico con la placa Arduino y un sensor que utiliza este protocolo. Puede ver el vídeo a continuación o leer el tutorial escrito a continuación.

descripción general

El bus de comunicación I2C es muy popular y utilizado por muchos dispositivos electrónicos porque puede integrarse fácilmente en muchos diseños electrónicos que requieren comunicación entre un maestro y múltiples dispositivos esclavos o incluso múltiples dispositivos maestros. La facilidad de implementación proviene del hecho de que cuando se usa direccionamiento de 7 bits, solo se requieren dos cables para la comunicación entre hasta 128 (112) dispositivos, y cuando se usa direccionamiento de 10 bits, hasta 1024 (1008) dispositivos.

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

Así funciona I2C

¿Cómo es posible la comunicación entre tantos dispositivos utilizando sólo dos cables? Bueno, cada dispositivo tiene una identificación preestablecida o una dirección de dispositivo única para que el maestro pueda elegir con qué dispositivos comunicarse.

Los dos cables o líneas se denominan Reloj Serial (o SCL) y Datos Serial (o SDA). La línea SCL es la señal de reloj que sincroniza la transferencia de datos entre dispositivos en el bus I2C y es generada por el dispositivo maestro. La otra línea es la línea SDA que transmite los datos.

Las dos líneas son de “drenaje abierto”, lo que significa que se deben conectar resistencias pull-up a ellas para que las líneas estén altas, ya que los dispositivos en el bus I2C están activos en nivel bajo. Los valores comúnmente utilizados para las resistencias varían desde 2K para velocidades más altas, alrededor de 400 kbps, hasta 10K para velocidades más bajas, alrededor de 100 kbps.

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

protocolo I2C

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

La>

Echemos un vistazo más de cerca a estos eventos. La condición de inicio ocurre cuando la línea de datos cae a BAJO mientras la línea de reloj aún está ALTA. Luego, el reloj comienza y cada bit de datos se transmite durante cada pulso de reloj.

La secuencia de direccionamiento del dispositivo comienza con el bit más significativo (MSB) y termina con el bit menos significativo (LSB). En realidad consta de 7 bits, ya que el octavoth El bit se utiliza para indicar si el maestro está escribiendo (lógica baja) o leyendo del esclavo (lógica alta).

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

El>

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

Luego>Hoja de datos del sensor.

Después del direccionamiento, las secuencias de transferencia de datos comienzan desde el maestro o el esclavo en el bit R/W, dependiendo del modo seleccionado. Una vez que los datos se envían por completo, la transmisión finaliza con una condición de parada, que ocurre cuando la línea SDA pasa de bajo a alto mientras la línea SCL está alta.

Ejemplo

Como ejemplo, utilizo la placa de conexión GY-80, que consta de 5 sensores diferentes, y la placa de conexión GY-521, que consta de 3 sensores diferentes. Esto significa que podemos obtener datos de 8 sensores diferentes a través del bus I2C con sólo dos cables.

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

Puede>

  • Acelerador de 3 ejes ADXL345…………………………………………………… Amazon / Banggood / AliExpress
  • 2 en 1: Giroscopio y acelerómetro de 6 ejes MPU6050…………………… Amazon / Banggood / AliExpress
  • 3 en 1: Giroscopio de aceleración de campo magnético de 9 ejes GY-80……… Amazonas
  • 3 en 1: Módulo GY-86 10DOF MS5611 HMC5883L MPU6050……… Banggood / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Así conectaremos los tableros. El pin de reloj serie de la placa Arduino se conectará a los pines de reloj serie de las dos placas de conexión, lo mismo ocurre con los pines de datos serie, y alimentaremos las placas con el pin Gnd y 5V de la placa Arduino. Tenga en cuenta que aquí no utilizamos resistencias pull-up porque las placas de conexión ya las tienen.

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

Ahora,>

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

Ver también
Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Para la placa de conexión GY-521 solo tenemos una dirección, que es hexadecimal 0x68. También podemos obtener o comprobar las direcciones utilizando el Sketch del escáner Arduino I2C que se puede encontrar en el sitio web oficial de Arduino. Entonces, si cargamos y ejecutamos este boceto aquí, obtendremos las direcciones de los dispositivos conectados en el bus I2C.


Número de pieza del sensor Dirección I2C

Dispositivos analógicos ADXL345 0x53 Acelerómetro de 3 ejes ficha de datos

Microelectrónica giroscópica de 3 ejes L3G4200D 0x69 ficha de datos

Magnetómetro de 3 ejes Honeywell MC5883L 0x1E ficha de datos

Ficha técnica del barómetro + termómetro Bosch BMP085 0x77


Después de encontrar las direcciones de los dispositivos, también necesitamos encontrar las direcciones de sus registros internos para poder leer los datos de ellos. Por ejemplo, si queremos leer los datos del eje X del acelerómetro de 3 ejes de la placa de ruptura GY-80, necesitamos encontrar la dirección del registro interno donde se almacenan los datos del eje X. En la hoja de datos del sensor podemos ver que los datos para el eje X en realidad están almacenados en dos registros, DATAX0 con una dirección hexadecimal 0x32 y DATAX1 con una dirección hexadecimal 0x33.

código arduino i2c

Ahora creemos el código que obtiene los datos para el eje X. Usamos la biblioteca Arduino Wire, que debe estar integrada en el boceto. Aquí primero necesitamos definir la dirección del sensor y las dos direcciones de registro interno que determinamos previamente. El Cable.comenzar() La función inicia la biblioteca Wire y también necesitamos iniciar la comunicación en serie ya que estamos usando el monitor en serie para mostrar los datos del sensor.

En el Cinta() Empezaremos con eso Cable.beginTransmission() Función que inicia la transmisión al respectivo sensor, en nuestro caso el acelerómetro de 3 ejes. Entonces con eso Cable.write() Función consultaremos los datos individuales de los dos registros del eje X. El Wire.endTransmission() da por terminada la transferencia y transfiere los datos de los registros. Ahora con eso Cable.requestFrom() Esta función se utiliza para consultar los datos a transferir o los dos bytes de los dos registros.

El Cable.disponible() La función devuelve el número de bytes disponibles para su recuperación. Si este número coincide con los bytes solicitados, en nuestro caso 2 bytes, lo usamos Cable.read() función leemos los bytes de los dos registros del eje X. Al final imprimimos los datos al monitor serial. Aquí están los datos, pero recuerde que son datos sin procesar y requieren algunos cálculos para obtener los valores correctos del eje X. Para obtener más detalles sobre esto, consulte mi próximo tutorial sobre el uso de acelerómetros con la placa Arduino, ya que no quiero sobrecargar este tutorial ya que su objetivo principal era explicar cómo funciona la comunicación Arduino I2C.

/*  
 *  How I2C Communication Protocol Works - Arduino I2C Tutorial
 *  
 *   by Dejan, www.HowToMechatronics.com 
 *   
 */

#include <Wire.h>

int ADXLAddress = 0x53; // Device address in which is also included the 8th bit for selecting the mode, read in this case.

#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Power_Register 0x2D // Power Control Register

int X0,X1,X_out;

void setup() {
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);
  // Enable measurement
  Wire.beginTransmission(ADXLAddress);
  Wire.write(Power_Register);
  // Bit D3 High for measuring enable (0000 1000)
  Wire.write(8);  
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADXLAddress); // Begin transmission to the Sensor 
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  
  Wire.requestFrom(ADXLAddress,2); // Request the transmitted two bytes from the two registers
  
  if(Wire.available()<=2) {  // 
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();   
  }
  
  Serial.print("X0= ");
  Serial.print(X0);
  Serial.print("   X1= ");
  Serial.println(X1);
}Code language: Arduino (arduino)
Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C

En este tutorial aprenderemos cómo funciona el protocolo de comunicación I2C y también realizaremos un ejemplo práctico con la placa Arduino y un sensor que utiliza este protocolo.

Visión General

El bus de comunicación I2C es muy popular y ampliamente utilizado en muchos dispositivos electrónicos porque puede implementarse fácilmente en muchos diseños electrónicos que requieren comunicación entre un dispositivo maestro y múltiples dispositivos esclavos o incluso múltiples dispositivos maestros. La implementación fácil viene con el hecho de que solo se requieren dos cables para la comunicación entre hasta casi 128 dispositivos (112) al utilizar direcciones de 7 bits y hasta casi 1024 dispositivos (1008) al utilizar direcciones de 10 bits.

Cómo funciona I2C

¿Cómo es posible la comunicación entre tantos dispositivos con solo dos cables? Cada dispositivo tiene una dirección única o ID preestablecido para que el maestro pueda elegir con qué dispositivos va a comunicarse. Los dos cables, o líneas, se llaman Reloj Serial (o SCL) y Datos Serial (o SDA). La línea SCL es la señal de reloj que sincroniza la transferencia de datos entre los dispositivos en el bus I2C y es generada por el dispositivo maestro. La otra línea es la línea SDA que lleva los datos. Las dos líneas son «open-drain», lo que significa que se necesitan resistencias de pull-up conectadas a ellas para que las líneas estén en alto debido a que los dispositivos en el bus I2C son activos en bajo. Los valores comúnmente utilizados para las resistencias son desde 2K para velocidades más altas de aproximadamente 400 kbps, hasta 10K para velocidades más bajas de aproximadamente 100 kbps.

Protocolo I2C

La señal de datos se transfiere en secuencias de 8 bits. Entonces, después de que ocurre una condición de inicio especial, viene la primera secuencia de 8 bits que indica la dirección del esclavo al cual se están enviando los datos. Después de cada secuencia de 8 bits sigue un bit llamado Acuse de Recibo. Después del primer bit de Acuse de Recibo en la mayoría de los casos sigue otra secuencia de direccionamiento pero esta vez para los registros internos del dispositivo esclavo. Justo después de las secuencias de direccionamiento siguen las secuencias de datos, tantas como sean necesarias hasta que los datos se envíen por completo y finaliza con una condición de parada especial.

Vamos a echar un vistazo aún más de cerca a estos eventos. La condición de inicio ocurre cuando la línea de datos cae a bajo mientras que la línea de reloj aún está alta. Después de esto, el reloj comienza y cada bit de datos se transfiere durante cada pulso de reloj. La secuencia de direccionamiento de dispositivos comienza con el bit más significativo (MSB) primero y termina con el bit menos significativo (LSB) y está compuesta en realidad por 7 bits porque el octavo bit se utiliza para indicar si el maestro escribirá en el esclavo (bajo lógico) o leerá de él (alto lógico).

El siguiente bit AKC/ NACK es utilizado por el dispositivo esclavo para indicar si ha recibido con éxito la secuencia anterior de bits. Entonces en este momento el dispositivo maestro entrega el control de la línea SDA al dispositivo esclavo y si el esclavo ha recibido la secuencia anterior con éxito, tirará hacia abajo la línea SDA hasta la condición llamada Acuse de Recibo. Si el esclavo no tira de la línea SDA hacia abajo, la condición se llama No Acuse, y significa que no recibió con éxito la secuencia anterior lo que puede ser causado por varias razones. Por ejemplo, el esclavo podría estar ocupado, podría no entender los datos recibidos o comando, no puede recibir más datos, etc. En tal caso, el dispositivo maestro decide cómo proceder.

Luego viene el direccionamiento de registros internos. Los registros internos son ubicaciones en la memoria del esclavo que contienen varias informaciones o datos. Por ejemplo, el acelerómetro ADX345 tiene una dirección de dispositivo única y direcciones adicionales de registros internos para los ejes X, Y y Z. Entonces, si queremos leer los datos del eje X, primero tenemos que enviar la dirección del dispositivo y luego la dirección del registro interno particular para el eje X. Estas direcciones se pueden encontrar en la hoja de datos del sensor.

Después del direccionamiento, comienzan las secuencias de transferencia de datos, ya sea desde el maestro o el esclavo dependiendo del modo seleccionado en el bit R/W. Después de que los datos se envíen por completo, la transferencia terminará con una condición de parada que ocurre cuando la línea SDA pasa de bajo a alto mientras que la línea SCL está alta.

Ejemplo

Como ejemplo, usaré la placa GY-80 que consiste en 5 sensores diferentes y la placa GY-521 que consiste en 3 sensores diferentes. Por lo tanto, podemos obtener datos de 8 sensores diferentes con solo dos cables con el bus I2C.

Puedes comprar estos componentes en cualquiera de los siguientes sitios:

Para más detalles sobre cómo conectar los sensores y el código de Arduino para la comunicación I2C, consulta el artículo original que me ha inspirado para escribir este contenido: How I2C Communication Protocol Works – Arduino I2C Tutorial

3 comentarios en «¿Cómo funciona la comunicación I2C? Tutorial de Arduino e I2C»

Deja un comentario