25/10/2011
La librería Wire.h en Arduino es esencial para la comunicación I2C, un protocolo de comunicación serie multimaestro que permite que varios dispositivos se comuniquen en un mismo bus. Este artículo explorará a fondo esta librería, sus funciones y cómo utilizarlas para programar eficientemente tus proyectos con Arduino.

¿Qué es la Librería Wire.h?
Wire.h no es una librería I2C en sí misma, sino una interfaz simplificada desarrollada por Atmel (el fabricante del microcontrolador AVR que impulsa Arduino) llamada “Two Wire Interface” o TWI, que facilita la interacción con el protocolo I2C. Esta librería abstrae la complejidad del protocolo, proporcionando funciones fáciles de usar para programar la comunicación I2C en Arduino. Su ubicación en el IDE de Arduino es: C:\Users\{username}\AppData\Local\Arduino15\packages\arduino\hardware\avr\{version}\libraries\Wire\src\Wire.h (puede variar según la versión del IDE y sistema operativo).

A nivel interno, Wire.h se apoya en otros archivos (Wire.cpp, twi.h, twi.c) que gestionan las interacciones a bajo nivel con el microcontrolador. Esto permite a los desarrolladores escribir código legible y fácil de mantener sin necesidad de lidiar con los detalles de bajo nivel del protocolo I2C.
Funciones Principales de la Librería Wire.h
La librería Wire.h proporciona nueve funciones clave para la comunicación I2C. Estas funciones se pueden agrupar en dos categorías: funciones para el modo maestro y funciones para el modo esclavo.
Funciones en Modo Maestro
En modo maestro, Arduino controla la comunicación I2C. Las funciones principales son:
- Wire.begin() : Inicializa la comunicación I2C. Esta función es esencial y debe llamarse antes de cualquier otra función de la librería Wire.h . Dentro de esta función, se utiliza
twi_init()para configurar la velocidad de la comunicación I2C y las interrupciones necesarias. - Wire.begin(intAddress) : Inicializa la comunicación I2C en modo esclavo.
intAddresses la dirección I2C de 7 bits que se asignará a Arduino. - Wire.beginTransmission(intAddress) : Inicia una transmisión de datos al dispositivo esclavo especificado por
intAddress. Esta función prepara el envío de datos, pero no los envía todavía. - Wire.write(various options) : Escribe datos en el búfer de transmisión. Se pueden enviar datos de varios tipos: enteros, cadenas de caracteres o un array de bytes. El tamaño máximo de datos por transmisión es de 32 bytes.
- Wire.endTransmission(boolStop) : Envía los datos en el búfer de transmisión.
boolStop(TRUE/FALSE) indica si se debe generar una condición de parada (STOP) o un inicio repetido (repeated start). Esta función devuelve un valor que indica el estado de la transmisión (éxito, error, etc.):Valor Retornado Descripción 0 Éxito 1 Datos exceden el tamaño del buffer 2 NACK en la transmisión de dirección 3 NACK en la transmisión de datos 4 Otro error - Wire.requestFrom(intAddress, intLength, boolStop) : Solicita datos desde el dispositivo esclavo especificado por
intAddress.intLengthespecifica la cantidad de bytes a recibir.boolStopindica si se debe generar una condición de parada o un inicio repetido. - Wire.read() : Lee un byte de datos del búfer de recepción. Esta función debe utilizarse después de
Wire.requestFrom().
Funciones en Modo Esclavo
En modo esclavo, Arduino responde a las solicitudes de un maestro. Las funciones principales son:
- Wire.onRequest(FunctionName) : Define la función que se ejecutará cuando un maestro solicite datos al esclavo.
- Wire.onReceive(FunctionName) : Define la función que se ejecutará cuando un maestro envíe datos al esclavo.
- Wire.available() : Devuelve la cantidad de bytes disponibles en el búfer de recepción del esclavo.
Consultas Habituales y Solución de Problemas
Algunas de las preguntas más frecuentes relacionadas con la librería Wire.h incluyen:
- ¿Por qué no funciona mi comunicación I2C? : Verificar la correcta inicialización (
Wire.begin()), las direcciones I2C de los dispositivos, la conexión física y la ausencia de conflictos de direcciones. - ¿Cómo manejar errores en la transmisión? : Utilizar el valor retornado por
Wire.endTransmission()para detectar y manejar errores en la comunicación. - ¿Cómo enviar más de 32 bytes? : Enviar los datos en múltiples transmisiones, utilizando la condición de inicio repetido (repeated start).
- ¿Cómo depurar la comunicación I2C? : Utilizar un analizador lógico o un osciloscopio para monitorizar las señales SDA y SCL.
Tabla Comparativa de Funciones
| Función | Modo | Descripción | Retorno |
|---|---|---|---|
Wire.begin() | Maestro | Inicializa I2C | Ninguno |
Wire.begin(intAddress) | Esclavo | Inicializa I2C como esclavo | Ninguno |
Wire.beginTransmission(intAddress) | Maestro | Inicia transmisión | Ninguno |
Wire.write(...) | Maestro | Escribe datos | Ninguno |
Wire.endTransmission(boolStop) | Maestro | Termina transmisión | Estado de la transmisión |
Wire.requestFrom(intAddress, intLength, boolStop) | Maestro | Solicita datos | Ninguno |
Wire.read() | Maestro | Lee un byte | Byte leído |
Wire.onRequest(FunctionName) | Esclavo | Define función para solicitud de datos | Ninguno |
Wire.onReceive(FunctionName) | Esclavo | Define función para recepción de datos | Ninguno |
Wire.available() | Esclavo | Bytes disponibles | Número de bytes |
Recuerda que la correcta implementación de la librería Wire.h es crucial para el éxito de tus proyectos basados en comunicación I2C con Arduino. Este artículo proporciona una base sólida para comprender y utilizar sus funciones de manera efectiva.
Si quieres conocer otros artículos parecidos a Librería wire.h en arduino de comunicación i2c puedes visitar la categoría Libros y Librerías.
