RESUMEN:
Esto es lo que funciona:
Raspberry Pi (I²C) <-> 1 m de cable <-> sensor (I²C)
Esto es lo que estoy tratando de hacer (no funciona, de ahí la pregunta):
Raspberry Pi (I²C) <-> cable de 30 m <-> sensor (I²C)
La "ecuación" a resolver es así:
Raspberry Pi (I²C, SPI y otros) <-> X <-> cable de 30 m <-> Y <-> sensor (I²C/SPI)
Resolver para X e Y
DETALLE:
Estoy trabajando con un montón de sensores configurados en una red/topología en estrella.
Se utiliza una Raspberry Pi Zero como "hub" central, donde se recopilan y procesan todos los datos del sensor. Todos los sensores son iguales y utilizan un protocolo I²C (también ofrecen una interfaz de bus SPI). Dicho esto, actualmente tengo un multiplexor I²C conectado a Raspberry Pi Zero para habilitar múltiples dispositivos configurados con la misma dirección de hardware I²C. Todos los sensores están conectados a la Raspberry Pi Zero mediante un cable blindado 26/4. Actualmente todo funciona según lo previsto.
Con la prueba de concepto en su lugar, ahora quiero extender el alcance de la topología/red en estrella en 20-30 m en cada conexión de sensor-hub. Pensé que podría usar un cable más largo, pero aparentemente el protocolo I²C limita la longitud de la extensión del cable. He leído varios trucos/soluciones sobre cómo extender la longitud, como bajar la frecuencia, cambiar resistencias, etc.
Seré honesto; No soy ingeniero eléctrico, por lo que algunas de esas cosas parecen un poco más avanzadas, y realmente no tengo el conocimiento o las herramientas para evaluar la efectividad de ese tipo de altercados.
De todos modos, investigué un poco y encontré varios chips que potencialmente puedo implementar como una solución más "plug and play". Dicho esto, gran parte del material que leí era de hace años, y no sé si esas soluciones siguen siendo viables. Aquí están las fichas que he encontrado.
Comparando los dos, he leído que el primer elemento es más versátil. También he leído que el segundo elemento es más antiguo y requiere mucha energía , lo que hace que las implementaciones remotas (alimentadas por batería) sean menos prácticas. Recientemente me encontré con otra solución, en la que usa un convertidor de I²C a 1 cable, ya que el protocolo de 1 cable no es tan sensible a los aumentos en la longitud del cable.
Esto parece una solución potencial, pero no he escuchado mucho acerca de que otros lo usen. La única fuente de información que obtuve fue la página web y los videos de la empresa. Si leí la hoja de datos correctamente, la solución tampoco requiere mucha energía. Me pregunto si otros están comprando lo que están vendiendo y si funciona.
De todos modos, de nuevo, no soy ingeniero eléctrico, así que me vendría bien un consejo. Parece que el protocolo I²C es lo que utilizan muchos sensores (al menos en el mercado integrado de bricolaje), así que imagino que no soy el único que enfrenta el problema de extender la comunicación I²C .
Estos son los requisitos de mi solución:
EDITAR: Investigué un poco más durante el fin de semana y me encontré con este conjunto de chips (MCP25 *), que suena como una interfaz CAN a SPI. ESTO NO FUNCIONARÁ... MIRA los comentarios de @Maple a continuación.Ciertamente no digo que sea el único conjunto de chips que ofrece esta conversión, es solo el primero que encontré. Los sensores que estoy usando tienen una interfaz de bus SPI, así que creo que podría conectar directamente uno de estos chips a cada sensor. Solo tengo 5 nodos de sensores conectados a Raspberry Pi en mi topología en estrella, por lo que creo que estoy dentro de las limitaciones en cuanto a la cantidad de nodos que puede admitir el bus CAN. La pregunta sería entonces cómo configurar el resto del bus. ¿Simplemente conectaría un extremo de un cable Cat 5 a uno de los chips CAN a SPI? Luego, el cable recorrería 20-30 m hasta la Raspberry Pi. ¿Podría entonces agregar un chip más en la Raspberry Pi para "invertir" la conversión y comunicarme con la Raspberry Pi? ¿Habría alguna forma de conectar los cinco nodos a la misma interfaz/chip? Yo no' No creo que Raspberry Pi tenga soporte de bus CAN nativo, pero obviamente tiene SPI (¿creo que solo puedes conectar dos dispositivos?). Si esos chips pudieran agregarse en los nodos sensores, ¿qué se necesitaría para conectar la Raspberry Pi?
EDIT_2: Después de recopilar más conocimientos de los comentarios de todos (gracias), decidí seguir investigando. ¡Sin sorpresa, me encontré con otra posible solución! Estaba leyendo los comentarios en uno de los enlaces que señalé anteriormente , y alguien mencionó un chip PCA9615 . Una búsqueda rápida en Google en este chip presenta "I²C diferencial". Desde el punto de vista de un profano, esto suena como una solución que no requeriría que cambie mi software. Aparte de eso, no conozco completamente los pros y los contras o si cumple con los tres requisitos enumerados. Leeré más en la hoja de datos, pero si alguien tiene comentarios sobre esta solución, ¡soy todo oídos!
La solución Onewire con el DS28E17 es la que funciona principalmente de forma inmediata. Incluso puede usar el host bitbanging (por ejemplo, en GPIO4) y salirse con la suya casi sin hardware adicional. Cada DS28E17 en el bus aparece automáticamente como un adaptador de host I²C, no se necesitan cambios de software. Inconvenientes:
Olvídese del DS2484 detrás de una idea DS28E17 . Eso simplemente cuadra la sobrecarga, tanto enviar unos pocos bytes toma un segundo más o menos. (DS28E17 detrás de un DS2484 o DS2482-800 por el contrario es el uso previsto y evita el bitbanging).
La razón por la que otras personas aún no usan mucho ese chip es que salió en 2016 y el controlador de Linux está disponible desde el kernel 4.15.
(Y una precaución: el DS28E17 es un dispositivo de solo 3,3 V).
Sospecho que hay otros tipos de extensores I2C, pero solo estoy familiarizado con dos: búferes (como PCA9605, P82B715) y divisores (como PCA9600, P82B96). Todos ellos diseñados para aislar la capacitancia de bus más alta de los recorridos largos al aumentar la capacidad de sumidero de las salidas. Parece que todos los búferes se están acercando al EOL ahora.
Tenga en cuenta, sin embargo, que aumentar la capacidad de hundimiento básicamente significa aumentar las corrientes, lo que no es un buen augurio para su requisito de bajo consumo de energía.
Hay muchas notas de aplicación que recomendaría leer, como las sugeridas por @ali-chen AN11084 o AN11075 , AN10658 . Sin embargo, es interesante que incluso aquellos que usan pares trenzados en su topología todavía dependen de la señalización de un solo extremo. Estoy bastante seguro de que cualquier nota de aplicación o dispositivo que elija debería funcionar bien.
Sin embargo, lo que me gustaría sugerir es echar un vistazo a este dispositivo primero. Lo describen como "extensor PCA9600". Sin embargo, en lo profundo de la descripción técnica, puede encontrar un uso inteligente del chip transceptor CAN PCA82C251 para transformar señales I2C (divididas en Tx, Rx por PCA9600) en señales diferenciales.
Lo anterior ya tiene la ventaja de una alta inmunidad al ruido sin ningún tipo de blindaje. Y puede brindarle comunicación de alta velocidad en distancias de 100 m. Pero aquí hay otro truco para ti: el bus CAN puede funcionar a 3,3 V con la misma velocidad y fiabilidad que a 5 V, mientras que al mismo tiempo reduce el consumo de energía en más del 50 %. Creo que esto justifica una mirada más cercana a su aplicación.
Esta nota de NXP describe métodos para lograr que el sistema de bus I2C tenga más de 300 m de largo a 60 kbits/s, AN11084 . Las soluciones incluyen líneas trenzadas, repetidores PCA9605 y lógica de generación de retardo en cada esclavo. Buena suerte.
También argumento para mirar esto . https://en.m.wikipedia.org/wiki/Señalización_diferencial_de_bajo-voltaje
Es inmune al ruido de modo común, independiente de la conexión a tierra y también funciona durante unas pocas decenas de metros fácilmente y aún proporciona una alta tasa de bits en comparación con el estándar I2C.
Si puede proporcionar los esquemas del diagrama de bloques de la conexión prevista, se puede elaborar un mejor esquema para reducir aún más el consumo de energía.
M LVDS (multi LVDS) puede ser el candidato adecuado. Puede usar canales individuales para reloj y datos I2C.
La línea de datos es bidireccional pero es posible manejarla mediante arbitraje.
Nick Alexeev
Ale..chenski
Tony Estuardo EE75
Así es Jack
Arce
Así es Jack
Arce
Arce
Arce