Wire
Contenido
Descripción
La librería Wire.h le permite comunicarse con dispositivos I2C. Usa dos lineas: SDA (datos) y SCL (reloj).
Nota: A partir de Arduino 1.0, la biblioteca hereda de la clase Stream, lo que la hace compatible con otras bibliotecas de lectura/escritura. Debido a esto, send() y receive() han sido reemplazados por read() y write().
Placas aplicables
Arduino | Pin SDA | Pin SCL |
---|---|---|
UNO, Ethernet | A4 | A5 |
MEGA | 20 | 21 |
Leonardo | 2 | 3 |
Debido | 20 | 21 |
Sintaxis
#include <Wire.h> Wire.begin();
Métodos
Métodos | Descripción |
---|---|
Wire.begin() | Inicie la libreria Wire y únase al bus I2C como maestro o esclavo. Esto normalmente debería llamarse solo una vez. |
Wire.beginTrasnmission() | Comience una transmisión al dispositivo esclavo I2C con la dirección dada. Posteriormente, coloque los bytes de cola para la transmisión con la función write() y transmítalos llamando a endTransmission(). |
Wire.read() | Recibe datos de un dispositivo esclavo en respuesta a una solicitud de un maestro, o pone en cola los bytes para la transmisión de un dispositivo maestro a esclavo. |
Wire.write() | Envía datos de un dispositivo esclavo en respuesta a una solicitud de un maestro, o pone en cola los bytes para la transmisión de un dispositivo maestro a esclavo. |
Wire.endTransmission() | Termina comunicación y libera pines. |
Comentarios
La libreria estándar de I2C para Arduino es Wire. Si bien esta libreria es suficiente la mayor parte del tiempo cuando desea comunicarse con dispositivos, hay situaciones en las que no es aplicable:
- Los pines de I2C (SDA/SCL) ya están en uso para otros fines,
- el código se ejecutará en un procesador ATtiny con 1 MHz en pines arbitrarios,
- tiene poca memoria (flash y RAM), o
- no desea usar las resistencias de activación habilitadas implícitamente porque sus dispositivos se ejecutan con 3 voltios.
Se adapto la libreria I2C de Peter Fleury que está escrito en ensamblador AVR, de peso extremadamente ligero (< 500 bytes de flash) y muy rápido. Incluso con un ATtiny de 1 MHz, uno todavía puede operar el bus con 33 kHz, lo que implica que puede controlar dispositivos esclavos que usan el protocolo SMBus (tiempo de espera si la frecuencia del bus es inferior a 10 kHz).
Si desea que se ejecute una solución en una MCU ARM (Due, Zero, Teensy 3.x), desea usar los pines en el puerto H o superior en un ATmega256, o si desea usar muchos buses I2C diferentes, esta biblioteca no es la solución adecuada para usted. En estos casos recomiendo SlowSoftI2CMaster, otra libreria I2C escrita en C++.
Advertencias
Hay versiones de 7 y 8 bits de direcciones I2C. 7 bits identifican el dispositivo, y el octavo bit determina si se está escribiendo o leyendo. La libreria Wire usa direcciones de 7 bits en todo momento. Si tiene una hoja de datos o un código de muestra que usa una dirección de 8 bits, querrá soltar el bit bajo (es decir, desplazar el valor un bit hacia la derecha), obteniendo una dirección entre 0 y 127. Sin embargo, las direcciones de 0 a 7 no se usan porque están reservados, por lo que la primera dirección que se puede usar es 8. Tenga en cuenta que se necesita una resistencia de pull-up al conectar los pines SDA/SCL.
Ejemplo 1
#include <Wire.h>
byte valor = 0 ;
void setup() {
Wire.begin(); //unirse al bus i2c (dirección opcional para el maestro)
}
void loop() {
Wire.beginTransmission(44); //transmitir al dispositivo N° 44 (0x2c)
//la dirección del dispositivo se especifica en la hoja de datos
Wire.write(byte (0x00)); //envía un byte de instrucción
Wire.write(valor); //envía el valor del potenciómetro Byte
Wire.endTransmission(); //deja de transmitir
val ++; //incrementa el valor
if (valor == 64){ //si se alcanza la posición 64 (max)
valor = 0 ; //comienza desde el valor más bajo
}
delay(500) ;
}
Ejemplo 2
Conectar dos Arduinos y que el maestro envie una secuencia y el esclavo la ejecute. En este caso usaremos 3 LED en los pines 11, 12 y 13 del esclavo. En el maestro ponemos este código.
#include <Wire.h>
const byte pin[] = {11, 12, 13};
byte estado = 0;
void setup() {
Wire.begin(); //Iniciamos maestro
}
void loop() {
for (byte i=0; i<3; i++){
Wire.beginTransmission(1); //Nos queremos comunicar con el esclavo 1
Wire.write(pin[i]); //Enviamos primer byte, será el pin a encender
Wire.write(estado); //Enviamos segundo byte, sera el estado 0/1
Wire.endTransmission(); //Paramos la transmisión
delay(1000);
}
if (estado == 0){
estado = 1;
}else{
estado = 0;
}
}
Para el esclavo tendremos:
#include <Wire.h>
void setup() {
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
Wire.begin(1); //Unimos este dispositivo al bus I2C con dirección 1
Wire.onReceive(recive); //Evento a ejecutar al detectar recepcion
}
void loop() {
delay(100);
}
//Función que se ejecuta cada Wire.endTransmission() del maestro para recibir lo que manda con Wire.write().
void recive() {
byte pin = 0;
byte estado = 0;
if (Wire.available() == 2){
pin = Wire.read(); //Leemos primer byte que sera pin
Serial.print("LED: ");
Serial.println(pin);
estado = Wire.read(); //Leemos segundo byte que sera estado
Serial.print("Estado: ");
Serial.println(estado);
}
digitalWrite(pin, estado); //Prende o apagar LED
}
Vea también
Referencias externas
- Wire
- I2C - Nick Gammon
- Bus I2C - Enrique Crespo
- Soft I2C Master - otra libreria I2C
- Conectar 2 Arduino con I2C - Luis Del Valle