- Comunicação serial RS-485
- Conectando RS-485 com Arduino
- Módulo conversor USB para RS-485
- Software Simply Modbus Master
- Ferramentas necessárias
- Diagrama de circuito
- Programando Arduino UNO para RS-485 MODBUS Slave
- Testando o Arduino UNO como Rs485 Modbus Slave
Modbus é um protocolo de comunicação serial que foi descoberto pela Modicon em 1979 e é usado para transmitir dados em linhas seriais entre os dispositivos eletrônicos industriais. O Modbus RS-485 usa RS-485 para linhas de transmissão. Deve-se notar que o Modbus é um protocolo de software e não um protocolo de hardware. É dividido em duas partes, como Modbus Master e Modbus Slave. Na rede Modbus RS-485 há um mestre e 127 escravos, cada um com endereço exclusivo de 1 a 127. Neste projeto do Arduino MAX485, usaremos o Arduino Uno como escravo para comunicação serial.
Modbus são usados principalmente em CLPs (controladores lógicos programáveis). Além disso, o Modbus também é usado em saúde, transporte, automação residencial, etc. O Modbus tem 255 códigos de função e existem principalmente três versões populares do Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Qual é a diferença entre Modbus ASCII e Modbus RTU?
Modbus RTU e Modbus ASCII falam o mesmo protocolo. A única diferença é que os bytes sendo transmitidos pelo fio são apresentados como binários com RTU e como ASCII legível com Modbus RTU. O Modbus RTU será usado neste tutorial.
Este tutorial é sobre como usar a comunicação Modbus RS-485 com Arduino UNO como Slave. Aqui, instalamos o software Simply Modbus Master no PC e controlamos dois LEDs e o servo motor usando RS-485 como linha de transmissão. Esses LEDs e servo motores são conectados ao Slave Arduino e controlados pelo envio de valores usando o software Master Modbus. Como este tutorial usa RS-485, é recomendado primeiro passar pela Comunicação serial RS485 entre o Arduino Uno e o Arduino Nano. RS485 também pode ser usado com outros controladores para comunicação serial:
- Comunicação serial RS-485 entre Raspberry Pi e Arduino UNO
- Comunicação serial entre STM32F103C8 e Arduino UNO usando RS-485
Vamos começar explorando algumas informações básicas sobre o RS-485 e o Modbus. Aprenda também mais sobre os vários protocolos de comunicação serial aqui.
Comunicação serial RS-485
RS-485 é um protocolo de comunicação serial assíncrono que não requer clock. Ele usa uma técnica chamada de sinal diferencial para transferir dados binários de um dispositivo para outro.
Então, qual é esse método de transferência de sinal diferencial ??
O método de sinal diferencial funciona criando uma tensão diferencial usando 5 V positivo e negativo. Ele fornece uma comunicação Half-Duplex ao usar dois fios e Full-Duplex requer 4 quatro fios.
Usando este método:
- RS-485 suporta maior taxa de transferência de dados de 30 Mbps no máximo.
- Ele também fornece distância máxima de transferência de dados em comparação com o protocolo RS-232. Ele transfere dados de até 1200 metros no máximo.
- A principal vantagem do RS-485 sobre o RS-232 é o escravo múltiplo com mestre único, enquanto o RS-232 suporta apenas escravo único.
- Pode ter no máximo 32 dispositivos conectados ao protocolo RS-485.
- Outra vantagem do RS-485 é imune ao ruído, pois eles usam o método de sinal diferencial para transferência.
- RS-485 é mais rápido em comparação com o protocolo I2C.
Conectando RS-485 com Arduino
O Módulo RS-485 pode ser conectado a qualquer microcontrolador com porta serial. Para usar o módulo RS-485 com microcontroladores, um módulo chamado 5V MAX485 TTL para RS485 que é baseado no Maxim MAX485 IC é necessário, pois permite a comunicação serial em uma longa distância de 1200 metros. É bidirecional e half duplex e possui taxa de transferência de dados de 2,5 Mbps. Este módulo requer uma tensão de 5V.
Pin-Out de RS-485:
Nome do Pin |
Descrição do pino |
VCC |
5V |
UMA |
Entrada do receptor não inversora Saída de driver não inversora |
B |
Invertendo a entrada do receptor Invertendo a saída do driver |
GND |
GND (0V) |
R0 |
Receptor de saída (pino RX) |
RÉ |
Saída do receptor (LOW-Enable) |
DE |
Saída do driver (HIGH-Enable) |
DI |
Entrada do driver (pino TX) |
Módulo conversor USB para RS-485
Este é um módulo adaptador de conversor USB para RS485 que suporta WIN7, XP, Vista, Linux, Mac OS e fornece uma interface RS485 fácil de usar por meio da porta COM no computador . Este módulo é um dispositivo plug-and-play . Não existem estruturas de comando, o que quer que seja enviado para a Porta COM Virtual é automaticamente convertido para RS485 e vice-versa. O módulo é totalmente autoalimentado pelo barramento USB. Portanto, não há necessidade de fonte de alimentação externa para operação.
Ele aparece como uma porta Serial / COM e é acessível a partir de aplicativos ou hiper-terminal. Este conversor fornece comunicação RS-485 half-duplex. A faixa da taxa de Baud é de 75 bps a 115200 bps, com máximo de 6 Mbps.
Para usar este dispositivo, existem vários softwares Modbus disponíveis na Internet. Neste tutorial, um software chamado Simply Modbus Software é usado.
Software Simply Modbus Master
O aplicativo Modbus Master Software é necessário para enviar dados ao dispositivo escravo Modbus RS-485 Arduino via COM.
Simply Modbus Master é um software de teste de comunicação de dados. Você pode baixar o Simply Modbus Master no link fornecido e aprender mais sobre ele consultando o Manual do software.
Antes de usar o software, é importante se familiarizar com as seguintes terminologias.
ID do escravo:
Cada escravo em uma rede é atribuído a um endereço de unidade exclusivo de 1 a 127. Quando o mestre solicita dados, o primeiro byte que ele envia é o endereço do escravo. Desta forma, cada escravo sabe após o primeiro byte se deve ou não ignorar a mensagem.
Código de função:
O segundo byte enviado pelo Mestre é o código de função. Este número diz ao escravo qual tabela acessar e se deve ler ou escrever na tabela.
Códigos de função de registro suportados:
Código de Função |
Açao |
Nome da tabela |
04 (04 hex) |
Ler |
Registros de entrada analógica |
03 (03 hex) |
Ler |
Registros de retenção de saída analógica |
06 (06 hex) |
Escrever single |
Registro de retenção de saída analógica |
16 (10 hex) |
Escreva vários |
Registros de retenção de saída analógica |
Códigos de função da bobina com suporte:
Código de Função |
Açao |
Nome da tabela |
02 (02 hex) |
Ler |
Contatos de entrada discreta |
01 (01 hex) |
Ler |
Bobinas de saída discreta |
05 (05 hex) |
Escrever single |
Bobina de Saída Discreta |
15 (0F hex) |
Escreva vários |
Bobinas de saída discreta |
CRC:
CRC significa verificação de redundância cíclica. São dois bytes adicionados ao final de cada mensagem Modbus para detecção de erro.
Ferramentas necessárias
Hardware
- Arduino UNO
- MAX-485 TTL para Módulo Conversor RS-485
- Módulo conversor USB para RS-485
- LED (2)
- 1k-Resistor (2)
- Visor LCD 16x2
- Potenciômetro de 10k
- Servo motor SG-90
Programas
- Simplesmente Modbus Master
Diagrama de circuito
Conexão de circuito entre MAX-485 TTL para módulo conversor RS-485 e Arduino UNO:
Arduino UNO |
MAX-485 TTL para Módulo Conversor RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE e RE |
+ 5V |
VCC |
GND |
GND |
Conexão de circuito entre MAX-485 TTL para Módulo RS-485 e conversor USB para RS-485:
MAX-485 TTL para RS-485 Módulo Conversor |
Módulo USB para RS-485 Conectado com PC |
UMA |
UMA |
B |
B |
Conexões de circuito entre o Arduino UNO e a tela LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Para controlar o pino do potenciômetro para controle de contraste / brilho do LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UMA |
+ 5V |
K |
GND |
Conexão do circuito entre 2 LEDs, servo motor e Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2 |
Ânodo através de resistor 1k |
- |
- |
5 |
- |
Ânodo através de resistor 1k |
- |
6 |
- |
- |
Pino PWM (laranja) |
+ 5V |
- |
- |
+ 5V (VERMELHO) |
GND |
Cátodo GND |
Cátodo GND |
GND (marrom) |
Programando Arduino UNO para RS-485 MODBUS Slave
O Arduino UNO é configurado como Modbus Slave. Além disso, o Arduino UNO é conectado com dois LEDs e um servo motor. Portanto, o Arduino escravo é controlado a partir do software Master Modbus. A comunicação entre o Arduino UNO e o software Modbus Master é realizada através do módulo RS-485. Para conectá-lo ao PC, é usado o módulo conversor USB para RS-485. E o Arduino UNO com MAX-485 TTL para módulo conversor RS-485, toda a configuração terá a seguinte aparência:
Para usar o Modbus no Arduino UNO, uma biblioteca
Inicialmente, inclua a biblioteca necessária. A biblioteca ModbusRTU é para usar comunicação Modbus RS-485, e a biblioteca de cristal líquido é para usar LCD com Arduino UNO, e a biblioteca servo é para usar servo motor com Arduino UNO.
#incluir
Agora, os pinos do ânodo do LED que estão conectados aos pinos 2 e 5 do Arduino são definidos como LED1 e LED2.
#define led1 2 #define led2 5
Em seguida, o objeto para acessar a classe Liquid Crystal é declarado com os pinos do LCD (RS, E, D4, D5, D6, D7) que estão conectados ao Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Quando o LCD estiver pronto, inicialize o objeto servo para a classe Servo. Também inicializa o objeto de barramento para a classe Modbus.
Servo servo; Barramento Modbus;
Em seguida, para armazenar valores para comunicação Modbus, uma matriz é declarada com os três valores inicializados com zero.
uint16_t modbus_array = {0,0,0};
Na função de configuração , primeiro o LCD é configurado no modo 16x2 e uma mensagem de boas-vindas é exibida e apagada.
lcd.begin (16,2); // Lcd definido no modo 16x2 lcd.print ("RS-485 Modbus"); // Mensagem de boas-vindas lcd.setCursor (0,1); lcd.print ("Arduino Slave"); atraso (5000); lcd.clear ();
Depois disso, os pinos LED1 e LED2 são definidos como pinos de saída.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
O pino de pulso do servo conectado ao pino 6 do PWM do Arduino está conectado.
servo.attach (6);
Agora, para a comunicação Modbus, os seguintes parâmetros são definidos. O primeiro '1' representa o ID do Slave, o segundo '1' representa que ele usa RS-485 para transferir dados e '4' representa o pino RS-485 DE&RE conectado ao Arduino UNO.
barramento = Modbus (1,1,4);
O escravo Modbus é definido em 9600 baudrate.
O loop começa com a definição de bus poll e bus.poll () é usado para escrever e receber valor do Modbus mestre.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Este método é usado para verificar se há dados disponíveis na porta serial.
Se houver algum dado disponível na porta serial, a biblioteca Modbus RTU verificará a mensagem (verifique o endereço do dispositivo, comprimento de dados e CRC) e executará a ação necessária.
Por exemplo, para escrever ou ler qualquer valor do mestre, o ModbusRTU deve receber uma matriz inteira sem sinal de 16 bits e seu comprimento do Modbus mestre. Essa matriz carrega os dados que são gravados do mestre.
Neste tutorial, há três arranjos para LED1, LED2 e ângulo do servo motor.
Primeiro, para ligar ou desligar o modbus_array LED1 é usado.
if (modbus_array == 0) // Depende do valor em modubus_array escrito pelo Mestre Modbus { digitalWrite (led1, LOW); // LED DESLIGADO se 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED LIGADO se o valor for diferente de 0 lcd.setCursor (0,0); lcd.print ("L1: LIGADO"); }
A seguir para ligar ou desligar o modbus_array LED2 é usado.
if (modbus_array == 0) // Depende do valor em modbus_array escrito pelo Mestre Modbus { digitalWrite (led2, LOW); // LED DESLIGADO se 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED LIGADO se o valor for diferente de 0 lcd.setCursor (9,0); lcd.print ("L2: LIGADO"); }
Em seguida, para definir o ângulo do servo motor, o modbus_array usado e o valor são impressos no display LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Ângulo do servo:"); lcd.print (pwm); atraso (200); lcd.clear ();
Isso finaliza a programação do Arduino UNO para funcioná-lo como MODBUS Slave. A próxima etapa será testá-lo como Modbus Slave.
Testando o Arduino UNO como Rs485 Modbus Slave
Após a conclusão das conexões do circuito e o upload do código para o Arduino UNO, é hora de conectar o USB ao módulo RS-485 com o PC onde o software Simple Modbus Master está instalado.
Abra o gerenciador de dispositivos e verifique a porta COM de acordo com o seu PC onde o módulo USB para RS-485 está conectado e depois abra o software Simply Modbus Master 8.1.1.
1. Após o Simply Modbus Software ser aberto, abra a opção Write.
2. Depois que o Simply Modbus Master Write for aberto. Defina os parâmetros
Modo em RTU, porta COM de acordo com seu PC (o meu era COM6), Baud em 9600, bits de dados 8, bit de parada 1, paridade nenhuma e ID do escravo como 1.
3. Depois disso, defina o primeiro registro como 40001 e os valores a serem escritos são 3 e o código da função como 16 (Registro de retenção de gravação).
Depois disso, escreva 1 a 40001 (Para LED1 aceso) e 1 a 40002 (Para LED2 aceso) e 90 a 40003 (Para Ângulo do Servo Motor) e clique no botão ENVIAR.
Você pode ver que o status do LED está LIGADO e o ângulo do servo em 90 graus.
4. Depois disso, digite 40001 como 1 e 40002 como 0 e 40003 como 180 e clique no botão ENVIAR.
5. Agora, escrevendo 135 a 40003 e 40001 como 0 e 40002 como 1.
É assim que o Modbus RS-485 pode ser usado na comunicação serial com o Arduino UNO como Slave. No próximo tutorial usaremos o Arduino Uno como mestre na compactação MODBUS.
Encontre o código completo e um vídeo de demonstração abaixo.