- Diferença entre comunicação UART e RS485
- Componentes necessários
- Diagrama de circuito para comunicação com fio de longa distância
- Módulo conversor MAX485 UART-RS485
- Cabo Ethernet CAT-6E
- Explicação do código Arduino
- Conclusão
Temos usado placas de desenvolvimento de microcontroladores como Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, etc. por um longo tempo em nossos pequenos projetos onde na maioria das vezes a distância entre os sensores e a placa não é mais do que alguns centímetros no máximo e a essas distâncias, a comunicação entre os diferentes módulos de sensores, relés, atuadores e controladores pode ser feita facilmente através de fios de jumper simples, sem que nos preocupemos com a distorção do sinal no meio e os ruídos elétricos que chegam a ele. Mas se você está construindo um sistema de controle com essas placas de desenvolvimento em uma distância maior que 10 a 15 metros, então você deve levar o ruído e a potência do sinal em consideração, porque se você quiser que seu sistema funcione de forma confiável, então você não pode perder o dados durante a transferência.
Existem muitos tipos diferentes de protocolos de comunicação serial, como I2C e SPI, que podem ser facilmente implementados com o Arduino e hoje vamos olhar para outro protocolo mais comumente usado, chamado RS485, que é muito comumente usado em ambientes industriais de alto ruído para transferência de dados. uma longa distância. Neste tutorial, vamos aprender sobre o protocolo de comunicação RS485 e como implementá-lo com os dois Arduino Nano que temos conosco e como usar o módulo de conversão MAX485 RS485 para UART. Anteriormente, também realizamos a comunicação MAX485 com o Arduino e também a comunicação MAX485 com o Raspberry pi, você também pode conferir se estiver interessado.
Diferença entre comunicação UART e RS485
A maioria dos sensores de baixo custo e outros módulos como GPS, Bluetooth, RFID, ESP8266, etc. que são comumente usados com Arduino, Raspberry Pi no mercado usam comunicação baseada em UART TTL porque requer apenas 2 fios TX (transmissor) e RX (Receptor). Não é um protocolo de comunicação padrão, mas é um circuito físico com o qual você pode transmitir e receber dados seriais com outros periféricos. Ele só pode transmitir / receber dados em série, portanto, primeiro converte os dados paralelos em dados seriais e, em seguida, transmite os dados.
O UART é um dispositivo de transmissão assíncrona, portanto, não há sinal de relógio para sincronizar os dados entre os dois dispositivos, em vez disso, ele usa bits de início e fim no início e no final de cada pacote de dados, respectivamente, para marcar as extremidades dos dados sendo transferidos. Os dados transmitidos pelo UART são organizados em pacotes. Cada pacote contém 1 bit de início, 5 a 9 bits de dados (dependendo do UART), um bit de paridade opcional e 1 ou 2 bits de parada. É muito bem documentado e amplamente utilizado e também possui um bit de paridade para permitir a verificação de erros. Mas existem algumas limitações, uma vez que não pode suportar vários escravos e vários mestres e o quadro de dados máximo é limitado a 9 bits. Para a transferência de dados, as taxas de baud do Mestre e do Escravo devem estar entre 10% uma da outra. Abaixo está o exemplo de como um personagem é um transmissor em uma linha de dados UART. Os sinais altos e baixos são medidos em relação ao nível GND, portanto, mudar o nível GND terá um efeito desastroso na transferência de dados.
Por outro lado, RS485 é uma comunicação mais baseada na indústria, desenvolvida para uma rede de vários dispositivos que podem ser usados em longas distâncias e também em velocidades maiores. Ele opera em um método de medição de sinalização diferencial em vez de medição de tensão com o pino GND. Os sinais RS485 são flutuantes e cada sinal é transmitido por uma linha Sig + e uma linha Sig-.
O receptor RS485 compara a diferença de tensão entre as duas linhas, em vez do nível de tensão absoluta em uma linha de sinal. Isso funciona bem e evita a existência de loops de terra, uma fonte comum de problemas de comunicação. Os melhores resultados são alcançados se as linhas Sig + e Sig- são torcidas como torção anulam o efeito do ruído eletromagnético induzido em um cabo e fornecem uma imunidade muito melhor contra o ruído que permite ao RS485 transmitir os dados até 1200m de alcance. O par trançado também permite que as velocidades de transmissão sejam muito mais altas do que é possível com cabos retos. Em pequenas distâncias de transmissão, velocidades de até 35Mbps podem ser realizadas com RS485, embora a velocidade de transmissão diminua com a distância. A 1200m de velocidade de transmissão, você pode usar apenas 100kbps de velocidade de transmissão. Você precisa de um cabo Ethernet especial para realizar este protocolo de comunicação. Existem muitas categorias de cabos Ethernet que podemos usar, como CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, etc. Em nosso tutorial, usaremos o cabo CAT-6E que tem 4 pares trançados de fios 24AWG e pode suportar até 600MHz. Ele é terminado em ambas as extremidades por um conector RJ45. Os níveis de tensão de linha típicos dos drivers de linha são de no mínimo ± 1,5 V a um máximo de cerca de ± 6 V. A sensibilidade de entrada do receptor é de ± 200 mV. O ruído na faixa de ± 200 mV é essencialmente bloqueado devido ao cancelamento de ruído do modo comum. Um exemplo de como um byte (0x3E) é transferido nas duas linhas de comunicação RS485.
Componentes necessários
- 2 × Módulo Conversor MAX485
- 2 × Arduino Nano
- 2 × 16 * 2 LCD alfanumérico
- Potenciômetros de limpador de 2 × 10k
- Cabo Ethernet Cat-6E
- Tábuas de pão
- Jumper Wires
Diagrama de circuito para comunicação com fio de longa distância
A imagem abaixo mostra o diagrama do circuito do transmissor e do receptor para a comunicação com fio de longa distância do Arduino. Observe que os circuitos do transmissor e do receptor parecem idênticos, a única coisa que difere é o código escrito nele. Também para a demonstração, estamos usando uma placa como transmissor e uma placa como receptor, mas podemos facilmente programar as placas para funcionarem como transmissor e receptor com a mesma configuração
O diagrama de conexão para o circuito acima também é fornecido abaixo.
Como você pode ver acima, existem dois pares quase idênticos de circuitos, cada um com um Arduino nano, LCD alfanumérico 16 * 2 e um IC conversor MAX485 UART para RS485 conectado a cada extremidade de um cabo Ethernet Cat-6E por meio de um conector RJ45. O cabo que usei no tutorial tem 25m de comprimento. Enviaremos alguns dados do lado do transmissor pelo cabo do Nano que são convertidos para sinais RS485 via Módulo MAX RS485 trabalhando em Modo Mestre.
Na extremidade de recepção, o módulo conversor MAX485 está trabalhando como um escravo e, ouvindo a transmissão do Mestre, ele novamente converte os dados RS485 que recebeu para os sinais TTL UART 5V padrão para serem lidos pelo Nano receptor e exibidos em 16 * 2 LCD alfanumérico conectado a ele.
Módulo conversor MAX485 UART-RS485
Este módulo conversor UART-RS485 tem um chip MAX485 on-board que é um transceptor de baixa potência e taxa de variação limitada usado para comunicação RS-485. Ele funciona com uma única fonte de alimentação de + 5 V e a corrente nominal é de 300 μA. Funciona em comunicação half-duplex para implementar a função de conversão do nível TTL em nível RS-485, o que significa que pode transmitir ou receber a qualquer momento, não ambos, pode atingir uma taxa de transmissão máxima de 2,5 Mbps. O transceptor MAX485 consome uma corrente de alimentação entre 120μA e 500μA sob as condições de descarregamento ou totalmente carregado quando o driver está desabilitado. O driver é limitado para corrente de curto-circuito e as saídas do driver podem ser colocadas em um estado de alta impedância através do circuito de desligamento térmico. A entrada do receptor tem um recurso à prova de falhas que garante saída lógica alta se a entrada for de circuito aberto.Além disso, possui um forte desempenho anti-interferência. Ele também possui LEDs integrados para exibir o estado atual do chip, ou seja, se o chip está ligado ou se está transmitindo ou recebendo dados, tornando-o mais fácil de depurar e usar.
O diagrama de circuito fornecido acima explica como o MAX485 IC onboard é conectado a vários componentes e fornece cabeçalhos de espaçamento padrão de 0,1 polegada para serem usados com a placa de ensaio, se desejar.
Cabo Ethernet CAT-6E
Quando pensamos em transferência de dados de longa distância, pensamos instantaneamente em nos conectarmos à Internet por meio de cabos Ethernet. Hoje em dia, usamos principalmente Wi-Fi para conectividade com a Internet, mas antes usávamos cabos Ethernet que iam para cada computador pessoal para conectá-lo à Internet. A principal razão por trás do uso desses cabos Ethernet em fios normais é que eles fornecem proteção muito melhor contra ruídos e distorções do sinal em grandes distâncias. Eles têm uma capa de proteção sobre a camada de isolamento para proteger contra a interferência eletromagnética e também cada par de fios é trançado para evitar qualquer formação de loop de corrente e, portanto, uma proteção muito melhor contra o ruído. Eles geralmente terminam com conectores RJ45 de 8 pinos em cada extremidade. Existem muitas categorias de cabos Ethernet que podemos usar, como CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, etc. Em nosso tutorial, usaremos o cabo CAT-6E que possui 4 pares trançados de fios 24AWG e pode suportar até 600MHz.
Imagem mostrando como um par de fios é trançado dentro da camada de isolamento do cabo CAT-6E
Conector RJ-45 destinado a cabo Ethernet CAT-6E
Explicação do código Arduino
Neste projeto, estamos usando dois Arduino Nano, um como transmissor e um como receptor, cada um conduzindo um LCD alfanumérico 16 * 2 para exibir os resultados. Portanto, no código do Arduino, vamos nos concentrar em enviar os dados e exibir os dados enviados ou recebidos na tela LCD.
Para o lado do transmissor:
Começamos incluindo a biblioteca padrão para conduzir o LCD e declarar o pino D8 do Arduino Nano como um pino de saída que usaremos posteriormente para declarar o Módulo MAX485 como um transmissor ou receptor.
int enablePin = 8; potval int = 0; #incluir
Agora vamos para a parte de configuração. Vamos puxar o pino de habilitação para cima para colocar o módulo MAX485 no modo transmissor. Como é um IC half-duplex, não pode transmitir e receber ao mesmo tempo. Também inicializaremos o LCD aqui e imprimiremos uma mensagem de boas-vindas.
Serial.begin (9600); // inicializa o serial na taxa de transmissão 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUITO DIGEST"); lcd.setCursor (0,1); lcd.print ("Transmissor Nano"); atraso (3000); lcd.clear ();
Agora no loop, escrevemos um valor inteiro continuamente crescente nas linhas seriais que é então transmitido para o outro nano. Este valor também é impresso no LCD para exibição e depuração.
Serial.print ("Valor enviado ="); Serial.println (potval); // Grava serial POTval no barramento RS-485 lcd.setCursor (0,0); lcd.print ("Valor enviado"); lcd.setCursor (0,1); lcd.print (potval); atraso (1000); lcd.clear (); potval + = 1;
Lado do receptor:
Aqui, novamente, começamos incluindo a biblioteca padrão para conduzir o LCD e declarar o pino D8 do Arduino Nano como um pino de saída que usaremos posteriormente para declarar o Módulo MAX485 como um transmissor ou receptor.
int enablePin = 8; #incluir
Agora vamos para a parte de configuração. Vamos puxar o pino de habilitação para cima para colocar o módulo MAX485 no modo receptor. Como é um IC half-duplex, não pode transmitir e receber ao mesmo tempo. Também inicializaremos o LCD aqui e imprimiremos uma mensagem de boas-vindas.
Serial.begin (9600); // inicializa o serial na taxa de transmissão 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUITO DIGEST"); lcd.setCursor (0,1); lcd.print ("Receiver Nano"); atraso (3000); digitalWrite (enablePin, LOW); // (Pino 8 sempre BAIXO para receber valor do Mestre)
Agora, no loop, verificamos se há algo disponível na porta serial e, em seguida, lemos os dados e, como os dados de entrada são inteiros, nós os analisamos e exibimos no LCD conectado.
int pwmval = Serial.parseInt (); // Recebe o valor INTEGER do Mestre através do RS-485 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Valor recebido"); lcd.setCursor (0,1); lcd.print (pwmval); atraso (1000); lcd.clear ();
Conclusão
A configuração de teste que usamos para este projeto pode ser encontrada abaixo.
O funcionamento completo deste projeto pode ser encontrado no vídeo no link abaixo. Este método é um dos métodos simples e fáceis de implementar para transferir os dados por longas distâncias. Neste projeto, usamos apenas uma taxa de transmissão de 9600, que está bem abaixo da velocidade de transferência máxima que podemos alcançar com o Módulo MAX-485, mas esta velocidade é adequada para a maioria dos módulos de sensor lá fora e realmente não precisamos todas as velocidades máximas ao trabalhar com o Arduino e outras placas de desenvolvimento, a menos que você esteja usando o cabo como uma conexão Ethernet e requeira toda a largura de banda e velocidade de transferência que puder. Brinque com a velocidade de transferência por conta própria e experimente outros tipos de cabo Ethernet também. Se você tiver alguma dúvida, deixe-a na seção de comentários abaixo ou use nossos fóruns e tentarei respondê-la da melhor maneira. Até então, adios!