en este tutorial aprenderemos cómo funciona el protocolo de comunicación I2C y también haremos un ejemplo práctico de ello con la placa Arduino y un sensor que utiliza este protocolo. Puede ver el siguiente video o leer el tutorial escrito a continuación.,
el bus de comunicación I2C es muy popular y ampliamente utilizado por muchos dispositivos electrónicos porque se puede implementar 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. Las implementaciones fáciles vienen con el hecho de que solo se requieren dos cables para la comunicación entre hasta casi 128 (112) dispositivos cuando se utiliza el direccionamiento de 7 bits y hasta casi 1024 (1008) dispositivos cuando se utiliza el direccionamiento de 10 bits.,
Cómo Funciona
¿Cómo es posible, una comunicación entre tantos dispositivos con sólo los cables? Bueno, cada dispositivo tiene un ID preestablecido o una dirección de dispositivo única para que el maestro pueda elegir con qué dispositivos se comunicarán.
los dos cables o líneas se llaman Serial Clock (O SCL) y Serial Data (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 de» drenaje abierto», lo que significa que las resistencias pull up deben estar unidas a ellas para que las líneas sean altas porque los dispositivos en el bus I2C están activos bajo. Los valores comúnmente utilizados para las resistencias son de 2K para velocidades más altas a aproximadamente 400 kbps, a 10k para velocidades más bajas a aproximadamente 100 kbps.
Protocolo I2C
La señal de datos se transfiere en secuencias de 8 bits., Entonces, después de que ocurra una condición especial de inicio, viene la primera secuencia de 8 bits que indica la dirección del esclavo al que se envían los datos. Después de cada secuencia de 8 bits sigue un bit llamado Acknowledge. Después del primer bit de reconocimiento en la mayoría de los casos viene otra secuencia de direccionamiento, pero esta vez para los registros internos del dispositivo esclavo. Justo después de las secuencias de direccionamiento sigue las secuencias de datos hasta que los datos se envían por completo y termina con una condición de parada especial.
echemos un vistazo aún más de cerca a estos eventos., La condición de inicio se produce cuando la línea de datos cae baja mientras que la línea de reloj sigue siendo alta. Después de esto, el reloj comienza y cada bit de datos se transfiere durante cada pulso de reloj.
el dispositivo que direcciona la secuencia se estrella con el bit más significativo (MSB) primero y termina con el bit menos significativo (LSB) y en realidad está compuesto por 7 bits porque el 8vo bit se usa para indicar si el maestro escribirá en el esclavo (lógica baja) o leerá de él (lógica alta).,
el siguiente bit AKC / NACK es utilizado por el dispositivo esclavo para indicar si ha recibido correctamente la secuencia anterior de bits. Así que en este momento el dispositivo maestro entrega el control de la línea SDA al dispositivo esclavo y si el dispositivo esclavo ha recibido con éxito la secuencia anterior, tirará de la línea SDA hacia abajo a la condición llamada Acknowledge., Si el esclavo no tira de la línea SDA hacia abajo, la condición se llama Not Acknowledge, 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 el comando, no puede recibir más datos, etc. En tal caso, el dispositivo maestro decide cómo proceder.
el siguiente es el direccionamiento de los registros internos. Los registros internos son ubicaciones en la memoria del esclavo que contienen información o datos diversos., Por ejemplo, el acelerómetro ADX345 tiene una dirección de dispositivo única y direcciones de registros internos de adición para los ejes X, Y Y Z. Así que si queremos leer los datos del eje X, primero necesitamos 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, las secuencias de transferencia de datos comienzan 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 baja a alta mientras que la línea SCL es alta.
Arduino i2c Example
como ejemplo utilizaré el GY-80 breakout board que consta de 5 sensores diferentes y el GY-521 breakout board que consta de 3 sensores diferentes. Así que podemos obtener datos de 8 sensores diferentes con solo dos cables con el bus I2C.,
You can get these components from any of the sites below:
- ADXL345 3-Axis Accelerator……………………………………………………… Amazon / Banggood / AliExpress
- 2 in 1: MPU6050 6-Axis Gyroscope & Accelerometer ………………… Amazon / Banggood / AliExpress
- 3 in 1: GY-80 9-Axis Magnetic Field Acceleration Gyroscope……… Amazon
- 3 in 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Module……… Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.,
así es como conectaremos las placas. El pin de reloj en serie de la placa Arduino se conectará a los pines de reloj en serie de las dos placas de ruptura, lo mismo ocurre con los pines de datos en serie y alimentaremos las placas con la Tierra y el pin de 5V de la placa Arduino. Tenga en cuenta que aquí no estamos utilizando resistencias pull-up porque las placas de ruptura ya tienen.
Ahora, en el fin de comunicarse con estos chips o sensores necesitamos conocer sus direcciones únicas. Podemos encontrarlos en las hojas de datos de los sensores., Para la placa de arranque GY-80 tenemos las siguientes 4 direcciones: un hexadecimal 0x53 para el sensor acelerómetro de 3 Ejes, un hexadecimal 0x69 para el giroscopio de 3 Ejes, un hexadecimal 0x1E para el magnetómetro de 3 ejes y un hexadecimal 0x77 para el sensor barómetro y termómetro.
Arduino y MPU6050 Acelerómetro y el Giroscopio Tutorial
Para la GY-521 breakout board sólo tenemos una dirección y esa es una hexadecimal 0x68., También podemos obtener o verificar las direcciones utilizando el boceto del escáner Arduino I2C que se puede encontrar en el sitio web oficial de Arduino. Así que aquí si cargamos y ejecutamos ese boceto, obtendremos las direcciones de los dispositivos conectados en el bus I2C.,
número de pieza del Sensor dirección I2C
acelerómetro de 3 ejes Analog Devices ADXL345 0x53 Datasheet
3 Axis GyroST Microelectronics L3G4200D 0x69 Datasheet
magnetómetro de 3 ejes Honeywell MC5883L 0x1E Datasheet
barómetro + termómetro Bosch BMP085 0x77 Datasheet
después de haber encontrado las direcciones de los dispositivos, también necesitamos encontrar las direcciones de sus registros internos para leer los datos de ellos., Por ejemplo, si queremos leer los datos para el eje X desde el sensor acelerómetro de 3 ejes de la placa de arranque GY-80, necesitamos encontrar la dirección de registro interno donde se almacenan los datos del eje X. A partir de la ficha técnica del sensor, podemos ver que los datos del eje X se almacenan realmente en dos registros, DATAX0 con una dirección hexadecimal 0x32 y DATAX1 con una dirección hexadecimal 0x33.
Arduino i2c Code
ahora vamos a hacer el código que obtendrá los datos para el eje X., Así que vamos a utilizar la Biblioteca de cables Arduino que tiene que ser incluido en el boceto. Aquí primero tenemos que definir la dirección del sensor y las dos direcciones de registros internos que encontramos anteriormente. cable.la función begin () iniciará la biblioteca de cables y también necesitamos iniciar la comunicación en serie porque usaremos el Monitor en serie para mostrar los datos del sensor.
en el loop () comenzaremos con el Wire.función beginTransmission () que iniciará la transmisión al sensor en particular, el acelerómetro de 3 ejes en nuestro caso. Luego con el cable.,función write () pediremos los datos particulares de los dos registros del eje X. cable.endTransmission () finalizará la transmisión y transmitirá los datos de los registros. Ahora con el cable.función requestFrom () solicitaremos los datos transmitidos o los dos bytes de los dos registros.
El cable.la función available () devolverá el número de bytes disponibles para la recuperación y si ese número coincide con nuestros bytes solicitados, en nuestro caso 2 bytes, utilizando el cable.función read() leeremos los bytes de los dos registros del eje X., Al final imprimiremos los datos en el monitor serie. Aquí está que los datos, pero tenga en cuenta que se trata de datos en bruto y algunas matemáticas es necesario hacer con el fin de obtener los valores correctos del eje X. Puedes encontrar más detalles para eso en mi próximo tutorial para usar acelerómetros con la placa Arduino porque no quiero sobrecargar este tutorial porque su objetivo principal era explicar cómo funciona la comunicación Arduino I2C.