Documente Academic
Documente Profesional
Documente Cultură
Manual Técnico
Sumário
Manual Técnico......................................................................................................................................................1
Introdução.........................................................................................................................................................3
Arduino Supervisório MODBUS...................................................................................................................3
Conversor RS485........................................................................................................................................3
Características..................................................................................................................................................4
Sobre o RS485 & MODBUS.............................................................................................................................5
Diagrama de Conexões Para Testes de Bancada............................................................................................6
Como Ligar FTDi Basic No Arduino Supervisório.............................................................................................8
Siga a orientação mostrada nas fotos abaixo para conectar seu Arduino FTDi Basic da Serial Link no
Arduino Supervisório MODBUS........................................................................................................................8
Veja também o manual do Arduino FTDi Basic no link abaixo:........................................................................8
http://www.seriallink.com.br/lab/Arduino/Datasheet_FTDiBasic_SerialLink.pdf...............................................8
Identificando Conectores & Jumpers................................................................................................................9
Detalhes Sobre o Arduino Supervisório..........................................................................................................16
Configurando Jumpers....................................................................................................................................18
Exemplo 1 – Teste de Bancada Comunicando 2 Arduinos.............................................................................21
Código do Exemplo 1.................................................................................................................................21
Exemplo 2 – Ligando 4 Arduinos em Rede....................................................................................................23
Código do Exemplo 2.................................................................................................................................24
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.
Conversor RS485
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.
Características
Conversor RS485
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!
O “Protocolo RS485”, como é conhecida essa norma de engenharia da comunicação, por suas
características, consegue lidar com distâncias de até 2Km!
MODBUS
O mais interessante da aplicação do Protocolo RS485 é a possibilidade de definir endereços para cada Nó da
Rede, 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.
Efetue as conexões fornecidas no diagrama abaixo para poder executar os exemplos desse manual.
Conversor RS485
N/A
TX
RX
5V
EN
GND
Arduino UNO
D1
(TX)
D3
D0
(RX)
B
A
A
B
+ -
Arduino
Supervisório
MODBUS
Conectar aqui o
ATMega328
Conectar aqui o
FTDI Basic para
carregar a
programação
Siga a orientação mostrada nas fotos abaixo para conectar seu Arduino FTDi Basic da Serial Link no 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 e
D1, que no Arduino Supervisório aparecem como RX e TX, respectivamente.
Portas digitais 0 a 9:
Portas Analógicas
Arduino Supervisório possui 6 portas analógicas, desde A0 até A5, conforme foto:
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)
+
-
Portas Auxiliares
Portas
Auxiliares
Conector RS485
Integrado ao Arduino Supervisório, temos os bornes do Conector RS485, onde devemos ligar os fios
trançados da Rede MODBUS.
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.
Veja abaixo na foto onde estão localizados os Jumpers e também a numeração deles que utilizaremos
adiante nesse manual.
1
2 6
3 5
4
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 RS485
7) Jumper de Pull-Down – Ligado no Resistor 470R que vai para o terra (GND)
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:
Conector
FTDi
O Arduino Supervisório é bem simples de ser utilizado, pois ele funciona como um Arduino UNO qualquer.
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!
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:
Dessa forma é possível integrar várias máquinas, reduzindo o custo, sem se preocupar com distâncias, pois o
RS485 é conhecido pela sua confiabilidade de conexão em cabos trançados de até 2Km!
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:
3
4
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).
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.
Para esse exemplo, vamos conectar os fios conforme mostrado mais acima neste manual, no diagrama de
teste de bancada.
É 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.ino
int 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);
}
}
Cod1Receptor.ino
int enablePin = 3; // endereco do pino EN
char endereco = 'A'; // definir aqui o endereco do Arduino no BUS
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
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;
}
}
Neste outro exemplo veremos como comunicar o Arduino Uno com 3 outros Arduinos Supervisórios, formando
uma 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!
Código do Exemplo 2
Cod2Transmissor.ino
int 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);
}
}
Cod2ReceptorA.ino
int enablePin = 3; // endereco do pino EN
char endereco = 'A'; // definir aqui o endereco do Arduino no BUS
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
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;
}
}
Cod2ReceptorB.ino
int enablePin = 3; // endereco do pino EN
char endereco = 'B'; // definir aqui o endereco do Arduino no BUS
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
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;
}
}
Cod2ReceptorC.ino
int enablePin = 3; // endereco do pino EN
char endereco = 'C'; // definir aqui o endereco do Arduino no BUS
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
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;
}
}