Go Down

Topic: Arduino como maestro y esclavo usando I2C (Read 5461 times) previous topic - next topic

cstockmans

Jan 12, 2011, 10:51 am Last Edit: Jan 12, 2011, 10:54 am by cstockmans Reason: 1
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.

chiva

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

cstockmans

Hola,

Ante todo muchas gracias por responder tan rápido :) 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  ;) 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 :) De neuvo, muchas gracias!

chiva

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.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

cstockmans

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 :)
Gracias de nuevo por la ayuda. A ver si consigo que esto eche a andar! Ya iré comentando los progresos.

Igor R

#5
Jan 12, 2011, 02:09 pm Last Edit: Jan 12, 2011, 02:22 pm by igorreal Reason: 1
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" http://todbot.com/blog/2009/05/26/minimal-arduino-with-atmega8/

[/edit]


chiva

#6
Jan 12, 2011, 02:39 pm Last Edit: Jan 12, 2011, 02:40 pm by chiva Reason: 1
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.
http://arduino.cc/en/Reference/SPI

Un saludo
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Igor R

#7
Jan 12, 2011, 02:46 pm Last Edit: Jan 12, 2011, 02:52 pm by igorreal Reason: 1
Bueno, lo decia por que si lo hiciese cstockmans a su medida..... ;)

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.....

:D

Igor R

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

http://arduino.cc/en/Tutorial/ArduinoToBreadboard


;)

cstockmans

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.

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


Gracias por el enlace :) 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  :)

Igor R

#10
Jan 13, 2011, 12:31 am Last Edit: Jan 13, 2011, 12:45 am by igorreal Reason: 1
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.
http://www.ermicro.com/blog/?p=1239  y http://www.ermicro.com/blog/?p=744



Sin más, ahora a investigar y probar..... ;)


cstockmans

Quote
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 :)

Quote
Sin más, ahora a investigar y probar..... ;)


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

Igor R

#12
Jan 13, 2011, 01:12 am Last Edit: Jan 13, 2011, 01:13 am by igorreal Reason: 1
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...  ;)
Para que lo tengas en la recamara....  ;D

cstockmans

Pues mira, eso simplifica un poquito más las cosas :) 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  8-)

cstockmans

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 :)

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

Go Up