Información completa de la librería wire para arduino: comunicación i2c explicada

08/11/2022

Valoración: 4.88 (1065 votos)

La librería Wire en Arduino es fundamental para la comunicación I2C, un protocolo de comunicación serie multimaestro que permite conectar múltiples dispositivos a un microcontrolador. En este tutorial, exploraremos a fondo las funcionalidades de esta librería, desde su configuración inicial hasta el manejo avanzado de datos.

Temario

¿Por qué se llama Wire y no I2C?

Aunque I2C es el nombre del protocolo, Atmel (el fabricante del microcontrolador en el corazón de Arduino) utiliza el término “Two Wire Interface” o “TWI”. Por eso, la librería se denomina Wire. Esta librería abstrae la complejidad del protocolo I2C, facilitando su uso en Arduino.

Archivos de la librería Wire

La librería Wire reside en la carpeta ../Arduino/libraries/Wirede tu IDE de Arduino. Se compone principalmente de cuatro archivos:

  • Wire.h
  • Wire.cpp
  • utility/twi.h
  • utility/twi.c

Wire.hy Wire.cppfacilitan la interacción desde el código Arduino, mientras que twi.hy twi.cmanejan la comunicación a bajo nivel con el microcontrolador.

Inclusión de la librería

Para utilizar las funciones de la librería Wire, debes incluirla en tu código con la directiva #include <Wire.h>. Esta línea debe colocarse al principio de tu programa.

Funciones de la librería Wire

La librería Wire proporciona nueve funciones esenciales para la comunicación I2C. A continuación, se detallan cada una de ellas:

Funciones para actuar como maestro

Wire.begin()

Esta función inicializa la comunicación I2C en el Arduino como maestro. Prepara buffers para el almacenamiento de datos y llama a la función twi_init(), que configura el microcontrolador para la comunicación I2C, incluyendo la velocidad de transmisión.

Wire.begin(intAddress)

Esta función es similar a la anterior, pero configura el Arduino como esclavo (slave) en el bus I2C. intAddresses la dirección I2C de 7 bits que se asignará al Arduino.

Wire.beginTransmission(intAddress)

Inicia una transmisión de datos hacia un dispositivo esclavo con la dirección especificada por intAddress. Prepara la transmisión para una operación de escritura (WRITE).

Wire.write(various options)

Esta función escribe datos en un buffer interno. Se pueden enviar datos de diferentes tipos: enteros, cadenas de caracteres o secuencias de bytes. La cantidad máxima de datos por transmisión es de 32 bytes.

Wire.endTransmission(boolStop)

Envía los datos del buffer hacia el dispositivo esclavo. boolStopindica si se debe generar una condición de parada (Stop Condition, TRUE) o una condición de inicio repetida (Repeated Start Condition, FALSE). Devuelve un valor que indica el estado de la transmisión:

  • 0: SUCCESS
  • 1: DATA EXCEEDS BUFFER LENGTH
  • 2: NACK ON ADDRESS TRANSMIT
  • 3: NACK ON DATA TRANSMIT
  • 4: OTHER ERROR

Wire.requestFrom(intAddress, intLength, boolStop)

Envía una solicitud de lectura de datos al dispositivo esclavo con la dirección intAddress. intLengthespecifica la cantidad de bytes a leer. boolStopfunciona igual que en Wire.endTransmission().

Wire.read()

Lee un byte de datos del buffer de recepción. Debe usarse después de Wire.requestFrom()para obtener los datos recibidos.

comados libreria wire - Qué hace #include wire.h

Funciones para actuar como esclavo

Wire.onRequest(FunctionName)

Define una función ( FunctionName) que se ejecutará cuando un maestro solicite datos al esclavo. Esta función debe preparar los datos que serán enviados al maestro.

Wire.onReceive(FunctionName)

Define una función ( FunctionName) que se ejecutará cuando un maestro envíe datos al esclavo. Esta función procesará los datos recibidos del maestro.

Wire.available()

Devuelve la cantidad de bytes disponibles en el buffer de recepción del esclavo.

Ejemplos de Uso

A continuación, se presentan algunos ejemplos de cómo utilizar estas funciones:

Ejemplo: Leer datos de un sensor I2C

#include <Wire.h> void setup() { Wire.begin(); // Iniciar como maestro Serial.begin(9600); } void loop() { Wire.beginTransmission(0x29); // Dirección I2C del sensor Wire.write(0x00); // Comando para leer datos Wire.endTransmission(); delay(100); Wire.requestFrom(0x29, 2); // Solicitar 2 bytes de datos if (Wire.available() >= 2) { int dato1 = Wire.read(); int dato2 = Wire.read(); Serial.print("Dato 1: "); Serial.println(dato1); Serial.print("Dato 2: "); Serial.println(dato2); } delay(1000); }

Ejemplo: Actuar como esclavo

#include <Wire.h> int datoRecibido = 0; void setup() { Wire.begin(8); // Dirección I2C del esclavo Serial.begin(9600); Wire.onReceive(recibirDatos); } void loop() { // ... } void recibirDatos(int cuantosBytes) { while (Wire.available() > 0) { datoRecibido = Wire.read(); Serial.print("Dato recibido: "); Serial.println(datoRecibido); } }

Tabla comparativa de funciones

Para facilitar la comprensión, se presenta una tabla comparativa de las funciones:

Función Maestro Esclavo Descripción
Wire.begin() Si No Inicializa la comunicación I2C como maestro.
Wire.begin(intAddress) No Si Inicializa la comunicación I2C como esclavo.
Wire.beginTransmission(intAddress) Si No Inicia la transmisión de datos.
Wire.write(datos) Si No Escribe datos al buffer de transmisión.
Wire.endTransmission(boolStop) Si No Envía los datos al esclavo.
Wire.requestFrom(intAddress, intLength, boolStop) Si No Solicita datos al esclavo.
Wire.read() Si Si Lee datos del buffer de recepción.
Wire.onRequest(funcion) No Si Define la función para responder a solicitudes de datos.
Wire.onReceive(funcion) No Si Define la función para procesar datos recibidos.
Wire.available() No Si Devuelve la cantidad de bytes disponibles.

Consultas habituales y resolución de problemas

Aquí se abordan algunas consultas habituales sobre la librería Wire:

comados libreria wire - Qué hace la biblioteca wire en Arduino

  • Problema: No se detecta el dispositivo I2C. Verifica la dirección I2C del dispositivo, la conexión física y el funcionamiento del dispositivo.
  • Problema: Error en la transmisión de datos. Revisa la función Wire.endTransmission() y el valor devuelto. Asegúrate de que la cantidad de datos no excede el límite de 32 bytes.
  • Problema: Retrasos inesperados. Asegúrate de que incluyas las funciones delay() apropiadamente para sincronizar la comunicación.

Recuerda que una correcta comprensión del protocolo I2C es fundamental para utilizar la librería Wire de forma eficiente. Este tutorial proporciona una base sólida para comenzar a trabajar con esta potente herramienta en tus proyectos con Arduino. Para profundizar aún más, se recomienda consultar la documentación oficial de la librería Wire y ejemplos adicionales disponibles en línea.

Si quieres conocer otros artículos parecidos a Información completa de la librería wire para arduino: comunicación i2c explicada puedes visitar la categoría Libros y Librerías.

Subir