Enviando I2C de forma confiável por cabos Cat5

8

Estou pensando em implantar um sistema de automação residencial em torno do meu Raspberry Pi, mas achei o preço e espaço necessários para inserir um Pi em todos os lugares onde algum controle é necessário demais, mas os cabos Cat5e necessários para esse projeto já estão instalados durante a reforma. Eu tenho alguns PCF8574, PCF8591 e SSRs por aí, então é possível controlá-los usando cabos Cat5e?

Todos os meus cabos Cat5e já estão conectados com pinagem TIA / EIA 568B. Eles fazem parte do meu cabeamento estrutural e não são blindados, portanto é necessária uma tensão de linha mais alta. Estou pensando em enviar linhas de energia e I2C pelo cabo, com esta pinagem:

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

A disposição dos pinos de energia é igual à fiação 100BASE-TX PoE, portanto a classificação de energia também será a mesma e o uso da sinalização diferencial bidirecional é encontrado no 1000BASE-T, que requer Cat5e.

As linhas I2C SCL e SDA originais são derivadas em dois pares diferenciais bidirecionais nos níveis TTL (o dreno aberto não é mantido no fio, mas restaurado no dispositivo de terminação de linha / mudança de nível que estou projetando)

Alguma sugestão sobre isso? Além disso, qual chip devo usar para converter as linhas I2C na sinalização diferencial? Por favor, sugira chips com a opção DIP through-hole para mim. Eu não sei como lidar com coisas SMT.

EDITAR

Encontrei este chip, SN65LBC180, é uma boa escolha? Como conectá-lo a uma unidade bidirecional? Como mudar o nível (é uma peça BiCMOS que requer nível TTL, mas o Pi é acionado nos níveis de 3,3v CMOS) e torná-lo compatível com dreno aberto?

EDIT 2

Os comentaristas sugeriram o RS-485 que me pareceu aceitável, mas ainda é necessário que os dois pares diferenciais sejam bidirecionais e apenas dois pares diferenciais bidirecionais. Estou redirecionando os cabos Ethernet existentes.

EDIT 3

Desde que alguém trouxe isso à tona, não posso usar o CAN. Não há como encaixar o CAN no RPi sem sacrificar nada (o SPI é ocupado por uma tela sensível ao toque, portanto, nenhum conversor de SPI para CAN)

Estou ciente da limitação do I2C PHY, então estou essencialmente tentando ajustar o 1000BASE-T PHY a ele - sinalização diferencial bidirecional para sinais SCL e SDA, mas, além disso, é executado o protocolo I2C.

EDIT 4

Um novo chip veio a mim: o NXP P82B96, que divide o I2C em 4 linhas unidirecionais, que, por sua vez, podem ser usadas para alimentar o SN65LBC180 por meio de opto-isolamento (somente no lado Pi) para formar uma sinalização pronta para longa distância de 8 pinos. Agora só preciso descobrir como obter energia através do fio ou como determinar se o barramento está enviando e tornar os pares bidirecionais.

EDIT 5

A partir das sugestões de respostas, acho que preciso mudar um pouco a pinagem de energia:

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

A tensão de sinalização diferencial I2C é TTL. O + 5V sobre o par 3 vem do Pi, sem buffer, mas fundido. O par + 12V no par 4 pode não estar presente, é usado apenas para acionar alguns dispositivos de alta potência. Se necessário, o dispositivo pode usar sua própria fonte de alimentação e deixar os dois trilhos desconectados ou fornecer sua própria tensão mais alta, mas use o trilho de 5V.

RISCA ISSO

A pinagem ainda é meu design original, compatível com 802.1af.

Maxthon Chan
fonte
4
Por que não RS-485? É padrão industrial e confiável.
Kamil #
O Pi não possui RS485 e quero o circuito de interface o mais simples possível. Também preciso do PCF8574 que, a partir de minhas experiências, pode acionar meu SSR de forma confiável com tensão de alimentação de 5V.
Maxthon Chan
Embora o próprio RS-485 seja bidirecional, ele não é bidirecional no lado único.
Ignacio Vazquez-Abrams
5
Se você está tão decidido a fazer o que você disse que faria originalmente, por que você veio aqui e perguntou sobre isso?
Matt Young
2
Os fios ethernet @maxthonchan Cat5 podem suportar com segurança 360ma a 50V ( pt.wikipedia.org/wiki/Power_over_Ethernet#Power_capacity_limits ). Você pode facilmente obter relés de estado sólido que desenham <10ma a 3-32V no lado da entrada, tão bem dentro das especificações seguras.
Grant

Respostas:

18

Tentar se relacionar com a CII é uma má idéia. A CII é realmente destinada à comunicação entre chips em uma única placa. Como a corrente máxima necessária para puxar uma linha para baixo é limitada, as linhas têm impedância relativamente alta (alguns kΩ). Isso significa que eles podem captar ruídos facilmente, o que é um problema sério quando o cabo não é blindado nas paredes, possivelmente ao lado dos fios de energia CA

Eu usaria CAN para isso. O CAN usa um único par trançado unido com apenas 60 Ω em qualquer ponto, e o sinal é diferencial. Isso significa que a maioria do inevitável ruído em modo comum que será captado devido ao acoplamento capacitivo pode ser cancelado pelos receptores. O CAN executando a 500 kbits / s pode cobrir algo do tamanho de uma casa comum.

Muitos microcontroladores estão disponíveis hoje com o CAN incorporado. Você geralmente precisa de um chip tranceiver físico separado (como o MCP2551 comum), mas as camadas mais baixas do protocolo são implementadas em silício no periférico do CAN. O firmware interage com o barramento CAN no nível de envio e recebimento de pacotes completos. A detecção e nova tentativa de colisão, geração de soma de verificação, detalhes da sinalização do pacote de barramento, validação de soma de verificação recebida e ajuste de desvio do relógio são todos tratados para você.

Não caia no RS-485. Essa é uma relíquia de uma época passada. Ele também usa um único sinal diferencial como o CAN, além de ter boa imunidade a ruídos. No entanto, as pessoas geralmente caem no RS-485 porque parece "mais simples". Isso é apenas porque eles não olham para todo o sistema. Primeiro, não é realmente menos complexo eletricamente. Você ainda precisará de algum tipo de transistor para dirigir e receber o sinal diferencial. Se você tem um transceptor RS-485 conectado ao UART do microcontrolador ou um MCP2551 conectado ao periférico CAN, é irrelevante em termos de custo e complexidade de hardware. A grande diferença é que o RS-485 o deixa no nível de bytes brutos (via UART). Isso significa que para implementar qualquer sistema significativo e robusto, você precisa inventar seu próprio protocolo para lidar com a detecção de colisões, decida como lidar com novas tentativas, pacotes, geração e verificação de soma de verificação, controle de fluxo etc. Você pode usar uma única arquitetura mestre, mas acertar os detalhes é muito mais complicado do que as pessoas pensam que não analisaram todas cuidadosamente. Com o CAN, você apenas envia e recebe pacotes, e o hardware cuida dos detalhes.

Olin Lathrop
fonte
Não possuo CAN integrado ao RPi, não possuo interface CAN, não posso comprá-los e não consigo encaixá-los em caixas existentes. Então, NÃO PODE. Estou convertendo a CII para a sinalização diferencial para evitar essa armadilha de diafonia e resistência. A conversão e o dispositivo IIC compartilham uma única placa.
Maxthon Chan
@ Max: um microcontrolador com CAN será mais barato, menor e consumirá menos energia que um RPi. Se esses nós são principalmente sensores e similares, um RPi é um exagero de qualquer maneira.
amigos estão dizendo sobre
Os uCs não possuem poder computacional adequado para executar o outro lado do sistema. Embora eu tenha uma tela sensível ao toque no sistema que é apenas para substituição de emergência, todos os comandos são enviados pela rede doméstica para o Pi sobre HTTP (com uma interface de usuário orientada por AJAX) e o Pi lida com toda autenticação e outras coisas.
Maxthon Chan
3
@MaxthonChan Você pode obter ICs de controlador baratos que convertem CAN em SPI e / ou I2C para interagir com seu RasPI. Exemplo do Microchip .
Peter
Se essa é sua sugestão, diga-me como posso dirigir meu SSR? Atualmente, tenho uma placa de recebimento com o chip de interface diff, um 7805 e um PCF8574, e ele gera até 8 SSRs. (e normalmente I têm dois ou três)
Maxthon Chan
7

I2C não é o caminho a percorrer. Os rastreadores CAN custam um dólar cada, e você pode usá-los como uart trancieves e escrever seu próprio protocolo para não precisar de um micro compatível com latas que não queira usar a pilha completa.

Eu sempre me sinto um pouco desconfortável quando vejo os condutores cat5 funcionando paralelamente por mais corrente. Isso me incomoda porque, se um condutor quebra, o outro carrega a corrente completa do sistema. As classificações atuais do cat5 são muito conservadoras, portanto as chances de um incêndio são bastante baixas, mas eu simplesmente não gosto da possibilidade.

A maneira segura de fazer isso é ter um polifusor nos dois trilhos de energia e unir os aterramentos à fonte, e conectar cada dispositivo a um e apenas um conjunto de energia / terra. Dessa forma, se um fio falhar, os dispositivos que usam essa linha perderão energia, em vez de uma linha ser forçada a transportar a energia de duas.

Muitas pessoas gostam de colocar força e terra nos dois pares trançados por razões EMI, em vez de terem um par de energia e um par de terra. Se você tiver dois pares de energia / terra, a linha de energia estará mais próxima da terra e os campos serão cancelados, reduzindo as ondas de rádio transmitidas ou recebidas pelas linhas de energia. Desnecessário, mas agradável, se houver muito ruído elétrico zumbindo.

Na minha opinião, 12V é muito baixo para distribuição de energia quando 24v ainda é razoavelmente seguro e muito mais eficiente.

EternityForest
fonte
Minha solução é de alguma forma baseada nisso. Eu uso o chip divisor NXP para dividir o barramento I2C em um par de Tx / Rx (SDA e SCL) e multiplexá-los como UART usando chips de interface CAN. Isso me dá dois pares trançados com linhas I2C SDA e SCL, conectados aos pinos Cat5e TIA / EIA568B 1/2 e 3/6.
Maxthon Chan
Isso também deve funcionar, o único problema é que você precisa do seu chip NXP, de dois caçadores de latas e do seu chip de E / S i2c real. São cinco chips por placa e, pela última vez, verifiquei que o chip NXP era mais caro do que no atmega328, mas isso pode ter mudado. Funcionará e a programação será simples porque é i2c, mas usar UART sobre CAN é mais barato para um pouco mais de trabalho.
EternityForest
A placa de interface do lado Pi possui 7 chips - buffer / divisor NXP I2C, dois CAN PHY e quatro opto-isoladores. O lado do dispositivo é um módulo de 4 chips - NXP I2C buffer / divisor, dois CAN PHY e PCF8574 / 8591.
Maxthon Chan
Encontrei um acoplador óptico de 4 canais que reduzirá o circuito do lado do Pi para um módulo de 4 chips.
Maxthon Chan
Repensando os pinos de energia, estou mantendo meu design original, usando um par de energia e um par de terra. Isso é compatível com o 802.3af, embora eu tenha redefinido os pinos de sinal para SCL e SDA.
Maxthon Chan
3

Se a automação simplesmente ligar e desligar as coisas em casa, eu simplificaria isso:

  • Mantendo todos os "cérebros" em um só lugar. Use os expansores de E / S I2C, se necessário, mas mantenha-os todos com o raspberry pi. Você também precisará de hardware apropriado para garantir que não esteja tentando obter muita corrente dos pinos GPIO do pi.
  • Use os cabos Ethernet para simplesmente acionar relés. Você pode montar sua própria placa ou obter relés de estado sólido montáveis ​​em painel de 120 / 240V que serão montados em uma caixa elétrica. Os fios dos cabos ethernet Cat5 podem suportar até 50V a 320mA cada, o que é mais do que suficiente para acionar um relé. De fato, você pode acionar 7 relés a partir de um único cabo (mais um fio para o terra). Ou deixe um fio para uma saída de 12V não comutada, para que você possa instalar um comutador manual também. Se eles são realmente longos, você pode ter que considerar a queda de tensão, mas pode obter relés que mudarão de 3-32V. 12V deve ser mais que suficiente, mesmo com queda de tensão.
  • Você também deseja consultar os códigos de construção locais para obter conselhos sobre como misturar cabos de alta e baixa tensão na mesma caixa.
  • Comutadores simples também podem ser feitos através dos cabos ethernet, novamente até 7 por cabo, e simplesmente conectados às entradas do pi. Queda de tensão pode ser uma preocupação para cabos realmente longos.
  • Você também pode usar optoisoladores para proteger o pi contra danos.
  • Para os poucos dispositivos que precisam de mais do que um relé (como um painel de controle), use os cabos Ethernet como Ethernet real. Não deve ser uma despesa enorme se não houver muitos desses dispositivos. Eles poderiam ser outro pi ou um microcontrolador com ethernet.
Conceder
fonte
Não sei exatamente quais serão as necessidades dos meus usuários finais. Ela é mal-humorada e muda de idéia muito rápido. Terei que ser capaz de responder rápido o suficiente. É por isso que algum tipo de protocolo básico (I2C aqui) é usado por fio.
Maxthon Chan
2

esquemático

simular este circuito - esquemático criado usando o CircuitLab

EUREKA! Descobri isso! (não testado, testará este fim de semana)

Os chips de interface são buffer / divisor NXP P82B96 I2C e 2 chips de interface de barramento CAN SN65HVD251P da TI. Basicamente, estou executando o I2C no CAN PHY.

O P82B96 entende o protocolo I2C e lida com a arbitragem de barramento para mim, além de fornecer pinos Tx e Rx separados que podem ser conectados. Eu os alimento no transceptor CAN SN65HVD251P e ele fornece o par diferencial bidirecional para enviar os fios.

Os pinos de alimentação vêm diretamente, sem buffer do trilho de 5V do meu Pi. (Não usarei tensão e sinalização de 12V por um tempo)

Maxthon Chan
fonte
Lamento mas não. O que isso permitirá que você faça é conectar duas unidades I2C a alguma distância uma da outra. Ele não permitirá que você conectar mais de 2.
WhatRoughBeast
@WhatRoughBeast Eu procurei isso na documentação do NXP e ele diz que esta é uma solução viável (e de alguma forma chegou à AN), mas para mim, um ponto a ponto é bom, pois meu próprio projeto está pedindo uma par de unidades de conversão por segmento Cat5e.
Maxthon Chan
O CAN é cabeado ou bidirecional, como o i2c. Não vejo razão para que isso não funcione com quantos dispositivos você desejar no barramento. Eu vi o aplicativo notr ele menciona. Parece descrever um ônibus, não um ponto a ponto.
EternityForest
@WhatRoughBeast - O CAN é multiponto, eu não olhei muito de perto o que o OP está fazendo, mas deveria ser teoricamente possível.
Connor Lobo
1

Independentemente dos méritos da CII no nível do chip, a implementação proposta será muito difícil. O problema é a arbitragem de barramento. Embora várias unidades possam ser paralelas usando, por exemplo, o RS485, a grande questão será:

Como alguma unidade sabe se pode assumir o controle do barramento para enviar dados?

Na CII, com linhas de sinal de dreno abertas, a transferência bidirecional é fácil - mas com ônibus tristados, você precisa de uma maneira de garantir que apenas uma unidade tente dirigir o ônibus por vez. Isso será complicado. Você pode fazê-lo, principalmente se você estabelecer um único mestre e exigir que todos os escravos tenham restrições rígidas de tempo no envio de dados e que eles somente enviem dados se solicitados pelo mestre, mas isso exigirá um esforço considerável de sua parte ao projetar o placas de interface para o mestre e os escravos.

Quanto aos drivers / receptores físicos, o RS485 é bom e existem muitos chips de interface disponíveis. Apenas o Google.

WhatRoughBeast
fonte
1

Não sei se você está interessado em uma solução pré-fabricada, em vez de construir seu próprio circuito, mas pensei em salientar que a Pololu vende essas placas I²C de longa distância diferencial extensor fabricadas pela SJTbits, que parecem fazer exatamente exatamente O que você está procurando. (Divulgação completa: trabalho para a Pololu.)

Mesmo se você não quiser usá-lo diretamente, talvez olhar para o circuito usado possa lhe dar algumas idéias. Você pode ver o esquema na folha de dados; usa um buffer NXP PCA9600D, driver de linha diferencial TI AM26LS31CDR e receptor de linha diferencial TI AM26LS32ACDR.

kwc
fonte
Isso não funciona para mim. Preciso enviar sinal de barramento e energia pelos fios.
Maxthon Chan
1

Eu sei que isso é um pouco antigo e uma solução parece ter sido resolvida em algum lugar entre as respostas, mas eu tinha essa sugestão a oferecer. Existem dispositivos como o PCA9614 / 5/6 da NXP que estou vendo agora como uma solução para um barramento I2C de longa distância mais robusto (buffer PC29614 multiponto multiponto de modo rápido e diferencial I2C do barramento diferencial) . Essencialmente, é verdade que está se tornando algo diferente do I2C verdadeiro, mas nas extremidades do barramento é invisível para os dispositivos. Essa família em particular converte os sinais em 2 pares diferenciais bidirecionais e também existem dispositivos semelhantes aos já mencionados nos comentários, que se traduzem em 4 pares diferenciais unidirecionais. A conversão para apenas 2 pares permite que você use o cabo CAT e ainda tenha 2 pares para alimentação / terra.

John Lewis
fonte
0

Afirmativo! Atualmente, estou tentando resolver praticamente o mesmo problema. Também estou tentando usar o I2C sobre cat5 para automação residencial com minha pinagem personalizada. O motivo é o custo, quero que seja muito econômico e os componentes I2C ainda pelo menos 5 vezes mais baratos do que os attiny13 uC (o AFAIU uC é necessário para CAN e RS485).

1) Atualmente, estou apenas em processo de teste para a primeira parte de um sistema e agora sou bem-sucedido com cabo de 15m de comprimento com 5V e conexão direta SCL e SDA! Eu uso PCF8574 e 2 relés para acionar as luzes da minha sala. Pinagem é

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

2) Entendo que não haverá mais dois relés ou mais 10 metros ... Uma queda de tensão é significativa (de 5,5 a 4,7). Portanto, para o problema de queda de tensão, vou colocar 12V em uma linha e adicionar reguladores de tensão de 5V nas placas para manter a tensão fina em todos os lugares, independentemente da queda de toda a linha. De qualquer maneira, colocarei fontes de alimentação adicionais nas próximas linhas.

3) O sinal em si pode ser aprimorado usando P82B96 ou P82B715 barato sem dividir em linhas diferenciais. Um NXP em si usa o Cat5 em algumas apresentações, mas não consigo encontrar sua pinagem. Uma parte importante aqui é que eles usam claramente linhas de sinal em pares diferentes ... por exemplo, um par é GND + SDA e o outro é VCC + SCL.

4) Outro ponto interessante - esses buffers podem simplesmente aumentar uma amplitude até 12V para aumentar a resistência ao ruído. Então, provavelmente vou tentar colocar 12V nas linhas de sinal também e isso deve permitir a entrada direta de fios de 12V ... Mas isso me forçará a colocar algo como P82B96 em cada dispositivo.

Como você deve ter notado, eu também uso uma linha de interrupção separada ... Atualmente, o Master está na placa arduino conectada ao PC. De qualquer maneira, o software mestre principal estará em um PC 24x7, portanto, o arduino apenas traduz o sinal e lida com a interrupção. Posso enviar uma configuração específica para o manuseio de interrupções a bordo, por exemplo, para manejar conveniente alternar interruptores por interrupção ... Isso me permite esquecer qualquer atraso ao alternar manualmente a luz. O manuseio de interrupção é uma vantagem adicional do i2c.

Portanto, minha ideia é que o I2C seja simples o suficiente para ser aplicável em cabos de apartamentos urbanos de <= 100m. Em vez de ir para o sinal diferencial, espero poder reduzir a frequência extra.

Eu gosto da sua ideia de colocar 5V e 12V, pois isso reduz a necessidade de reguladores e reduz o custo ... toda a idéia de barramento com vários fios para reduzir o custo de terminais, também considerarei isso para nova pinagem :)

Dmitry Gusarov
fonte
1
Este é mais um comentário estendido sobre a pergunta do que uma resposta, já que sua situação não é a mesma que a do OP: hardware mestre diferente, esquema de sinalização diferente. Mas está intimamente relacionado o suficiente para que eu o deixe repousar.
Dave Tweed