Go Down

Topic: Velocidad trasmisión I2C libreria Wire (Read 4332 times) previous topic - next topic

rafaybelen

Quiero comunicar dos arduinos mediante I2C. Para ello quiero utilizar la libreria Wire. Conectados mediante cables cortos (20 cm) funciona perfectamente. He leído que el problema es la capacidad del cable (que máximo tiene que ser de 400 pF). Dado que este problema empeora con la velocidad de trasmisión (que por defecto en esta liberia es de 100 kbytes/seg), quiero reducir esa velocidad. Para ello tengo que modificar la librería pero, no se como hacerlo.

Se el dato que tengo que cambiar, lo cambio y grabo. Después compilo el programa .ino pero no coge el cambio. ¿es posible que tenga que compilar la librería por separado?¿como hacerlo?.

Gracias.

surbyte

En un proyecto que supuestamente usaría muchos arduinos esclavos conectados x i2c investigué el tema del cable. Una de las mejores y mas fáciles soluciones que encontré fue usar cable USB, cortarle los conectores o bien no cortarlos y usarlos como estan con conectores Hembra.
El cable USB tiene la especificación ideal de capacidad por metro para I2C.

rafaybelen

Gracias por tu respuesta. Para el tema del cable estoy pensando en algo tipo profibus o tipo ethernet (cat 5e). Mi problema es que tendré 9 arduinos "slave" conectados al "master" mediante I2C formando una especie de estrella. La suma de las longitudes de los 9 "ramales" es de aprox. 100 m.

Dado que las capacidades de los cables en paralelo se suman, necesito cables de baja capacidad. Tanto en el arduino "master" como en los "slaves" instalaré un CI llamado P82B715 que me ayuda a pasar de una capacidad máxima de 400 pF a 3.000 pF pero, dada la enorme longitud de cable que voy a utilizar, aún así, necesito cables de <30 pf/m (y sigo teniendo dudas de que funcione).

Como la información a transmitir desde/hacia cada arduino es poca, no me importa reducir la velocidad de trasmisión (la que viene por defecto en la librería wire es 100 Kbytes/seg) lo que me ayudará con el problema de la capacidad e impedancia de los cables. ¿Sabeis como puedo modificar esta librería y disminuir la velocidad?.

Por otro lado, cuando dices cable USB. Yo creo que hay de diferentes tipos. ¿Puedes indicarme alguna referencia de alguno concreto para que pueda ver las características técnicas y su precio?.

Gracias de nuevo.




 

surbyte

En ese caso léete la norma I2C y verás que esas distancias no son posibles usando I2C a menos que uses transceivers.

Supongo que en tu planteo no quieres agregar hardware pero si usaras un simple ESP8266 WIFI por nodo o bien un ECN28J60 para usar cable ethernet. mas barato que una W5100 no tendrías problema alguno de cables y distancias.


Alex1138

Hola. No sé si el arduino sabe lidiar con un RS485. La topología radial se puede convertir en estaciones lineales. Investiga lo que hace el RS485 si la velocidad no es tu problema.

surbyte

Claro que sabe trabajar con un MAX485, esta ampliamente documentado Alex1138.
Es una buena sugerencia tmb.

rafaybelen

He buscado informacion acerca del sistema
RS485 y efectivamente puede conectarse a
arduino mediante el c.i. max485.
Lo que no he encontrado ejemplos de programas
para que un arduino haga la funcion de master
y otro para que haga la funcion de esclavo.
Lo que me gustaria es construir un sistema similar
al i2c en el que diferentes arduinos esclavos tengan una direccion y el master pueda enviarles informacion o requerirsela a uno concreto sin mas que indicar su direccion. ¿es posible hacer esto con RS 485?. ¿teneis ejemplos de programas?.

Gracias

surbyte

No puedo creer que digas que no encuentras programas siendo que estan en este mismo foro.
Google: Arduino RS485

Modbus Master en Arduino Playround

Tutorial en instructables RS485

rafaybelen

Muchas gracias por las aportaciones.
Surbyte, lo de modbus es buena idea pero creo
que no es software libre. El ejemplo de
 la libreria no se si es del master o de un slave.
tampoco se como se seleccionan las direcciones
de los arduinos con los que quieres comunicar.

¿que opinais?.

Gracias

surbyte

El modbus es un protocolo LIBRE. La librería que te puse es la de Mosbus Master pero tambien esta la slave.
Puedes usarlas sin inconveniente alguno.
Solo agregas módulos RS485 que los venden a pocos dolares/euros




rafaybelen

Muchas gracias por tu interés de nuevo.

Si no te entiendo mal, hay una librería diferente para los arduinos que tienen que hacer la función de esclavos o, te refieres a que es el ejemplo que me has enviado es para el master y, para los esclavos podría utilizar la misma librería pero con otro programa.

Por otro lado, ¿donde hay que poner la dirección de los arduinos a los que quieres enviar la información o a los que se las quieres requerir?.

Respecto a conectar los slaves en una misma línea bus, para ahorrar cable yo lo conectaría en forma de estrella con 4 o 5 ramales, estando en el centro de la estrella el arduino master.

 




surbyte

Los nodos esclavos puedes definirlos de varias maneras:
1. la mas simple sería que tuvieras un programa levemente diferente por nodo. Donde lo único que cambias es la dirección por ejemplo con algo asi

#define NODO 2 // usas luego 3 hasta el máximo que permita tu dispositivo 485. Un Max485 creo que 128 dispositivos o 64 , hay que ver la hoja de datos. Sumo en ese número al maestro tmb.

Entonces tendrías un sketch particular para cada nodo.

2. grabas la dirección en la EEPROM con un programa previo, se me ocurre algo que intearctue con el monitor serie y lo vas indicando.
Luego le grabas el mismo programa esclavo a todos los nodos.

Go Up