Cómo agregar un módulo de sensor I2C adicional en Arduino

Probé el sensor GY-521 en Arduino usando la guía de ( http://playground.arduino.cc/Main/MPU-6050 ). Funcionó bien. ¿Alguien puede guiarme sobre cómo puedo agregar otro módulo GY-521, por favor? Planeo usar un total de cuatro de ellos conectados a mi Arduino Uno. ¿Cómo defino los módulos de sensores adicionales en el programa?

Respuestas (3)

La ruptura del sensor GY-521 es un dispositivo esclavo I2C. Siempre que pueda obtener (o configurar) los sensores adicionales como esclavos I2C con diferentes direcciones de esclavo, se controlarán de la misma manera que el primero, aparte de tener un inicio de comunicación separado para cada uno de los sensores y luego leer los datos. atrás de cada sensor por su dirección I2C.

Desafortunadamente, el MPU-6050 , el IC de la unidad de procesamiento de movimiento en el GY-521, solo admite dos direcciones esclavas I2C, por lo que, en el mejor de los casos, podrá encontrar (o modificar) placas de conexión para admitir estas dos direcciones (por el nivel lógico aplicado al pin AD0 / pin 9 del IC). Si realmente necesita más de 2 dispositivos al mismo tiempo, busque otros dispositivos similares y sus placas de conexión correspondientes.

El cableado físico implica que todos los módulos se conecten en paralelo en los mismos pines que ya usó para controlar el primer módulo, también conocido como bus I2C . Esto solo funcionaría si solo uno de los módulos tiene habilitadas sus resistencias pull-up. En el esquema del módulo, estas resistencias pull-up están marcadas como R4 y R5, de 4,7 kiloohmios cada una.

En la placa GY-521 que se muestra en el enlace proporcionado en la pregunta, las resistencias pull-up parecen ser de 2,2 k cada una, como se ve a continuación:

junta

Sería necesario examinar la placa real que tiene para verificar qué pequeñas partes SMD específicas son las resistencias pull-up en ella: no es demasiado difícil de hacer, ya que están conectadas a las almohadillas de pines de cabecera SDA y SCL.

En todas menos una de las placas de sensores, deberá desoldar esas dos resistencias con cuidado, sin alterar ninguna otra pieza u otras uniones de soldadura en la placa. Si no está acostumbrado a trabajar con componentes SMD, puede que sea mejor empezar practicando primero con algunos tableros de desecho recuperados de impresoras u otro hardware en desuso.


Es demasiado pedirle a alguien que escriba el código por usted, pero hay varios tutoriales de Arduino sobre cómo comunicarse con varios dispositivos I2C que comparten un bus. Busque en el mismo sitio donde encontró la guía para este módulo.

Hola Anindo, gracias por la respuesta. He examinado mis placas y son resistencias de 2.2k. ¿Debo quitar las resistencias de mi segunda placa y conectar la segunda placa a la primera? ¿O hay alguna otra manera sin hacer una alteración física en el tablero, tal vez una modificación del código? Lo siento, nunca antes había hecho la comunicación I2C y estoy confundido. Además, tuve dificultad para entender sus comentarios. Por favor amablemente use simple e inglés. Las oraciones cortas ayudarían. PD Nunca le pedí a nadie que escribiera el programa por mí. Solo espero que alguien me oriente en esto.
@Robert Para usar solo 2 de los módulos, puede intentar sin eliminar los pull-ups: eso causará un valor de pull-up de 1.1 k en las líneas SDA y SCL, lo que puede funcionar. También tendrá que averiguar cómo cambiar la conexión del pin 9 en una de las placas, para cambiar la dirección del dispositivo: consulte la hoja de datos del MPU-6050. Con respecto a simplificar mis palabras: intentaré editar la respuesta más adelante, si señala partes específicas que son difíciles. Gracias por la respuesta.
Hola Anindo, de la hoja de datos descubrí que la dirección esclava del sensor tiene una longitud de 7 bits. El nivel lógico en el pin AD0 del primer y segundo sensor se puede configurar como lógica baja y lógica alta respectivamente. Mientras codifica, puedo definir de la siguiente manera, #define MPU6050_I2C_ADDRESS 0x68 //1er sensor #define MPU6050_I2C_ADDRESS_2 0x69 //2do sensor ¿Estoy en el camino correcto aquí? Todavía no estoy seguro del cableado físico del bus I2C. ¿Puedo conectarlos en paralelo al Arduino? No pude encontrar información sobre esto en la hoja de datos. PD Las oraciones largas se pueden acortar. Gracias.
@Robert Correct: tendría que establecer el valor de la línea AD0 para cada uno de los módulos del código, y luego responderán a las dos direcciones posibles. Necesitará dos pines GPIO del microcontrolador para estos dos pines, o podría usar resistencias para subir el AD0 en uno y bajarlo en el otro. Para cablear los pines I2C, simplemente conecte cada módulo en paralelo.
Gracias Anindo. ¿Puedo simplemente conectar uno de los ADO al Vcc y corto otro a tierra? ¿O necesito usar las resistencias? ¿Cuál es el significado que tienen las resistencias?
Estimado Sr. Anindo Ghosh, Millones de gracias a usted. He conseguido que funcionen los dos módulos sensores.
Estimado Sr. Anindo, acepté su respuesta, sin embargo, no pude votar su respuesta porque me falta 'Reputación'.
re: desoldar SMD, para este caso en particular, ¿no sería más fácil simplemente cortar las resistencias? ¿O crees que correrías un riesgo aún mayor de dañar las cosas que con una plancha?
@RobStarling Eso dependería de la delicadeza de uno con una herramienta de recorte, así como de la calidad de la PCB: los rastros levantados pueden ser una molestia a veces.

Dado que necesita cuatro de estos módulos i2c, que solo admiten dos direcciones (según el pin AD0), tiene cuatro opciones.

El primero es usar múltiples buses i2c en tu Arduino. Hay varias implementaciones de software i2c para Arduinos. Estos son códigos i2c de software (o bitbanged). Agregan gastos generales, pero para la mayoría de los proyectos, debería estar bien. Estos ocupan otros dos pines.

El segundo es usar un chip i2c switch/multiplexor/bus/buffer. Estos chips cambian físicamente entre dos (o más) buses, o usan búfer u otros métodos para permitir que varios buses de un lado se comuniquen en un solo bus del otro lado. Algunos usan una entrada adicional para cambiar, otros son dispositivos i2c en sí mismos (usted envía un mensaje i2c para hacer el cambio).

El tercero y el cuarto son un poco diferentes y requieren un par de pines libres, y depende del chip i2c que esté utilizando. No todos los chips i2c actuarán igual ante esto. El tercero depende de la velocidad que se tarda en reiniciar desde una pérdida de energía, o si se tarda un poco en calibrar. Esto sería desconectar la alimentación de uno de los módulos. Cualquier transistor de señal pequeño o mosfet funcionaría para esto. Dado que el mpu-6050 tiene un procedimiento de encendido recomendado (VDD y luego VLogic), este podría no ser el mejor.

La opción final, los pines ad0 en los cuatro módulos se pueden vincular a cuatro gpio libres en el arduino, y luego puede cambiar el ad0 para que solo uno de los dispositivos i2c tenga la dirección única a la vez. Tres tendrían la misma dirección 0x68 (AD0 bajo), el cuarto tendría 0x69 (AD0 alto), lea el sensor, luego cámbielo para que el tercero tenga la dirección 0x69, léalo, enjuague y repita la espuma. Esto agrega solo un pequeño código a su proyecto sin requerir piezas adicionales. Es posible que esto no funcione si lo hace demasiado rápido, o si al ic no le gusta que se cambie el pin AD0 después del encendido, pero es la forma más económica y sencilla.

Opción 3b) use 2 transistores en lugar de cada uno, para cambiar las líneas i2c en lugar de energía. Funcionaría eso? ¿Qué pasa con solo SDA, si elimina casi todos los pullups en SCL?

No creo que pueda agregar 4 dispositivos I2C idénticos ya que sus ID de dispositivo de bus serán las mismas. ¿Por qué necesitarías 4 acelerómetros? ¿Uno te da todos los ejes de movimiento?

Gracias por la respuesta. Estoy construyendo un exoesqueleto de miembros inferiores. Estoy colocando 2 del módulo sensor en una pierna, muslo y espinilla. Los otros dos se colocan en la otra pierna para recibir retroalimentación mientras controlo los motores.
En realidad, para la mayoría de los dispositivos, puede colocar más de uno en el mismo bus I2C. Solo una parte de la dirección está codificada en el dispositivo. Algunos bits se pueden configurar a través de pines externos.