Comunicación i2c entre arduinos a 10 metros

Hola.

Necesito comunicar 2 arduinos separados una distancia de 10 metros.

He pensado en utilizar la comunicación i2c pero no he tenido éxito.

Describo lo que he probado:

Los dos Arduinos son del modelo Arduino UNO y estan alimentados por 2 fuentes de alimentación independiente que suministran 5V.

El cable multifilar de 10 metros que utilizo es un cable apantallado de 4x0.5mm^2 (CERVITRONIC LiYCY). Tiene un RT de 39 (Ohm/Km).

Los 4 hilos + malla del cable los utilizo de la siguiente forma:

Hilo 1: Conecta el pin A4 del Arduino Master con el pin A4 del Arduino Esclavo.
Hilo 2: Conecta el pin A5 del Arduino Master con el pin A5 del Arduino Esclavo.
Hilo 3: Alimentación 24V desde la fuente de alimentación hasta la entrada de potencia del Arduino Esclavo.
Hilo 4: Alimentación 0V desde la fuente de alimentación hasta la entrada de potencia del Arduino Esclavo.
Malla: Conecta el GND del Arduino Master con el GND del Arduino Esclavo.

El código que utilizo es el que viene en los ejemplos de Arduino:

Para el Master: Ejemplos --> Wire --> master_reader
Para el Esclavo: Ejemplos --> Wire --> slave_senser

Lógicamente he probado de colocar los 2 arduinos uno al lado del otro y con un cable corto la comunicación es perfecta. Lo único que hago luego es conectarlos con el cable de 10m y allí la comunicación deja de funcionar

Posibles soluciones que he leído

  • Bajar la velocidad de comunicación --> No he sido capaz de encontrar como hacerlo
  • Colocar resistencias entre la alimentación y los cables de comunicación --> No tengo claro como dimensionar la resistencia ni donde colocarlas (solo en el lado master, en los 2 lados, etc)
  • Utilizar un extensor de bus --> Este tema se me escapa
  • Utilizar otro protocolo --> RS485?

Cualquier aporte será bienvenido.

PD: Este tema ha sido tratado en otras entradas y otros foros pero no encuentro una solución concreta. Siento repetirlo.

Hi @valdric
cada protocolo tiene sus limitaciones de longitud de cable eléctrico.

I2C -> cms (depende de la velocidad);
la longitud máxima del bus de un enlace I2C es de aproximadamente 1 metro a 100
Kbaud, o 10 metros a 10 Kbaud.
ref:I2C Bus Range and Electrical Specifications, Freescale 9S12 HCS12 MC9S12 I2C Hardware

SPI
Si bien el método de comunicación SPI generalmente es adecuado para distancias de hasta aproximadamente 10 m
https://www.analog.com/en/technical-articles/isolated-spi-communication-made-easy.html

RS232
La longitud del cable es uno de los elementos más discutidos en el mundo RS232. El estándar tiene una respuesta clara, la longitud máxima del cable es de 50 pies o la longitud del cable es igual a una capacitancia de 2500 pF. La última regla a menudo se olvida. Esto significa que el uso de un cable con baja capacitancia le permite abarcar distancias más largas sin ir más allá de las limitaciones del estándar. Si, por ejemplo, se utiliza un cable UTP CAT-5 con una capacitancia típica de 17 pF / pie, la longitud máxima permitida del cable es de 147 pies.
Ref: RS232 Specifications and standard - Lammert Bies

USB
Si no está utilizando un cable normal, la longitud máxima del cable activo para USB 2.0 es de 30 metros (98 pies y 5 pulgadas) y la longitud máxima recomendada para USB 3.0 / 3.1 es de 18 metros (aproximadamente 59 pies). Si está utilizando un cable normal (longitud máxima de 5 metros para 2.0 y longitud máxima de 3 metros para 3.0 / 3.1) con un cable activo, entonces la longitud máxima para USB 2.0 es de 25 metros (aproximadamente 82 pies) y la máxima recomendada La longitud para USB 3.0 / 3.1 es de 15 metros (aproximadamente 49 pies).
Ref: USB Cable Length Limitations And How To Break Them
RS485
La distancia máxima de RS-485 sin utilizar un repetidor es de 4000 pies (1220 metros) a velocidades en baudios de hasta 90 Kbps.
Amplíe esa distancia agregando un repetidor RS-485 o un repetidor aislado ópticamente cada 4000 pies.
Ref: http://www.bb-elec.com/Learning-Center/All-White-Papers/Serial/RS-485-Tips,-Tricks,-Questions-Answers/RS-485-Tips,-Tricks,-

UTP Cat5 / Cat6
La longitud máxima que puede ejecutar el cable Cat5, Cat5e, Cat6 y Cat6a es de 100 metros o 328 pies. Si necesita una ejecución más larga, deberá colocar un componente activo, como un enrutador, entre las señales.
Ref: Discussing Cat5 Length Limits | ShowMeCables.com

etcétera etcétera.

todo tiene limites.

RV mineirin

1 Like

Por lo tanto, si consigo bajar la velocidad del protocolo i2c debería funcionar...

Un detalle, la malla debes conectarla solo en uno de los extremos, no en ambos.

Saludos

Aca tienes como cambiar la velocidad.

La malla la utilizo para igualar los tierra porque no tengo otro cable. Pero si eso es un problema podria pasar otro cable para igualar las tierras de ambos equipos...

Entonces entendí mal la función del cable #4, interpreté que es masa. Mala mía.

Claro, si no hay otro cable de masa, entonces está bien.

Seré mas preciso porque la referencia es algo ambigüa.
https://www.arduino.cc/en/Reference/WireSetClock
Acá tienes como cambiar la frecuencia del reloj I2C.

Hola.

He colocado la sentencia Wire.setClock(10000) debajo de Wire.begin() dentro del void setup en el lado del Master.

También he probado con 31000 porque en algun lugar he leido que era el mínimo soportado.

En ambos casos no he conseguido comunicación alguna.

Quisiera probar poniendo resistencias entre la alimentación y los cables I2C. ¿Alguien me puede ayudar a dimensionarlas?

Mira este hilo a ver si te ayuda

mas ejemplos

Hi,
No mencionas si le anadistes las resistencias de 4K7 al clock y a la senal de SDA.

Hola.

No las tengo instaladas porque no se dimensionarlas. De donde se deduce el valor de 4k7? Y ya puestos a preguntar, supongo que debo colocarlas tanto del lado maestro como esclavo, verdad?

Como siempre digo, si tienes alguna duda pregunta a Google: I2C bus pull up resistor calculation

Silicon Labs Community.

Pero esto disculpa te supera a ti y a todos.
Normalmente se usan 4k7 y listo. No falla salvo que tengamos muchos dispositivos I2C entonces en ese caso debemos garantizar que la resistencia final no baje de determinado valor. Pero dejemos ese caso extremo para otra oportunidad.

Hola.

Siguiendo vuestras indicaciones he colocado una resistencia 4k7 entre Vcc y SDA y otra resistencia 4k7 entre Vcc y SLC. Esto lo he hecho tanto del lado Master como del lado esclavo y la comunicación YA FUNIONA.

Si solo lo hago del lado Master o Esclavo no hay comunicación pero si las coloco en ambos lados funciona bien. Y sin modificar la velocidad del bus ni nada.

Muchas gracias por la ayuda de todos los participantes.