¿Cómo conectar múltiples dispositivos del mismo dispositivo a un Arduino utilizando I2C?

4

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 la conexión de múltiples dispositivos es completamente factible, siempre que llame a sus respectivas direcciones, el problema que tengo es que debido a que estoy usando dos dispositivos iguales, todos tienen la misma dirección.

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

    
pregunta Kadin

4 respuestas

1

Acabo de leer la hoja de datos, sin algún hardware externo (por ejemplo, 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.

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

Algo que se puede hacer con un poco de hardware y software es tener un IC que bloquee el I2C Serial Clock (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 circuitos simples. 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, pero un magnetómetro de módulo / IC similar que tiene una dirección I2C con código de codificación diferente o al menos la capacidad de cambiarlo (generalmente configuraciones de pin / resistencias externas) para permitir múltiples en el mismo bus.

EDIT: Texas Instruments tiene un documento de solución de problemas de I2C que en la página 8 muestra una manera de haga la multiplexación de una manera más sencilla de lo que describí para dividir el bus I2C en subsecciones para tratar problemas de dirección de esclavos conflictivos como los que tiene.

buena suerte!

    
respondido por el KyranF
1

Maneras comunes:

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

  • Use un hardware i2c buffer / bus switch / multiplexer, etc. Hay muchos nombres para la misma cosa. 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.

Lo suficientemente divertido, ese sensor tiene muchos pines no utilizados que podrían haberse utilizado para establecer una dirección, pero decidieron no hacerlo por alguna razón.

    
respondido por el Passerby
1

El LT4316 es tu respuesta. enlace

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

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

    
respondido por el scld
0

Puedes usar 2 arduino y comunicarte a través de SPI con cada uno de los dispositivos esclavos I2C que alojan.

    
respondido por el jjones

Lea otras preguntas en las etiquetas