Serial Link Comunicações & Serviços
Manual Técnico
Arduino Supervisório MODBUS & Conversor RS485
2015 – Todos os direitos reservados – Página 1 de 27
Serial Link Comunicações & Serviços
SumárioManual Técnico......................................................................................................................................................1
Introdução.........................................................................................................................................................3Arduino Supervisório MODBUS...................................................................................................................3Conversor RS485........................................................................................................................................3
Características..................................................................................................................................................4Sobre o RS485 & MODBUS.............................................................................................................................5Diagrama de Conexões Para Testes de Bancada............................................................................................6Como Ligar FTDi Basic No Arduino Supervisório.............................................................................................8Siga a orientação mostrada nas fotos abaixo para conectar seu Arduino FTDi Basic da Serial Link no Arduino Supervisório MODBUS........................................................................................................................8Veja também o manual do Arduino FTDi Basic no link abaixo:........................................................................8http://www.seriallink.com.br/lab/Arduino/Datasheet_FTDiBasic_SerialLink.pdf...............................................8Identificando Conectores & Jumpers................................................................................................................9Detalhes Sobre o Arduino Supervisório..........................................................................................................16Configurando Jumpers....................................................................................................................................18Exemplo 1 – Teste de Bancada Comunicando 2 Arduinos.............................................................................21
Código do Exemplo 1.................................................................................................................................21Exemplo 2 – Ligando 4 Arduinos em Rede....................................................................................................23
Código do Exemplo 2.................................................................................................................................24
2015 – Todos os direitos reservados – Página 2 de 27
Serial Link Comunicações & Serviços
Introdução
Neste manual veremos os detalhes técnicos de dois produtos, concebidos para funcionar em conjunto, formando uma rede MODBUS, via comunicação RS485.
Arduino Supervisório MODBUS
Arduino Supervisório que a gente já conhece, mas nessa versão,
integrado com um circuito de comunicação RS485.
Totalmente configurável por jumpers, o módulo RS485 integrado no Arduino Supervisório, é muito versátil. Tão versátil que pode ser “destacado”! Isso mesmo! Você pode cortar o Módulo RS485 fora do Arduino Supervisório e ambos continuarão funcionando separadamente.
Conversor RS485
Conversor RS485 é um Módulo Avulso que pode ser ligado em um FTDi, um
Arduino UNO, NANO etc.
Na verdade o Conversor RS485 é igual ao Módulo Integrado RS485 do Arduino Supervisório, com algumas pequenas diferenças. A primeira é dele ser avulso. A segunda
é que seu conector tem uma pinagem diferente do RS485 integrado.
Mas possui todos os jumpers de configuração e a mesma funcionalidade do módulo integrado. Foi pensado dessa forma para ser um acessório de bancada, onde você pode ligar seu Arduino UNO nesse Conversor RS485 e ligar os fios no Arduino Supervisório MODBUS, para testar a comunicação MODBUS.
No manual veremos também código de exemplo para você poder efetuar os testes de funcionamento do seu equipamento.
2015 – Todos os direitos reservados – Página 3 de 27
Serial Link Comunicações & Serviços
Características
Arduino Supervisório MODBUS
• Aceita alimentação 5VDC e 12VDC• Proteção contra curto-circuito na entrada de 12VDC• Exclusivo Conector FTDi Serial Link para carregar a programação do Arduino sem precisar tirar o chip
da placa.• Todas as portas do Arduino UNO disponíveis para conexão via bornes parafusáveis, garantindo
melhor fixação contra vibrações.• Portas Auxiliares também dispostas em bornes
◦ AREF, RST, GND• Nesta versão temos também bornes para fixação dos fios da Comunicação RS485• Possibilidade de cortar o módulo integrado RS485 fora e utilizar o Arduino Supervisório sozinho• Jumpers de Configuração do Módulo RS485
◦ 7 jumpers, sendo:▪ 1x Jumper de GND (desativado)▪ 1x Jumper EN – Decide se envia ou recebe, ▪ 2x na linha da Serial, ▪ 1x de resistor terminador (120R), ▪ 2x resistores de pull-up/down (470R)
• Conector Auxiliar RS485 caso o módulo seja cortado para também poder ser usado separadamente
Conversor RS485
• Apenas alimentação 5VDC• Acessório indispensável para testes de bancada• Integra plataformas como PC, Android, Arduino UNO, Raspberry Pi, através da Serial, convertendo
em RS485.• Oferece integração simples usando apenas 5 fios:
◦ 5V, GND, EN, RX, TX (não necessariamente nessa ordem, vide ordem correta abaixo)• Possui também os Jumpers de Configuração do Módulo RS485
◦ 7 jumpers, sendo:▪ 1x Jumper de GND (desativado)▪ 1x Jumper EN – Decide se envia ou recebe, ▪ 2x na linha da Serial, ▪ 1x de resistor terminador (120R), ▪ 2x resistores de pull-up/down (470R)
• Borne com terminais parafusáveis para ligação dos fios da Comunicação RS485, compatíveis com a linha Supervisório da Serial Link.
2015 – Todos os direitos reservados – Página 4 de 27
Serial Link Comunicações & Serviços
Sobre o RS485 & MODBUS
RS485
É o código determinado por uma norma de engenharia para definir a comunicação entre equipamentos. Essa norma RS485 em especial é muito interessante pois determina níveis lógicos de sinal, com tensões que ultrapassam os 30V positivos e negativos!
Essa característica é muito interessante para comunicação a longas distâncias!
O “Protocolo RS485”, como é conhecida essa norma de engenharia da comunicação, por suas características, consegue lidar com distâncias de até 2Km!
Isso tudo em apenas dois fios trançados!
MODBUS
O mais interessante da aplicação do Protocolo RS485 é a possibilidade de definir endereços para cada Nó daRede, ou seja, para cada Equipamento ligado em série pelos dois fios, formando uma rede de comunicação, conforme veremos adiante.
Veremos código para implementar essa Rede conhecida por MODBUS e como comunicar com os equipamentos ligados na rede de forma individual.
2015 – Todos os direitos reservados – Página 5 de 27
Serial Link Comunicações & Serviços
Diagrama de Conexões Para Testes de Bancada
Efetue as conexões fornecidas no diagrama abaixo para poder executar os exemplos desse manual.
Repare que serão necessários adicionalmente dois itens:• Arduino FTDi Basic (fabricado e vendido pela Serial Link, separadamente)• Arduino UNO (chines ou original italiano, comprado a parte)
2015 – Todos os direitos reservados – Página 6 de 27
Conversor RS485
N/ATX
RX5VENGND
Arduino UNO
D3D0 (RX)
D1 (TX)
A B
Serial Link Comunicações & Serviços
Diagrama de Conexões (Cont.)
2015 – Todos os direitos reservados – Página 7 de 27
Arduino Supervisório MODBUS
+ -
BA
Conectar aqui o ATMega328
Conectar aqui o FTDI Basic para carregar a programação
Serial Link Comunicações & Serviços
Como Ligar FTDi Basic No Arduino Supervisório
Siga a orientação mostrada nas fotos abaixo para conectar seu Arduino FTDi Basic da Serial Link no Arduino Supervisório MODBUS.
Veja também o manual do Arduino FTDi Basic no link abaixo:
http://www.seriallink.com.br/lab/Arduino/Datasheet_FTDiBasic_SerialLink.pdf
2015 – Todos os direitos reservados – Página 8 de 27
Serial Link Comunicações & Serviços
Identificando Conectores & Jumpers
Arduino Supervisório MODBUS
Tendo em mãos sua placa do Arduino Supervisório com RS485 integrado, vamos verificar onde estão localizadas as portas, as posições dos bornes e também conectores auxiliares e jumpers.
Portas Digitais
Compatíveis com padrão de pinagem do Arduino UNO. A única diferença está na identificação dos pinos D0 eD1, que no Arduino Supervisório aparecem como RX e TX, respectivamente.
Portas digitais 0 a 9:
Portas digitais 10 a 13:
2015 – Todos os direitos reservados – Página 9 de 27
Serial Link Comunicações & Serviços
Portas Analógicas
Arduino Supervisório possui 6 portas analógicas, desde A0 até A5, conforme foto:
Alimentação 5VDC & 12VDC
Contando com um Regulador de Tensão, o Arduino Supervisório aceita alimentação 5V (corrente contínua) e também 12V (corrente contínua)
ATENÇÃO – Não ligue AC (corrente alternada) em nenhum borne de alimentação!
Borne de Alimentação 5VDC
2015 – Todos os direitos reservados – Página 10 de 27
+
-
Serial Link Comunicações & Serviços
Borne de Alimentação 12VDC
Portas Auxiliares
As portas auxiliares do Arduino Supervisório encontram-se no mesmo conector da Alimentação 5VDC, conforme foto:
2015 – Todos os direitos reservados – Página 11 de 27
+ -
Portas Auxiliares
Serial Link Comunicações & Serviços
Conector RS485
Integrado ao Arduino Supervisório, temos os bornes do Conector RS485, onde devemos ligar os fios trançados da Rede MODBUS.
2015 – Todos os direitos reservados – Página 12 de 27
Serial Link Comunicações & Serviços
Jumpers de Configuração RS485
Ligamos todos os equipamentos da Rede MODBUS em série, através de dois fios trançados para evitar interferência magnética externa.
Como muitos Arduinos Supervisório podem ser ligados na mesma Rede, muitos jumpers de configuração de fazem necessários para ajustar cada Arduino da Rede com uma configuração diferente.
Na rede RS485 temos algumas características interessantes, vejamos a imagem da Rede MODBUS abaixo:
Repare que os equipamentos da ponta precisam ativar o resistor terminador de 120 ohms. E que também um deles precisa ativar os resistores de pull-up/down. Já os outros equipamentos da Rede RS485 não precisam, então todos esses detalhes são configurados através do sete (07) jumpers disponíveis na plataforma MODBUS da Serial Link.
2015 – Todos os direitos reservados – Página 13 de 27
Serial Link Comunicações & Serviços
Veja abaixo na foto onde estão localizados os Jumpers e também a numeração deles que utilizaremos adiante nesse manual.
1) Jumper do GND – Sem uso, apenas um pino extra de GND. (Não conectado)2) Jumper do EN – Chaveia entre Transmissão/Recepção (ENABLE)3) Jumper do RX – Jumper da linha Serial RX (desligar quando for subir programação no Arduino)4) Jumper do TX – Jumper da linha Serial TX (desligar quando for subir programação no Arduino)5) Jumper de Pull-Up – Ligado no Resistor 470R que vai para o positivo (VCC)6) Jumper do Terminador – Ligado no Resistor 120R terminador da Rede RS4857) Jumper de Pull-Down – Ligado no Resistor 470R que vai para o terra (GND)
2015 – Todos os direitos reservados – Página 14 de 27
1
234
5
6
7
Serial Link Comunicações & Serviços
Conector FTDi
Por se tratar de um Arduino Supervisório REV2.1 Red Dragon, temos nessa placa também o Conector FTDi, para carregar códigos do Arduino sem precisar retirar o chip ATMega da placa!
O Arduino FTDi Basic da Serial Link foi desenvolvido para esse fim e deve ser conectado nesse conector da foto abaixo:
2015 – Todos os direitos reservados – Página 15 de 27
Conector FTDi
Serial Link Comunicações & Serviços
Detalhes Sobre o Arduino Supervisório
O Arduino Supervisório é bem simples de ser utilizado, pois ele funciona como um Arduino UNO qualquer.
Veja tabela comparativa abaixo:
Característica Arduino UNO
Arduino Supervisório
Conversor USB/Serial integrado SIM NÃO
Saídas digitais D0~D13 SIM SIM
Saídas Analógicas A0~A5 SIM SIM
Alimentação 5V/GND SIM SIM
Alimentação 12V/GND SIM (VIN) SIM
Portas Auxiliares RST e AREF SIM SIM
Regulador de Tensão 3V3 SIM NÃO
Como podemos ver, as únicas diferenças são entre o Conversor USB/Serial e o Regulador de Tensão 3,3V.
No caso do Conversor USB/Serial, o Arduino UNO possui um ATMega16u2 integrado na placa para essa tarefa; bem como componentes auxiliares e o conector USB, tudo integrado na placa.
Já o Arduino Supervisório não possui o Conversor USB/Serial integrado, pois como ele é voltado para ser utilizado em máquinas que possuem vibrações, o circuito é bem minimalista e robusto; portanto esse circuito (que serve apenas na bancada) foi separado no Arduino FTDi Basic, que é um outro produto Serial Link vendido separadamente:
http://seriallink.com.br/web/index.php?r=produtos/placaarduinoftdibasic
Dessa forma o cliente precisa comprar apenas um Arduino FTDi Basic para gravar quantos Arduinos Supervisório quiser!
Além de ser mais econômico, basta deixar o Arduino FTDi Basic já conectado no cabo USB para atualizar o código da máquina, sem precisar desmontar nada! Basta apenas chegar perto com um Notebook e “espetar” o FTDi Basic no conector FTDi do Arduino Supervisório!
2015 – Todos os direitos reservados – Página 16 de 27
Serial Link Comunicações & Serviços
Módulo Integrado RS485
A novidade dessa versão de Arduino Supervisório é o Módulo RS485 integrado, que traz uma característica muito interessante para a plataforma Supervisório:
• A possibilidade de ligar vários Arduinos em Rede!
Dessa forma é possível integrar várias máquinas, reduzindo o custo, sem se preocupar com distâncias, pois oRS485 é conhecido pela sua confiabilidade de conexão em cabos trançados de até 2Km!
Vamos ver os exemplos.
2015 – Todos os direitos reservados – Página 17 de 27
Serial Link Comunicações & Serviços
Configurando Jumpers
A princípio, 7 parece um número muito grande de jumpers para configurar, mas não é tão complicado assim! Um deles ainda não tem uso e serve como um pino auxiliar de GND. Ele é o primeiro Jumper, conforme foto:
Dois deles são os da linha da Serial, que ligam os circuitos do RX e TX (e que devem ser desligados ao carregar programas pelo FTDi) conforme foto abaixo:
2015 – Todos os direitos reservados – Página 18 de 27
34
1
Serial Link Comunicações & Serviços
O jumper principal da Rede MODBUS é o que ativa o resistor de 120 ohms. Esse resistor é chamado de terminador e só precisa ser ativado “nos Arduinos das pontas”, ou seja, no primeiro Arduino e no último da Rede.
Outros dois jumpers importantes na Comunicação RS485 são os de pull-up/down da Rede. Eles são responsáveis por criar um divisor resistivo na alimentação positiva (pull-up) e negativa (pull-down).
Estes jumpers precisam ser ativados em apenas 1 dos Arduinos da Rede toda. Ou seja, basta ativar esses jumpers em qualquer um dos Arduinos da rede e desligar em todos os outros. Costuma-se ativar esses jumpers de elevação no primeiro ou no último Arduino (sempre nos Arduinos das pontas).
2015 – Todos os direitos reservados – Página 19 de 27
6
5
7
Serial Link Comunicações & Serviços
Por último e não menos importante temos o Jumper do ENABLE, que funciona como uma chave para decidir se o módulo está transmitindo ou recebendo. Veremos isso na parte do código, mas basta colocar esse pino em estado lógico para transmitir e em estado baixo para receber. Esse jumper fica normalmente conectado e não precisa mexer.
A placa do Arduino Supervisório MODBUS acompanha todas as capinhas dos jumpers.
2015 – Todos os direitos reservados – Página 20 de 27
2
Serial Link Comunicações & Serviços
Exemplo 1 – Teste de Bancada Comunicando 2 Arduinos
Para esse exemplo, vamos conectar os fios conforme mostrado mais acima neste manual, no diagrama de teste de bancada.
O que vamos fazer é bem simples:
1. Ligamos o Módulo Avulso RS485 no Arduino UNO2. Conectamos os fios trançados entre o Módulo Avulso e o Integrado de RS4853. Ligamos alimentação no Arduino Supervisório4. Ligamos o Arduino UNO na USB do computador.5. Pronto!
É simples assim! Se você quiser, pode adicionar alguns LEDs em série com resistores nas portas do Arduino Supervisório para ver eles acendendo conforme os comandos enviados pelo Arduino UNO.
Código do Exemplo 1
Cod1Transmissor.inoint enablePin = 3; // endereco do pino EN
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, HIGH); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW }
void loop(){ // Acionando 4 LEDs que ficam no Receptor for (int i = 0; i < 4; i++) { switch(i) { // acionando Arduino (A) do BUS // pulsando 1 led por segundo // sequencialmente case 0: Serial.println("A1000"); break; case 1: Serial.println("A0100"); break; case 2: Serial.println("A0010"); break; case 3: Serial.println("A0001"); break; } delay(1000); }}
2015 – Todos os direitos reservados – Página 21 de 27
Serial Link Comunicações & Serviços
Cod1Receptor.inoint enablePin = 3; // endereco do pino ENchar endereco = 'A'; // definir aqui o endereco do Arduino no BUS
String inputString = ""; // string q recebe os dadosboolean stringComplete = false; // terminou de receber string?
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, LOW); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW // Ativando as portas dos LEDs de verificacao // LEDs nas portas digitas 4, 5, 6, 7, 8 for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } }
void loop(){ if (stringComplete) { // verificando se comando eh pra mim if (inputString.charAt(0) == endereco) { for (int i = 1; i < 5; i++) { if (inputString.charAt(i) == '1') digitalWrite(3 + i, 1); else digitalWrite(3 + i, 0); } } // limpa string inputString = ""; stringComplete = false; }}
void serialEvent(){ while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') stringComplete = true; }}
2015 – Todos os direitos reservados – Página 22 de 27
Serial Link Comunicações & Serviços
Exemplo 2 – Ligando 4 Arduinos em Rede
Neste outro exemplo veremos como comunicar o Arduino Uno com 3 outros Arduinos Supervisórios, formandouma Rede com 4 Arduinos no total!
Se você adicionalmente quiser montar os LEDs conforme a foto abaixo, o código de teste forma um efeito bem interessante!
2015 – Todos os direitos reservados – Página 23 de 27
Serial Link Comunicações & Serviços
Código do Exemplo 2
Cod2Transmissor.inoint enablePin = 3; // endereco do pino EN
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, HIGH); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW }
void loop(){ // Acionando 4 LEDs que ficam no Receptor for (int i = 0; i < 4; i++) { // acionando Arduino (A) do BUS switch(i) { // pulsando 1 led por segundo // sequencialmente case 0: Serial.println("A1000"); break; case 1: Serial.println("A0100"); break; case 2: Serial.println("A0010"); break; case 3: Serial.println("A0001"); break; } // acionando Arduino (B) do BUS switch(i) { // pulsando 1 led por segundo // sequencialmente case 0: Serial.println("B1000"); break; case 1: Serial.println("B0100"); break; case 2: Serial.println("B0010"); break; case 3: Serial.println("B0001"); break; } // acionando Arduino (C) do BUS switch(i) { // pulsando 1 led por segundo // sequencialmente case 0: Serial.println("C1000"); break; case 1: Serial.println("C0100"); break; case 2: Serial.println("C0010"); break; case 3: Serial.println("C0001"); break; } delay(1000); }}
2015 – Todos os direitos reservados – Página 24 de 27
Serial Link Comunicações & Serviços
Cod2ReceptorA.inoint enablePin = 3; // endereco do pino ENchar endereco = 'A'; // definir aqui o endereco do Arduino no BUS
String inputString = ""; // string q recebe os dadosboolean stringComplete = false; // terminou de receber string?
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, LOW); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW // Ativando as portas dos LEDs de verificacao // LEDs nas portas digitas 4, 5, 6, 7, 8 for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } }
void loop(){ if (stringComplete) { // verificando se comando eh pra mim if (inputString.charAt(0) == endereco) { for (int i = 1; i < 5; i++) { if (inputString.charAt(i) == '1') digitalWrite(3 + i, 1); else digitalWrite(3 + i, 0); } } // limpa string inputString = ""; stringComplete = false; }}
void serialEvent(){ while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') stringComplete = true; }}
2015 – Todos os direitos reservados – Página 25 de 27
Serial Link Comunicações & Serviços
Cod2ReceptorB.inoint enablePin = 3; // endereco do pino ENchar endereco = 'B'; // definir aqui o endereco do Arduino no BUS
String inputString = ""; // string q recebe os dadosboolean stringComplete = false; // terminou de receber string?
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, LOW); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW // Ativando as portas dos LEDs de verificacao // LEDs nas portas digitas 4, 5, 6, 7, 8 for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } }
void loop(){ if (stringComplete) { // verificando se comando eh pra mim if (inputString.charAt(0) == endereco) { for (int i = 1; i < 5; i++) { if (inputString.charAt(i) == '1') digitalWrite(3 + i, 1); else digitalWrite(3 + i, 0); } } // limpa string inputString = ""; stringComplete = false; }}
void serialEvent(){ while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') stringComplete = true; }}
2015 – Todos os direitos reservados – Página 26 de 27
Serial Link Comunicações & Serviços
Cod2ReceptorC.inoint enablePin = 3; // endereco do pino ENchar endereco = 'C'; // definir aqui o endereco do Arduino no BUS
String inputString = ""; // string q recebe os dadosboolean stringComplete = false; // terminou de receber string?
void setup(){ Serial.begin(9600); pinMode(enablePin, OUTPUT); delay(10); digitalWrite(enablePin, LOW); // para enviar //colocar esse pino em HIGH // para receber //colocar esse pino em LOW // Ativando as portas dos LEDs de verificacao // LEDs nas portas digitas 4, 5, 6, 7, 8 for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } }
void loop(){ if (stringComplete) { // verificando se comando eh pra mim if (inputString.charAt(0) == endereco) { for (int i = 1; i < 5; i++) { if (inputString.charAt(i) == '1') digitalWrite(3 + i, 1); else digitalWrite(3 + i, 0); } } // limpa string inputString = ""; stringComplete = false; }}
void serialEvent(){ while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') stringComplete = true; }}
2015 – Todos os direitos reservados – Página 27 de 27