Envío de confiabilidad I2C sobre cables Cat5

8

Estoy considerando implementar un sistema de automatización del hogar alrededor de mi Raspberry Pi, pero descubrí que el precio y el espacio requerido para insertar un Pi en cualquier lugar requieren demasiado control, pero los cables Cat5e necesarios para este diseño ya están instalados durante la renovación. Tengo algunos PCF8574, PCF8591 y SSR por ahí, ¿es posible conducirlos con cables Cat5e?

Todos mis cables Cat5e ya están cableados con pin TIA / EIA 568B. Son parte de mi cableado estructural y no están protegidos, por lo que se requiere un voltaje de línea más alto. Estoy pensando en enviar energía y líneas I2C a través del cable, con este pinout:

Pin 1 (Pair 1): SCL+
Pin 2 (Pair 1): SCL-
Pin 3 (Pair 2): SDA+
Pin 4 (Pair 3): +12V
Pin 5 (Pair 3): +12V
Pin 6 (Pair 2): SDA-
Pin 7 (Pair 4): GND
Pin 8 (Pair 4): GND

La disposición de los pines de alimentación es la misma que el cableado PoE 100BASE-TX, por lo que la potencia nominal también será la misma, y ​​el uso de señalización diferencial bidireccional se encuentra en 1000BASE-T, que requiere Cat5e.

Las líneas I2C SCL y SDA originales se derivan en dos pares diferenciales bidireccionales a niveles TTL (el drenaje abierto no se mantiene en el cable, sino que se restaura en el dispositivo de terminación de línea / cambio de nivel que estoy diseñando)

¿Alguna sugerencia sobre eso? Además, ¿qué chip debo usar para convertir líneas I2C a la señalización diferencial? Por favor, sugiérame chips con la opción de orificio pasante DIP. No sé cómo manejar las cosas SMT.

EDITAR

Encontré este chip, SN65LBC180, ¿es una buena opción? ¿Cómo conectarlo a una unidad bidireccional? ¿Cómo cambiar el nivel (es una parte de BiCMOS que requiere un nivel TTL pero Pi funciona a niveles CMOS de 3.3v) y hacer que sea compatible con drenaje abierto?

EDITAR 2

Los comentaristas sugirieron RS-485 que me pareció aceptable, pero aún así se requiere que los dos pares diferenciales sean bidireccionales y solo dos pares diferenciales bidireccionales solamente. Estoy reutilizando los cables Ethernet existentes.

EDITAR 3

Como alguien lo mencionó, no puedo usar CAN. No hay forma de que pueda encajar CAN en RPi sin sacrificar nada (SPI está ocupado por una pantalla táctil, por lo que no hay convertidor SPI a CAN)

Soy consciente de la limitación de I2C PHY, así que esencialmente estoy tratando de adaptar 1000BASE-T PHY: señalización diferencial bidireccional para señales SCL y SDA, pero además de eso se ejecuta el protocolo I2C.

EDITAR 4

Se me ocurrió un nuevo chip: NXP P82B96 que divide I2C en 4 líneas unidireccionales, que a su vez se pueden utilizar para alimentar SN65LBC180 a través del optoaislamiento (solo lado Pi) para formar una señalización de larga distancia de 8 pines. Ahora solo necesito descubrir cómo obtener energía a través del cable, o cómo determinar si el bus está enviando y hacer que los pares sean bidireccionales.

EDITAR 5

A partir de las sugerencias de respuestas, creo que necesito cambiar un poco el pin de alimentación:

Pin 1 (Pair 1): SCL+
Pin 2 (Pair 1): SCL-
Pin 3 (Pair 2): SDA+
Pin 4 (Pair 3): +5V
Pin 5 (Pair 3): GND
Pin 6 (Pair 2): SDA-
Pin 7 (Pair 4): GND
Pin 8 (Pair 4): +12V

El voltaje de señalización diferencial I2C es TTL. El + 5V sobre el par 3 proviene del Pi, sin búfer pero fusionado. El + 12V sobre el par 4 puede no estar presente solo se usa para manejar algunos dispositivos de alta potencia. Si es necesario, el dispositivo puede usar su propia fuente de alimentación y dejar ambos rieles colgando sin conectar o suministrar su propio voltaje más alto, pero use el riel de 5V.

RASCA ESO

Pinout sigue siendo mi diseño original, que es compatible con 802.1af.

Maxthon Chan
fuente
44
¿Por qué no RS-485? Es un estándar industrial y confiable.
Kamil
Pi no tiene RS485 y quiero que el circuito de interfaz sea lo más simple posible. También necesito PCF8574 que, según mis experimentos, puede activar mi SSR de manera confiable con un voltaje de suministro de 5V.
Maxthon Chan el
Si bien el RS-485 en sí es bidireccional, no lo hace en el lado de un solo extremo.
Ignacio Vazquez-Abrams
55
Si estás tan empeñado en hacer lo que dijiste que ibas a hacer originalmente, ¿por qué viniste aquí y preguntaste al respecto?
Matt Young
2
Los cables de ethernet @maxthonchan Cat5 pueden manejar de forma segura 360ma a 50V ( en.wikipedia.org/wiki/Power_over_Ethernet#Power_capacity_limits ). Puede obtener fácilmente relés de estado sólido que consumen <10ma a 3-32V en el lado de entrada, tan bien dentro de las especificaciones seguras.
Grant

Respuestas:

18

Intentar hacerlo con IIC es una mala idea. IIC está realmente destinado a la comunicación entre chips en una sola placa. Dado que la corriente máxima requerida para tirar de una línea baja es limitada, las líneas tienen una impedancia relativamente alta (unos pocos kΩ). Esto significa que pueden captar el ruido fácilmente, lo cual es un problema grave cuando se ejecuta un cable sin blindaje en las paredes, posiblemente justo al lado de los cables de alimentación de CA.

Yo usaría CAN para esto. CAN utiliza un solo par trenzado unido con solo 60 Ω en cualquier punto, y la señal es diferencial. Eso significa que la mayoría del ruido inevitable en modo común que se captará debido al acoplamiento capacitivo puede ser cancelado por los receptores. PUEDE correr a 500 kbits / s puede cubrir algo del tamaño de una casa ordinaria.

Muchos microcontroladores están disponibles hoy en día con CAN incorporado. Por lo general, necesita un chip tranceiver físico separado (como el MCP2551 común), pero las pocas capas más bajas del protocolo se implementan en silicio en el periférico CAN. El firmware interactúa con el bus CAN a nivel de envío y recepción de paquetes completos. La detección y reintento de colisión, la generación de suma de verificación, los detalles de la señalización del paquete de bus, la validación de la suma de verificación recibida y el ajuste de la deriva del reloj se manejan por usted.

No caigas en el RS-485. Esa es una reliquia de una época pasada. También utiliza una única señal diferencial como CAN, por lo que también tiene buena inmunidad al ruido. Sin embargo, las personas generalmente caen en el RS-485 porque parece "más simple". Esto es solo porque no miran todo el sistema. Primero, no es realmente menos complejo eléctricamente. Aún necesitará algún tipo de transceptor para conducir y recibir la señal diferencial. Ya sea que tenga un transceptor RS-485 conectado al UART del microcontrolador o un MCP2551 conectado al periférico CAN, es prácticamente irrelevante en términos de costo y complejidad de hardware. La gran diferencia es que RS-485 te deja en el nivel de bytes sin procesar (a través del UART). Esto significa que para implementar cualquier sistema significativo y robusto, debe inventar su propio protocolo para manejar la detección de colisiones, decida cómo manejar reintentos, paquetización, generación y verificación de suma de verificación, control de flujo, etc. Puede usar una sola arquitectura maestra, pero obtener los detalles correctos es mucho más complicado de lo que la gente piensa que no los ha analizado cuidadosamente. Con CAN simplemente envía y recibe paquetes, y el hardware se encarga de los detalles.

Olin Lathrop
fuente
No tengo CAN integrado en RPi, no tengo interfaz CAN, no puedo pagarlos y no puedo adaptarlos a las viviendas existentes. Entonces, NO PUEDE. Estoy convirtiendo IIC en señalización diferencial para evitar esa trampa de diafonía y resistencia. La conversión y el dispositivo IIC comparten una sola placa.
Maxthon Chan el
@Max: un microcontrolador con CAN será más barato, más pequeño y requerirá menos energía que un RPi. Si estos nodos son principalmente sensores y similares, un RPi es excesivo de todos modos.
Olin Lathrop
uC's no tiene el poder computacional adecuado para ejecutar el otro lado del sistema. Aunque tengo una pantalla táctil en el sistema que es solo para anulación de emergencia, todos los comandos se envían a través de la red doméstica a Pi a través de HTTP (con una UI bastante sofisticada impulsada por AJAX), y Pi maneja toda la autenticación y otras cosas.
Maxthon Chan
3
@MaxthonChan Puede obtener circuitos integrados de controlador baratos que convierten CAN a SPI y / o I2C para interactuar con su RasPI. Ejemplo de Microchip .
Peter
Si esa es su sugerencia, dígame cómo puedo conducir mi SSR. Actualmente tengo una placa de recepción con el chip de interfaz diff, un 7805 y un PCF8574, y maneja hasta 8 SSR. (y generalmente tengo dos o tres)
Maxthon Chan
7

I2C no es el camino a seguir. Los transceptores de CAN cuestan un dólar cada uno, y puede usarlos como transeves de uart y escribir su propio protocolo para que no necesite un micro compatible con lata de usted no quiera usar la pila completa de latas.

Siempre me siento un poco incómodo cuando veo conductores cat5 en paralelo para más corriente. Me molesta porque si un conductor se rompe, el otro llevará la corriente completa del sistema. Las clasificaciones actuales de cat5 son muy conservadoras, por lo que las probabilidades de incendio son bastante bajas, pero no me gusta la posibilidad.

La forma segura de hacerlo es tener un fusible múltiple en ambos rieles de alimentación y unir las tierras en la fuente de alimentación, y conectar cada dispositivo a un único conjunto de alimentación / tierra. De esa manera, si falla un cable, los dispositivos que usan esa línea pierden energía en lugar de que una línea se vea obligada a transportar la energía de dos.

A mucha gente le gusta poner potencia y tierra en ambos pares trenzados por razones EMI en lugar de tener un par de potencia y un par de tierra. Si tiene dos pares de potencia / tierra, la línea eléctrica estará más cerca de la tierra, y los campos se cancelarán, reduciendo las ondas de radio transmitidas o recibidas de las líneas eléctricas. Innecesario, pero agradable si hay mucho ruido eléctrico zumbando.

En mi opinión, 12 V es demasiado bajo para la distribución de energía cuando 24 V todavía es razonablemente seguro y mucho más eficiente.

EternidadBosque
fuente
Mi solución se basa de alguna manera en eso. Utilizo el chip divisor NXP para dividir el bus I2C en un par de Tx / Rx (tanto SDA como SCL) y multiplexarlos como UART usando chips de interfaz CAN. Esto me da dos pares trenzados que llevan líneas I2C SDA y SCL, conectados a los pines Cat5e TIA / EIA568B 1/2 y 3/6.
Maxthon Chan
Eso también debería funcionar, el único problema es que necesita su chip NXP, dos transceptores de latas y su chip de E / S i2c real. Eso es cinco chips por placa, y la última vez que verifiqué que el chip NXP era más caro que atmega328, pero eso podría haber cambiado. Funcionará y la programación será simple porque es i2c, pero usar UART sobre CAN es más barato para un poco más de trabajo.
EternityForest
La placa de interfaz del lado Pi tiene 7 chips: búfer / divisor NXP I2C, dos CAN PHY y cuatro optoaisladores. El lado del dispositivo es un módulo de 4 chips: búfer / divisor NXP I2C, dos CAN PHY y el PCF8574 / 8591.
Maxthon Chan
Encontré un optoacoplador de 4 canales que reducirá el circuito del lado Pi a un módulo de 4 chips.
Maxthon Chan
Repensé los pines de alimentación, me quedo con mi diseño original, usando un par de energía y un par de tierra. Eso es compatible con 802.3af aunque redefiní los pines de señal a SCL y SDA.
Maxthon Chan el
3

Si la automatización está simplemente encendiendo y apagando las cosas de la casa, simplificaría esto al:

  • Mantener todos los "cerebros" en un solo lugar. Use expansores de E / S I2C si es necesario, pero manténgalos todos con la frambuesa pi. También necesitará el hardware adecuado para asegurarse de que no está tratando de obtener demasiada corriente de los pines GPIO del pi.
  • Utilice los cables de ethernet para simplemente conducir relés. Puede construir su propia placa u obtener relés de estado sólido de 120 / 240V para montaje en panel que se montarán en una caja eléctrica. Los cables en los cables de Ethernet Cat5 pueden manejar hasta 50 V a 320 mA cada uno, lo cual es más que suficiente para conducir un relé. De hecho, podría conducir 7 relés desde un solo cable (más un cable para conexión a tierra). O deje un cable para una salida de 12V sin interruptor, para que también pueda instalar un interruptor manual. Si son recorridos realmente largos, es posible que deba tener en cuenta la caída de voltaje, pero puede obtener relés que cambiarán a 3-32V. 12V debería ser más que suficiente, incluso con una caída de voltaje.
  • También querrá consultar los códigos de construcción locales para obtener consejos sobre cómo mezclar cableado de alto y bajo voltaje en la misma caja.
  • Los conmutadores simples también se pueden hacer a través de los cables de ethernet, nuevamente hasta 7 por cable, y simplemente conectados a las entradas del pi. La caída de voltaje puede ser una preocupación para cables realmente largos.
  • También es posible que desee utilizar optoaisladores para proteger el pi del daño.
  • Para los pocos dispositivos que necesitan más que un relé (como un panel de control), use los cables de ethernet como ethernet real. No debería ser un gasto enorme si no hay muchos de estos dispositivos. Podrían ser otro pi o un microcontrolador con ethernet.
Conceder
fuente
No estoy exactamente seguro de cuáles serán las necesidades de mis usuarios finales. Ella está de mal humor y cambia de opinión muy rápido. Tendré que poder responder lo suficientemente rápido. Es por eso que se usa algún tipo de protocolo básico (I2C aquí) a través del cable.
Maxthon Chan
2

esquemático

simular este circuito : esquema creado con CircuitLab

EUREKA! ¡Lo averigué! (no probado, lo probaré este fin de semana)

Los chips de interfaz son NXP P82B96 I2C buffer / splitter y 2 chips de interfaz de bus CAN SN65HVD251P TI. Esencialmente, estoy ejecutando I2C en CAN PHY.

P82B96 entiende el protocolo I2C y maneja el arbitraje de bus por mí, y me da pines Tx y Rx separados que se pueden unir. Los introduzco en el transceptor CAN SN65HVD251P y me da el par diferencial bidireccional para enviar a través de cables.

Los pines de alimentación vienen directamente, sin búfer del riel de 5V de mi Pi. (No utilizaré el voltaje y la potencia de señalización de 12V por un tiempo)

Maxthon Chan
fuente
Lo siento, pero no. Lo que le permitirá hacer es conectar dos unidades I2C a cierta distancia entre sí. No le permitirá conectarse más de 2.
WhatRoughBeast
@WhatRoughBeast He buscado eso en la documentación de NXP y dice que esta es una solución viable (y de alguna manera llegó a su AN), pero para mí, un punto a punto está bien ya que mi diseño en sí está pidiendo uno par de unidades de conversión por segmento Cat5e.
Maxthon Chan
CAN es cableado o bidireccional al igual que i2c. No veo ninguna razón para que esto no funcione con tantos dispositivos como quieras en el bus. He visto la aplicación que menciona. Parece describir un autobús, no un punto a punto.
EternityForest
@WhatRoughBeast: CAN es multipunto, no he mirado demasiado de cerca lo que está haciendo el OP, pero debería ser teóricamente posible.
Connor Wolf
1

Independientemente de los méritos de la CII a nivel de chip, su implementación propuesta será muy difícil. El problema es el arbitraje de autobuses. Aunque se pueden poner en paralelo varias unidades utilizando, por ejemplo, RS485, la gran pregunta será:

¿Cómo sabe alguna unidad si puede tomar el control del bus para enviar datos?

En IIC, con líneas de señal de drenaje abiertas, la transferencia bidireccional es fácil, pero con los buses triestados necesita alguna forma de asegurarse de que solo una unidad intente conducir el bus a la vez. Esto será complicado. Puede hacerlo, especialmente si establece un maestro único y requiere que todos los esclavos tengan restricciones de tiempo rígidas para enviar datos, y que solo envíen datos si el maestro lo solicita, pero esto requerirá un esfuerzo considerable de su parte en el diseño del tableros de interfaz para el maestro y los esclavos.

En cuanto a los controladores / receptores físicos, RS485 funcionará bien y hay muchos chips de interfaz disponibles. Solo Google

WhatBoughBeast
fuente
1

No sé si está interesado en una solución prefabricada en lugar de construir su propio circuito, pero pensé en señalar que Pololu vende estas placas de extensor diferencial de larga distancia I²C hechas por SJTbits, que parecen funcionar bastante exactamente Que estas buscando. (Divulgación completa: trabajo para Pololu).

Incluso si no desea usarlo directamente, tal vez mirar el circuito que usa podría darle algunas ideas. Puede ver el esquema en la hoja de datos; utiliza un búfer NXP PCA9600D, un controlador de línea diferencial TI AM26LS31CDR y un receptor de línea diferencial TI AM26LS32ACDR.

kwc
fuente
Esto no funciona para mi. Necesito enviar señal de bus y energía a través de los cables.
Maxthon Chan
1

Sé que esto es un poco viejo y una solución parece haberse resuelto en algún lugar entre las respuestas, pero tenía esta sugerencia que ofrecer. Hay dispositivos como el PCA9614 / 5/6 de NXP que estoy viendo en este momento como una solución para un bus I2C de larga distancia más robusto (PCA9614 2 canales multipunto Fast-mode Plus diferencial búfer de bus I2C) . Esencialmente es cierto que se está convirtiendo en algo diferente al verdadero I2C, pero al final del bus es invisible para los dispositivos. Esta familia en particular traduce las señales en 2 pares diferenciales bidireccionales, y también hay dispositivos similares a los mencionados en los comentarios, que se traducen en 4 pares diferenciales unidireccionales. La traducción a solo 2 pares le permite usar un cable CAT y aún tener 2 pares para alimentación / tierra.

John Lewis
fuente
0

¡Pulgares hacia arriba! Actualmente estoy tratando de resolver el mismo problema. También estoy tratando de usar I2C sobre cat5 para la automatización del hogar con mi pinout personalizado. La razón es el costo, quiero que sea muy rentable y los componentes I2C sigan siendo al menos 5 veces más baratos que incluso attiny13 uC (se requiere AFAIU uC para CAN y RS485).

1) Actualmente estoy en un proceso de prueba para la primera parte de un sistema y ahora tengo éxito con un cable de 15m de largo con 5V y conexión SCL y SDA directa. Utilizo PCF8574 y 2 relés para encender las luces de mi habitación. Pinout es

1
2 INT
3 +5V
4 SCL
5 SDA
6 GND
7
8

2) Entiendo que no permitirá un par de relés más o 10 metros adicionales ... Una caída de voltaje es significativa (de 5.5 a 4.7). Entonces, para el problema de caída de voltaje, voy a colocar 12V en una línea y agregar reguladores de voltaje de 5V en las placas para mantener el voltaje fino en todas partes, independientemente de la caída de línea completa. De todos modos, pondré fuentes de alimentación adicionales durante las líneas futuras.

3) La señal en sí puede mejorarse utilizando P82B96 o P82B715 barato sin dividirse en líneas diferenciales. Un NXP en sí usa Cat5 en algunas presentaciones, pero no puedo encontrar su pinout. Una parte importante aquí es que claramente usan líneas de señal en diferentes pares ... por ejemplo, un par es GND + SDA y el otro es VCC + SCL.

4) Otro punto interesante: este búfer simplemente puede elevar una amplitud de hasta 12V para aumentar la resistencia al ruido. Por lo tanto, probablemente también intente poner 12V en las líneas de señal y eso debería permitir colocar pullups directamente del cable de 12V ... Pero eso me obligará a colocar algo como P82B96 en cada dispositivo.

Como se habrá dado cuenta, también uso una línea de interrupción separada ... Master está actualmente en la placa Arduino conectada a la PC. El software maestro primario estará en una PC 24x7 de todos modos, por lo que arduino solo traduce la señal y maneja la interrupción. Puedo enviar una configuración específica para el manejo de interrupciones a bordo, por ejemplo, para manejar la conmutación conveniente del interruptor a través de la interrupción ... Eso me permite olvidarme de cualquier retraso al alternar la luz manualmente. El manejo de interrupciones es una ventaja adicional de i2c.

Entonces, mi idea es que I2C es lo suficientemente simple como para ser aplicable en <= 100m de cableado de apartamentos en la ciudad. En lugar de ir a la señal diferencial, espero poder reducir la frecuencia adicional.

Me gusta su idea de poner tanto 5V como 12V, ya que esto reduce la necesidad de reguladores y el costo ... toda la idea del bus de varios cables para reducir el costo de los puntos finales, también lo consideraré para un nuevo pinout :)

Dmitry Gusarov
fuente
1
Esto es más un comentario extenso sobre la pregunta que una respuesta, ya que su situación no es la misma que la de los OP: hardware maestro diferente, esquema de señalización diferente. Pero está lo suficientemente relacionado como para dejarlo en pie.
Dave Tweed