0% encontró este documento útil (0 votos)
123 vistas

El Bus I2C en Arduino

Manejo de la Comunicación Serial I2C en arduino
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
123 vistas

El Bus I2C en Arduino

Manejo de la Comunicación Serial I2C en arduino
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 17

       

LUIS LLAMAS
Ingeniería, informática y diseño

TUTORIALES ARDUINO TUTORIALES ARDUINO BASICOS

EL BUS I2C EN ARDUINO

18 MAYO, 2016

     

En esta entrada veremos el bus I2C, uno de los sistemas de


comunicación disponible en Arduino. En entradas anteriores ya hemos
visto el puerto serie y el bus SPI que, junto al bus I2C, integran los
principales sistemas de comunicación.

El bus I2C tiene interés porque, de forma similar a lo que pasaba con
el bus SPI, una gran cantidad de dispositivos disponen conexión
mediante I2C, como acelerómetros, brújulas, displays, etc.

EL BUS I2C
El estándar I2C (Inter-Integrated Circuit) fue desarrollado por Philips en
1982 para la comunicación interna de dispositivos electrónicos en sus
artículos. Posteriormente fue adoptado progresivamente por otros
fabricantes hasta convertirse en un estándar del mercado.
El bus I2C es síncrono. El maestro proporciona una señal de reloj,
que mantiene sincronizados a todos los dispositivos del bus. De esta
forma, se elimina la necesidad de que cada dispositivo tenga su propio
reloj, de tener que acordar una velocidad de transmisión y mecanismos
para mantener la transmisión sincronizada (como en UART)

El protocolo I2C prevé resistencias de Pull-UP de las líneas a Vcc.


En Arduino veréis que frecuentemente no se instalan estas resistencias, ya
que la librería Wire activa las resistencias internas de Pull-UP. Sin embargo
las resistencias internas tienen un valor de entre 20-30kOhmnios, por lo
que son unas resistencias de Pull-UP muy blandas.

Usar unas resistencias blandas implica que los ancos de subida de la


señal serán menos rápidas, lo que implica que podremos usar velocidades
menores y distancias de comunicación inferiores. Si queremos emplear
velocidades o distancias de transmisión superiores, deberemos poner
físicamente resistencias de Pull-UP de entre 1k a 4K7.

FUNCIONAMIENTO DEL BUS I2C


Para poder realizar la comunicación con solo un cable de datos, el bus
I2C emplea una trama (el formato de los datos enviados) amplia. La
comunicación costa de:

7 bits a la dirección del dispositivo esclavo con el que queremos


comunicar.

Un bit restante indica si queremos enviar o recibir información.

Un bit de validación

Uno o más bytes son los datos enviados o recibidos del esclavo.

Un bit de validación

Con estos 7 bits de dirección es posible acceder a 112 dispositivos


en un mismo bus (16 direcciones de las 128 direcciones posibles se
reservan para usos especiales)
Este incremento de los datos enviados (18bits por cada 8bits de datos)
supone que, en general, la velocidad del bus I2C es reducida. La
velocidad estándar de transmisión es de 100khz, con un modo de alta
velocidad de 400khz.

El estándar I2C de ne otros modos de funcionamiento, como un

 envío de dirección de 8,10 y 12bits, o velocidades de transmisión de


1Mbit/s, 3.4Mbit/s y 5Mbit/s. No suelen ser empleados en Arduino.

VENTAJAS Y DESVENTAJAS DEL I2C


VENTAJAS
Requiere pocos cables

Dispone de mecanismos para veri car que la señal hay llegado

DESVENTAJAS
Su velocidad es media-baja

No es full duplex

No hay veri cación de que el contenido del mensaje es correcto

EL BUS I2C EN ARDUINO


Arduino dispone de soporte I2C por hardware vinculado físicamente
a ciertos pines. También es posible emplear cualquier otro grupo de pines
como bus I2C a través de sofware, pero en ese caso la velocidad será
mucho menor.

Los pines a los que está asociado varían de un modelo a otro. La


siguiente tabla muestra la disposición en alguno de los principales
modelos. Para otros modelos, consultar el esquema de patillaje
correspondiente.

MODELO SDA SCK

Uno A4 A5

Nano A4 A5

Mini Pro A4 A5
Mega 20 21

Para usar el bus I2C en Arduino, el IDE Standard proporciona la


librería "Wire.h", que contiene las funciones necesarias para controlar el
hardware integrado.

Algunas de las funciones básicas son las siguientes

1 Wire.begin() // Inicializa el hardware del bus


2 Wire.beginTransmission(address); //Comienza la transmisión
3 Wire.endTransmission(); // Finaliza la transmisión
4 Wire.requestFrom(address,nBytes); //solicita un numero de bytes al
esclavo en la dirección address
5 Wire.available(); // Detecta si hay datos pendientes por ser leído
6 s
7 Wire.write(); // Envía un byte
8 Wire.read(); // Recibe un byte
9
10 Wire.onReceive(handler); // Registra una función de callback al rec
ibir un dato
Wire.onRequest(handler); // Registra una función de callback al sol
icitar un dato

Existen otras librerías más avanzadas que Wire.h para manejar el bus
I2C, como por ejemplo I2Cdevlib o I2C library.

ESCÁNER DE I2C
En un mundo ideal sabríamos la dirección de dispositivo que
compramos. Pero en algunas ocasiones, sobre todo al comprar en
vendedores chinos, el fabricante no nos facilita la dirección del
dispositivo o incluso lo proporciona de forma incorrecta.

Esta es una circunstancia común y nada preocupante. Para eso


disponemos de un sketch llamado "Scanner I2C" que realiza un barrido
por todas las posibles direcciones del bus, y muestra el resultado en caso
de encontrar un dispositivo en la dirección.

De esta forma podemos determinar cómodamente las direcciones de


los dispositivos desconocidos.

El sketch scanner I2C está disponible en este enlace, o podéis usar la


siguiente versión reducida y traducida.

1 #include "Wire.h"
2
3 extern "C" {
4 #include "utility/twi.h"
5 }
6
NEXT
CONECTAR UN DISPLAY LCD HITACHI A ARDUINO POR BUS I2C

TAMBIÉN TE PUEDE GUSTAR

COMO CAMBIAR LA FRECUENCIA DE UN PWM EN ARDUINO

4 CONSEJOS PARA PROGRAMAR CÓDIGO MÁS LIMPIO EN ARDUINO


MEDIR TENSIÓN, INTENSIDAD Y POTENCIA CON ARDUINO Y INA219

PULSÍMETRO Y OXÍMETRO CON ARDUINO Y MAX30102

CÓMO USAR ARDUINO Y EL IMU 9 EJES L3GD20 + LSM303D


DETECTOR DE MOVIMIENTO CON ARDUINO Y RADAR DE MICROONDAS RCWL-0516

Únete a la conversación...

8  6  0     9

 newest  oldest

luisllamas

Sí, suelo ser parco en comentarios en el código. Es intencionado, y marca


de la casa. Los comentarios son parte del código, y hay que mantenerlos.
Hay que usar sólo los necesarios, y estructurar tu código para que no
hagan falta, si es posible.
Así que no, no soy de esos que ponen un comentario en cada línea de
código

 Reply  2 years ago

Balam

Hola buen día, primeramente muchas gracias por la información que


públicas es de muy buena calidad, ahora yo tengo un problema para
conectar un pulsioximetro MAX30100 y un sensor de temperatura
MLX90614 conectados por separado funcionan, pero al juntarlos ya no
dan señal, ya veri que que tuvieran dirección diferente, no sé qué pasa,
no sé si me podrías ayudar con edo, pero gracias de antemano por la
ayuda que me pudieras brindar

 Reply  1 year ago 

Luis
Prueba metiendo una resistencia de pull-up en SDA y SCL.

Reply  1 year ago

Joaquin

Soy novato y no lo tengo del todo claro, el arduino UNO permite conectar
directamente sensores via I2C, imagino que te re eres al UNO original,
he leido que en algunos modelos de UNO, seguramente no originales,
chinos, hace falta comprar un interfaz adicional para disponer de I2C. A
ver si me puedes aclarar. Gracias por tu extenso conocimiento

 Reply  1 year ago 

Luis

Todos los Arduino, clónicos o no, tienen I2C. El I2C lo da el


procesador Atmel, y los clónicos montan el mismo que los
originales Arduino.

Reply  1 year ago

Douglas

Existe un modo en el que se puedan generar comunicacion i2c por otros


pines q no sean A4y A5_?

 Reply  1 year ago

Jose cordovez

Como implementar el bus secundario para usar varios dispositivos


iguales con la misma direccion de hardware?

 Reply  1 year ago

Marcel

Hola muy buenas,

Gracias por la entrada! Entendi perfectamente como funciona el I2C. Por


otro lado quería preguntar, dices que I2C puede trabajar a una velocidad
de 400 Mhz, yo tengo un DAC MCP4725 que se comunica con arduino por
I2C, mi pregunta es como puedo con gurar el dac o el i2c del dac para
que trabaje en alto rendimiento?

Muchas gracias

 Reply  1 year ago 

Luis
Hola. Puedes comenzar por ver el tutorial sobre el MCP4725 aqui
https://www.luisllamas.es/salida-analogica-real-con-arduino-y-dac-
de-12bits-mcp4725/

Reply  1 year ago

Ivan

Hay un error en la velocidad, deben ser khz no son Mhz

Reply  5 months ago 

Luis

Ups! Gracias por el aviso, ya está corregido

Reply  5 months ago

pablo

buen dia! gracias por la información.


tengo una consulta que me esta dando vueltas a la cabeza hace un buen
tiempo.
conecte el max 30100 al arduino con una dirección i2c 0X57 y funciona
perfecto.
probe con otra placa, el STM32F411 y este no lo reconoce, pero encuentra
otra direccion i2c, la 0XAF. pero cuando envio a esa direccion (supuesta
direccion del MAX30100) no se obtiene ninguna lectura
sabe que podria ser??
gracias!

 Reply  6 months ago 

Luis

Que la librería que estés usando no sea compatible con el


STM32F411

Reply  5 months ago

Jorge

Hola Luis. Gracias por todo lo que pones, estás haciendo una gran labor.
Estoy motorizando un telescopio y me encuentro con un problema en I2c.
Tengo conectado tres elementos por I2c.
Un reloj una pantalla y un Wiichuck.
El caso es que el Wiichuck debería ir alimentado a 3,3v mientras que los
otros van a 5v.... Sería posible poner las pullup a 5v dejando la
alimentación del Wiichuck a 3,3... O tendría que alimentar el Wiichuck a
5v también (puede que aguante)?.
Gracias por todo !
 Reply  5 months ago
Buscar 
NOS VEMOS EN
    

ENCUENTRA LO QUE TE INTERESA


NUESTRAS SECCIONES
INFORMÁTICA

INGENIERIA

PROGRAMACION

TUTORIALES ARDUINO

ZONA GEEK

DESCUBRE LAS ÚLTIMAS ENTRADAS


ENTRADAS RECIENTES
REDUX.NET, UN CONTENDOR DE ESTADO
PARA APLICACIONES .NET
27 SEPTIEMBRE, 2020

INTERACTUA CON EL API DE SMARTLIFE


DESDE .NET CON SMARTLIFENET
24 SEPTIEMBRE, 2020

COMO CAMBIAR LA FRECUENCIA DE UN


PWM EN ARDUINO
20 SEPTIEMBRE, 2020

CÓMO FUNCIONA EL EXTRUSOR DE UNA


IMPRESORA 3D FFF
16 SEPTIEMBRE, 2020

CÓMO SERVIR Y CONSUMIR UN API REST


CON ESP8266, AXIOS Y VUEJS
13 SEPTIEMBRE, 2020

CUMPLIMOS 9 AÑITOS
10 SEPTIEMBRE, 2020

Excepto notación expresa, los contenidos de este sitio se ofrecen bajo


licencia Creative Commons License BY-NC-SA.

Más información

REDUX.NET, UN CONTENDOR DE ESTADO PARA APLICACIONES .NET


27 SEPTIEMBRE, 2020

INTERACTUA CON EL API DE SMARTLIFE DESDE .NET CON SMARTLIFENET


24 SEPTIEMBRE, 2020

COMO CAMBIAR LA FRECUENCIA DE UN PWM EN ARDUINO


20 SEPTIEMBRE, 2020

JUAN
on Cumplimos 9 añitos

Muchas felicidades y muchas gracias por compartir estos conocimientos, te sigo y


leo desde hace…

JESUS
on Salidas y entradas aisladas con Arduino y optoacoplador

Gracias Luis, estuve viendo los opto AC en especial el PC814 creo que me puede…

Copyright ©2018, Todos los derechos reservados

Aviso legal Política de cookies


I2C también se denomina TWI (Two Wired Interface) únicamente
por motivos de licencia. No obstante, la patente caducó en 2006,
 por lo que actualmente no hay restricción sobre el uso del término
I2C.

El bus I2C requiere únicamente dos cables para su funcionamiento,


uno para la señal de reloj (CLK) y otro para el envío de datos (SDA), lo cual
es una ventaja frente al bus SPI. Por contra, su funcionamiento es un poco
más complejo, así como la electrónica necesaria para implementarla.

Anuncio:

CONTROLLINO - 100%
Arduino-compatible
Anuncio Unlimited exibility with up to
Anuncio
61 I/Os from 5V to 230V and countless…
controllino.biz

Learn more

En el bus Cada dispositivo dispone de una dirección, que se


emplea para acceder a los dispositivo de forma individual. Esta dirección
puede ser jada por hardware (en cuyo caso, frecuentemente, se pueden
modi car los últimos 3 bits mediante jumpers o interruptores) o
totalmente por software.

En general, cada dispositivo conectado al bus debe tener una


dirección única. Si tenemos varios dispositivos similares tendremos que
cambiar la dirección o, en caso de no ser posible, implementar un bus
secundario.

El bus I2C tiene una arquitectura de tipo maestro-esclavo. El


dispositivo maestro inicia la comunicación con los esclavos, y puede
mandar o recibir datos de los esclavos. Los esclavos no pueden iniciar la
comunicación (el maestro tiene que preguntarles), ni hablar entre si
directamente.

Es posible disponer de más de un maestro, pero solo uno puede ser


el maestro cada vez. El cambio de maestro supone una alta complejidad,
por lo que no es algo frecuente.
7 void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte
8 address, byte result) )
9 {
10 byte rc;
11 byte data = 0;
12 for( byte addr = from_addr; addr <= to_addr; addr++ ) {
13 rc = twi_writeTo(addr, &data, 0, 1, 0);
14 callback( addr, rc );
15 }
16 }
17
18 void scanFunc( byte addr, byte result ) {
19 Serial.print("addr: ");
20 Serial.print(addr,DEC);
21 Serial.print( (result==0) ? " Encontrado!":" ");
22 Serial.print( (addr%4) ? "\t":"\n");
23 }
24
25
26 const byte start_address = 8;
27 const byte end_address = 119;
28
29 void setup()
30 {
31 Wire.begin();
32
33 Serial.begin(9600);
34 Serial.print("Escaneando bus I2C...");
35 scanI2CBus( start_address, end_address, scanFunc );
36 Serial.println("\nTerminado");
37 }
38
39 void loop()
40 {
41 delay(1000);
}

En una próxima entrada veremos como conectar dos placas Arduino


por bus I2C, y como conectar una placa Arduino con una Raspberry PI.

Si te ha gustado esta entrada y quieres leer más sobre Arduino


 puedes consultar la sección Tutoriales de Arduino

Anuncio:

Looking for An RPi Camera? -


12.3 MP High Quality Module

Anuncio uctronics.com

Learn more

 Arduino,Arduino basico,Comunicación,I2C

PREVIOUS
EL BUS SPI EN ARDUINO

También podría gustarte