Arduino como maestro y esclavo usando I2C

Muy buenas a todos,

Aunque llevo tiempo leyendo temas de este foro, es la primera vez que voy a pedir ayuda. Estoy realizando un proyecto que consiste en usar Arduino como "interfaz" entre un robot Mindstorm de LEGO (que se comunica con sus sensores mediante el protocolo I2C) y los sensores del mismo. Es decir, el esquema sería: Robot <--> Arduino <--> Sensor. El primer paso sería conseguir que Arduino fuera transparente en esta comunicación, pero para ello me ha surgido esta duda:

  • Con respecto al robot, Arduino debe ser el esclavo en la comunicación I2C (ya que el Mindstorm sería el maestro), y con respecto a los sensores Arduino debe ser el Maestro. ¿Es posible hacer esto? Se que en principio sólo están las entradas analógicas 4 y 5 como señales de I2C, así que no se muy bien cómo puedo hacerlo.

Si se os ocurre algo os lo agradecería, y sí quereis echarle un ojo al proyecto os paso el link del blog asociado al mismo: http://mindstormsyarduino.blogspot.com/

Muchas gracias!

P.D: Se me olvidó comentar que la placa que voy a usar es la Arduino Mega.

Un problema que veo, es que aún haciendo uso de multi-masters, que en Arduino con un poco de paciencia se podría conseguir, al Lego supongo que no le podrás reprogramar la interfaz I2C.

Una opción fácil y válida, sería conectar el Lego con el Arduino por un bus I2C y el Arduino con los sensores mediante SoftI2C:
http://www.misenso.com/prototyping/two-sht21-softi2c-arduino/76/

Un saludo

Hola,

Ante todo muchas gracias por responder tan rápido :slight_smile: Efectivamente la interfaz del lego no la puedo tocar. Lo de usar SoftI2C es una cosa que no se me había ocurrido, y me ha parecido buena idea :wink: Voy a echarle un ojo y a ver si (ya que ve veo que es algo más lento) no me da problemas con los tiempos de repsuesta y tal (cosa que no creo).

Otra opción que había pensado es isar un esquema tal que así:

LEGO <--> DISPOSITIVO X
|
|
ARDUINO <--> SENSORES

De forma que el dispositivo X sea una especie de registro en el que Arduino va colocando periódicamente los valores que ha leído de los sensores. De la misma forma, el robot iría pidiendo estos datos al "dispositivo X" en lugar de directamente a Arduino. Así Arduino y el robot siempre serían maestros, pero no están directamente conectados. ¿piensas que es posible? ¿hay algún dispositivo que me pudiera hacer esa función de registro?

Voy a seguir explorando ambas vías :slight_smile: De neuvo, muchas gracias!

Ten en cuenta que el "Dispositivo X" debería tener 2 interfaces I2C, y si lo pones pues directamente programas el dispositivo x de ser programable y tampoco he encontrado ningún integrado simple que haga lo que comentas.

Yo probaría lo del SoftI2C, que es lo más barato y fácil de testear.

Sip, llevas razón, estaba justo buscando algún dispositivo que tenga 2 interfaces I2C y que me valiera, pero no lo encuentro. Así que probablemente pruebe con el softI2C y a ver qué tal :slight_smile:
Gracias de nuevo por la ayuda. A ver si consigo que esto eche a andar! Ya iré comentando los progresos.

Y si te fabricas una plaquita con un ATMega(que venga con el bootloader Arduino) que haga SPI <--> I2C para tu dispositivo X??
Como hace el Dangerous prototypes por el puerto serie, pero por SPI...

Chiva, no habias hecho algo asi para Arduino Serie <--> I2C?? Como ves el tema de hacerse un bridge Arduino SPI <--> I2C?

[edit]
Podrias usar el oscilador interno para no tener que poner cristal y que sea un "chip dedicado" Minimal Arduino with ATmega8 – todbot blog

[/edit]

El principal problema del SPI es que no hay un estándar y cada sensor manda las cosas de manera distinta. Unos mandan el LSB y luego el MSB y otros al revés, unos mandan el dato con flanco ascendente y otros con flanco descendente...
Pero poder se podría, como bien dices sería basarse en el Arduino Serie <--> I2C para pasar a SPI <--> I2C, pero si no tengo tiempo ni para el primero, no quiero ni pensar como avanzaría el segundo (aunque me lo dejo en la recámara ;D). Además por el tema de las diferencias de cada sensor habría que meter algún tipo de archivo de configuración, ya sea en un header, la eeprom o una sd para así configurar la interfaz SPI.

Un saludo

Bueno, lo decia por que si lo hiciese cstockmans a su medida..... :wink:

Como una opcion mas para tener dos I2C en su sistema,ya que solo necesitas un micro usando el resonador interno para hacerte la pasarela, y te ayudas de toda la libreria Wire de Arduino para hacerlo rapido. Ya que Arduino tambien esta preparado para 8 MHz y no hay que modificar nada.

Sin mas, otra idea diferente.....

:smiley:

Por cierto,"Minimal circuit", esta explicado en el Tutorial de la propia pagina Arduino

:wink:

Bueno, lo del SPI tampoco lo había considerado, así que le echaré un ojo mañana a ver qué tal. Aunque por lo que comentais, puede suponer un problema ya que la idea cuando el proyecto avance no es conectar un sólo tipo de sensor, sino distintos tipos, con lo cual puede complicar bastante la cosa si como decís, cada sensor actúa de una manera. Me parece que finalmente me voy a decantar por el softI2C, aunque como digo miraré todas las opciones antes de decidirme.

Por cierto,"Minimal circuit", esta explicado en el Tutorial de la propia pagina Arduino
http://arduino.cc/en/Tutorial/ArduinoToBreadboard

Gracias por el enlace :slight_smile: Está muy bien explicado, y visto así, hasta parece fácil ;D

De neuvo gracias a todos por las ideas, me estais siendo de gran ayuda :slight_smile:

Bueno, he dixo SPI por el tema de que lo hagas rápido, ya que el SPI no te hace de "cuello de botella" porque va a Mhz. También lo puedes comunicar con tu Arduino principal por comunicación serie....

Es decir, hacerte en un micro una pasarela Serie <->I2C ó SPI <->I2C.

Asi a priori, marcandome un triple, no me parece complicado.
Transforming your AVR Microcontroller to the I2C or TWI Slave I/O Expander Project | ermicroblog y How to use I2C-bus on the Atmel AVR Microcontroller | ermicroblog

Sin más, ahora a investigar y probar..... :wink:

Bueno, he dixo SPI por el tema de que lo hagas rápido, ya que el SPI no te hace de "cuello de botella" porque va a Mhz

Sip, es una buena alternativa. Mañana con las especificaciones de los sensores en mano compararé velocidades y veré en qué rango me tengo que mover. Siempre es bueno tener varias opciones, y esta desde luego es buena :slight_smile:

Sin más, ahora a investigar y probar..... :wink:

Pues sí, a ello me pongo :wink: Ya os iré contando los avances, y qué método ha sido finalmente el elegido :smiley:

He buscado por curiosidad, y como era de esperar, ya existen integrados "bridge" de SPI a I2C.

The SC18IS600/601 acts as a bridge between a SPI interface and an I2C-bus. It allows a SPI master device to communicate with I2C-bus slave devices.
http://ics.nxp.com/support/boards/sc18is600/

Parece que lo venden en DigiKey.

No he buscado más, era solo para quitarme la inquietud... :wink:
Para que lo tengas en la recamara.... ;D

Pues mira, eso simplifica un poquito más las cosas :slight_smile: Le echaré un ojo a ver qué tal, y como tengo que pedir cosillas a esa página, a ver si lo incluyo en el pedido :sunglasses:

He encontrado en este mismo foro una referencia a una librería llamada softi2cmaster, que ha creado un usuario para un proyecto. ¿La conoceis? Parece sencilla y fácil de usar. Por si os interesa os dejo el link :slight_smile:

http://todbot.com/blog/2010/09/25/softi2cmaster-add-i2c-to-any-arduino-pins/

Ando mirando todas las alternativas, y creo que terminaré decantándome por usar softi2c. No requiere hardware adicional, y será más fácil (creo :P) de compatibilizar con un mayor número de sensores. A ver si uso alguna librería existente, sino tocará picar más código ;D

¿Que si la conozco? Si te la he nombrado en el primer post ;D
Cuando te he dicho lo de Softi2c era por el nombre de esa librería

¿Que si la conozco? Si te la he nombrado en el primer post ;D
Cuando te he dicho lo de Softi2c era por el nombre de esa librería

Vaaaaale xD No había caído :-[ Pensaba que había varias alternativas para hacer lo mismo y... en fin, sin excusas ;D