El Bus I2C en Arduino

        LUIS LLAMAS Ingeniería, informática y diseño TUTORIALES ARDUINO TUTORIALES ARDUINO BASICOS EL

Views 128 Downloads 7 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

















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 2 3 4 5 6 7 8 9 10

Wire.begin() // Inicializa el hardware del bus Wire.beginTransmission(address); //Comienza la transmisión Wire.endTransmission(); // Finaliza la transmisión Wire.requestFrom(address,nBytes); //solicita un numero de bytes al esclavo en la dirección address Wire.available(); // Detecta si hay datos pendientes por ser leído s Wire.write(); // Envía un byte Wire.read(); // Recibe un byte 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 2 3 4 5 6

#include "Wire.h" extern "C" { #include "utility/twi.h" }

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  2 years ago

 Reply

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  1 year ago

 Reply

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  1 year ago

 Reply



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_?  1 year ago

 Reply

Jose cordovez Como implementar el bus secundario para usar varios dispositivos iguales con la misma direccion de hardware?  1 year ago

 Reply

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  1 year ago

 Reply

Luis



Hola. Puedes comenzar por ver el tutorial sobre el MCP4725 aqui https://www.luisllamas.es/salida-analogica-real-con-arduino-y-dacde-12bits-mcp4725/  1 year ago

Reply

Ivan Hay un error en la velocidad, deben ser khz no son Mhz  5 months ago

Reply



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!  6 months ago

 Reply



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 61 I/Os from 5V to 230V and countless… Anuncio

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 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) { byte rc; byte data = 0; for( byte addr = from_addr; addr