Go Down

Topic: Conectar dos dispositivos por I2C (Read 431 times) previous topic - next topic

Aspana

Dec 22, 2018, 02:37 pm Last Edit: Dec 22, 2018, 03:02 pm by Aspana
Hola,

Tengo los siguientes componentes:

Un Arduino Nano, (cuyos pines I2C entiendo que son el A4 y el A5).

Un conversor Analogico Digital de 16 bits (CAD) ADS1115 que se conecta por I2C a Arduino.

Un display que se conecta por I2C a Arduino.

La duda que me surge es si se puede emplear el mismo arduino nano para recibir los datos del CAD y a la vez mostrarlos por el display conectados ambos a los mismos pines I2C. En caso afirmativo os pido ayuda de como se enfocaría el problema.

Muchas gracias por adelantado.

surbyte

Si Sr. se puede porque justamente el protocolo I2C fue pensando para interconectar dispositivos.
Cada dispositivo tiene una dirección hexadecimal diferente.
Las librerías necesarias suelen usar la dirección x defecto de cada dispositivo pero si tienes dudas existe un programa disponible en tu IDE que se llama I2CScanner.ino que te dirá cuales son las direcciones.

Conecta todo al mismo bus I2C.

Aspana

#2
Dec 22, 2018, 03:58 pm Last Edit: Dec 22, 2018, 04:00 pm by Aspana
Perfecto, muchas gracias.

Me ha parecido ver en algún esquema una resistencia de pull-up conectada en los pines scl y sda y en otros esquemas no las he visto. ¿Es necesario?, y en caso afirmativo, ¿Se podría hacer por SW para ambos pines a4/a5?

surbyte

Todos los componentes vienen con las resistencias Pull up adecuadas.
Sin embargo, si tu compras un integrado que se conecta por I2C y tienes que armar toda la electrónica tiene sentido que incorpores las resistencias Pull up adecuadas, de lo contrario no hace falta.

IgnoranteAbsoluto

Los dispositivos I2C no suelen traer las dos resistencias pull-up, sino que se han de poner en el montaje que se haga. Esto es así porque, si cada dispositivo trae ya las resistencias, por cada uno de ellos se añadiría una resistencia en paralelo con las demás, siendo la resistencias resultante menor que la necesaria (incluso muchísimo menor a lo recomendable en el caso de haber muchos dispositivos).

Supongamos que cada dispositivo viene con una resistencia de 1k para cada pin. Si ponemos dos dispositivos tendríamos dos resistencias de 1k en paralelo siendo su valor resultante en el circuito el equivalente a una resistencia de 500 ohmios. Sí en lugar de dos dispositivos tenemos cuatro, cada uno con sus resistencias pull-up, entonces el valor de la resistencia resultante sería de 250 ohmios. Y si hubieran ocho dispositivos la resistencia sería 125 ohmios, etc.

¿Y si los fabricantes sólo pusieran las resistencias en los dispositivos "maestros" y no en los "esclavos"? Bueno, en tal caso la mayoría de las veces estaríamos a salvo de tener resistencias en paralelo. Pero hay que recordar que el I2C es un protocolo que permite conectar más de un "maestro" en el mismo bus. Así que podría darse el caso de volver a tener resistencias en paralelo que nos disminuyen el valor efectivo de las resistencias pull-up.

Es por ello que lo más coherente es no fabricar dispositivos I2C con las resistencias pull-up. Sino que las dos resistencias necesarias se añadan aparte en el montaje final.

¿Y son necesarias? Con algunos dispositivos podrían funcionar en algunos montajes sin dar problemas o darlos aleatoriamente. Otros directamente no funcionan sin ellas. Así que lo mejor es añadir las dos resistencias al circuito y listo.

¿Los valores adeudados? Ni idea. Buscar en Google.

surbyte

Cuantos esquemas de dispositivos I2C te debo mostrar para que te convenza que los módulos traen su resistencia pull-up @IgnoranteAbsoluto?

Veamos el habitual RTC DS1307



Tiene dos resistencias de 10k.

A tu favor el DS3231 no las trae (y eso me acaba de dar una respuesta a un problema que luego explicaré)



El bmp280


Modulo LCD I2C tiene adaptadores de nivel y por ende resistencias pull-up


El módulo de luz digital BH1750 tiene adaptadores de nivel y por ende resistencias pull-up


MPU6050 otro mas con adaptadores de nivel.


Mis conclusiones: hay que observar cada caso!

En caso de disponer de muchos dispositivos y experimentar problemas observar cada uno si dispone o no de R pull-up.
Ver que dice la norma I2C y si el paralelo de las R pull-up cae por debajo del mínimo permitido entoces retirar las R pull-up mas bajas (4k7) y si se encuentran valores menores a 4k7 entonces que sean éstos primero. El paralelo hará su trabajo por todos.

Este análisis me ha permitido detectar un problema con un módulo DS3231 que se comporta extraño, y tal vez se daba a esto, ya que es el único de los habituales (que yo uso) que no tiene Resistencias.

IgnoranteAbsoluto

Sin duda alguna surbyte tienes toda la razón cuando dices que hay que estudiar cada caso. Ya me sospechaba que no todo fabricante de kits toma la decisión de no poner las resistencias. Más de una vez he hecho algún montaje sin las resistencias y ha funcionado sin problemas. También más de una vez me he visto obligado a ponerlas porque no funcionaban sin ellas.

Gracias por confirmarme, con los ejemplos que pones, que algunos las ponen y otros no.

Personalmente entiendo aquellos que las ponen porque usan adaptadores de nivel. Lo que no entiendo es que las pongan los que no llevan adaptadores de nivel ya que, como comenté, si cada dispositivo las pone se podría dar en total un valor demasiado bajo y aunque funcione correctamente, su consumo sería mayor de lo necesario. Al menos algunos las ponen de un valor relativamente alto (10k) con lo que el efecto es menor.


surbyte

Adaptadores de nivel solo hacen falta en aquellos dispositivos 3.3V que no los tengan y que no sean 5V tolerantes. Eso es dificil para el novato, es un tema para un tecnico o ingeniero electrónico o bien para quien presta atención a esos detalles.

Resumiento y para no complicar las cosas:

Si un módulo  es 3.3 o tiene regulador 5 a 3.3V entonces hay que prestar atención a su hoja de datos para saber si tiene adaptadores de nivel o no.
Si los tiene, se puede conectar a un Arduino 5V sin problemas.
Si no los tiene entonces observar si el dispositiivo es 5V tolerante es decir si sus entradas no se dañan al recibir valores de 5V.
No tenemos que preocuparnos por lo que le llega a un arduino ya que 3.3V esta por encima de la tensión minima reconocida como nivel alto pero si al revés.


Go Up