¿Cómo conectar varios del mismo dispositivo a un Arduino usando I2C?

Quiero usar dos del mismo magnetómetro (HMC5883L) con mi Arduino, pero no puedo calcular el código para llamar a cada uno de ellos por separado.

He leído en línea que conectar varios dispositivos es completamente factible, siempre y cuando llames a sus respectivas direcciones, el problema que tengo es que, debido a que estoy usando dos del mismo dispositivo, cada uno tiene la misma dirección.

Entonces, mis preguntas son: ¿puedo cambiar la dirección I2C de uno de mis magnetómetros y que no se rompa? ¿Cómo hago esto? ¿Es un cambio permanente? Si es así, ¿puedo revertir el HMC5883L a su valor predeterminado si es necesario?

No tengo tiempo para buscar una respuesta adecuada en este momento, pero después de echar un vistazo a la hoja de datos, creo que es posible cambiar la dirección de una unidad. Mencionan explícitamente la dirección predeterminada de fábrica en un punto.
@AndrejaKo Revisé el manual y no veo ningún mecanismo compatible para cambiar la dirección I2C. Hay 3 registros de identificación, pero estos parecen no estar relacionados con las direcciones de lectura/escritura I2C.
¿De dónde lo compraste? ¿Está en un tablero de ruptura? ¿Hay pines/resistencias/almohadillas de selección de dirección disponibles?
@KyranF Compré este magnetómetro de Sparkfun (ver enlace), no estoy seguro acerca de la selección de dirección, lo siento. sparkfun.com/products/10530
El hecho de que no esté documentado no significa necesariamente que no esté implementado. Podría ser una información NDA. Pero aún habría un problema, ¿cómo cambiar la dirección de un dispositivo si hay dos en el mismo bus?
Eche un vistazo a este traductor de direcciones I2C LTC4316 . Salió hace relativamente poco tiempo.

Respuestas (4)

Acabo de leer la hoja de datos, sin algún hardware externo (como algún tipo de búfer de multiplexación con selección de canal y habilitación de chip) no puede tener dos de estos dispositivos en el mismo bus I2C.

El dispositivo que está utilizando tiene una dirección fija establecida de fábrica. No hay formas de cambiar la dirección por software o incluso por pines externos para ajustar su dirección de bus I2C de 7 bits.

Los AVR ATMEL de 8 bits más complejos, como los XMEGA, tienen múltiples interfaces I2C, por lo que podría tener dos dispositivos, uno por canal. Lo mismo con el simple y más pequeño ARM Cortex M0 -> M3, por ejemplo, todos tienen múltiples interfaces de bus que pueden solucionar este problema.

Algo que se puede hacer con un poco de hardware y software es tener un IC que bloquee el reloj serial I2C (SCL) a uno u otro y alterne cuál recibe las señales del reloj y, por lo tanto, puede recibir y responder a los comandos. Supongo que un simple MOSFET dual con control XOR en las puertas podría hacerlo, con un circuito simple. De lo contrario, algún tipo de controlador de línea/chip de búfer con un pin de habilitación y doble canal/salida multiplexada le permitirá cambiar qué salida recibe la señal SCL.

De cualquier manera no es bonito. Siempre puede encontrar un segundo magnetómetro IC/módulo similar que tenga una dirección I2C codificada diferente o al menos la capacidad de cambiarla (generalmente configuraciones de pines/resistencias externas) para permitir múltiples en el mismo bus.

EDITAR: Texas Instruments tiene un documento de solución de problemas de I2C que en la página 8 muestra una forma de realizar la multiplexación de una manera más simple que la que describí para dividir el bus I2C en subsecciones para lidiar con problemas de dirección de esclavo en conflicto como el que tiene.

¡buena suerte!

Gracias por la respuesta. Me inclino por la solución de multiplexación, ya que me parece la más simple (sin comprar una nueva interfaz). ¿Funcionaría bien algo como el 74HC4051 o tiene alguna otra recomendación?
@ user2222956: busque en la web "I2C Multiplexer" o "Bidireccional I2C Buffer" y encontrará muchas opciones. El 74HC4051 es un multiplexor analógico, es decir, para cambiar entre señales de audio. Revisé la hoja de datos y parece que podría funcionar. Sin embargo, si no fuera así, podría ser difícil de depurar.

Maneras comunes:

  • Utilice dos canales i2c. Ya sea hardware o bitbanged/software i2c. No es un protocolo complicado y hay muchas bibliotecas para esto.

  • Use un búfer i2c de hardware/conmutador de bus/multiplexor, etc. Hay muchos nombres para lo mismo. Algunos están controlados por un gpio externo, otros pueden controlarse a través de su propia dirección i2c.

  • Como mencionó @Jjones, un puente también funcionaría. Los microcontroladores dedicados o de repuesto podrían convertirse en un puente de protocolo, como i2c-spi, o serial-i2c, o lo que sea.

  • Finalmente, muchos fabricantes tienen versiones de direcciones alternativas de los mismos chips.

Curiosamente, ese sensor tiene muchos pines sin usar que podrían haberse usado para establecer una dirección, pero decidieron no hacerlo por alguna razón.

El LT4316 es su respuesta. http://cds.linear.com/docs/en/datasheet/4316fa.pdf

Este increíble pequeño chip es una solución casi pasiva. Simplemente lo usé en un tablero (terminé configurando mi turno en cero y usándolo como un búfer). Lo que quiero decir con casi pasivo es que puede configurar su cambio de dirección i2c con resistencias y el cambio es invisible para su código.

El cambio solo se aplica a la dirección en sí y luego pasa a través de los datos sin cambios.

ingrese la descripción de la imagen aquí

Puede usar 2 arduino y comunicarse a través de SPI con cada uno de los dispositivos esclavos I2C.

Con suerte, te refieres a un arduino básico en lugar de uno de 30 dólares o lo que sea, porque eso tiene que ser doloroso para la billetera.