Olá Garagistas! Neste tutorial mostraremos como você pode controlar um Servomotor que está ligado ao Dispositivo A pelo potenciômetro que está ligado ao Dispositivo B, via rede RS-485.
Materiais Utilizados:
1. Rede RS-485
As redes RS-485, ou TIA/EIA-485, são redes de comunicação serial de simples implantação e confiáveis para comunicação através de protocolos com equipamentos. Podem atingir até 1200m, possibilitando que plantas fabris possam ser instaladas com poucas redes de comunicação. Outras vantagens de redes RS-485:
Tanto a velocidade de comunicação quanto ao número de equipamentos devem ser especificados conforme ao comprimento da rede e ao formato da mesma.
Redes RS-485 geralmente são implementadas sob formato Daisy Chain pois esta otimiza a distância e diminui as perdas de comunicação. Em redes menores é possível o uso de barramentos com derivação.
2. Conversor USB/RS485 e Shield RS485
Imagem 1 - Shield e Conversor RS485
O conversor USB/RS485 usa o chip FT232RL para criar um dispositivo serial em qualquer microcomputador (porta COM) que pode ser acessada pelo usuário através de um terminal. O chip transceiver RS485 converte os dados TTL (dados da Serial) em RS485 e vice-versa.
O Shield RS485 contém o chip transceiver RS485 que converte dados TTL (dados da Serial) em RS485 e vice-versa. Possui jumpers para escolher entre a Hardware Serial (HS - pinos 0 e 1) e ou Software Serial (SS - pinos 2 e 3). O pino digital 6 é usado para controle dos modos de transmissão e recepção do transceiver do Shield.
Ambos possuem LEDs de indicação para tráfego de rede e Jumpers para selecionar uso de resistores de terminação e vias da rede.
3. Funcionamento da Demonstração
Na demonstração foi montada uma rede RS-485, onde estão conectados 3 dispositivos:
Shield RS485 - A: O Dispositivo A irá receber um valor de 000 a 179 que será enviado pelo dispositivo B e fará o movimento do Servomotor.
Shield RS485 - B: Quando o dispositivo B receber o caractere 'B' ou 'b', ele irá começar a transmissão do valor lido pelo pino A0 (Potenciômetro) convertido em uma escala de 0 a 179. Quando receber 'P' ou 'p', ele irá parar a transmissão.
Conversor USB/RS485 - C: Na demonstração ele irá servir para visualizar qual valor está sendo enviado do dispositivo B para o dispositivo A e também para iniciar ou parar a transmissão.
4. Montagem do Circuito da Demonstração
Figura 1 - Shield e Conversor RS485
5. Sketchs
//------------------------------------------------------------------------------------------------------------------------------------
//Dispositivo A
#include <SoftwareSerial.h> //Inclui a biblioteca SoftwareSerial.h
#include <Servo.h> //Inclui a biblioteca Servo.h
SoftwareSerial A_Serial(2, 3); //Instância a Software Serial
Servo servo; //Instância a Servo.h
int i=0; //Variável para contagem
int pos_servo=0; //Variável para armazenar o valor da posição do servo
char bus_485; //Variável para armazenar os caracteres que são recebidos pela serial
void setup()
{
A_Serial.begin(1200); //Inicia a comunicação Serial via Software com um Baud Rate de 1200
pinMode(6, OUTPUT); //Define o pino 6 (Enable) como saída
digitalWrite(6, LOW); //Coloca ele em nível lógico baixo
servo.attach(11); //Configura o pino 11 para ser utilizado pelo servomotor
}
void loop()
{
if(A_Serial.available() > 0) //Se algo for recebido na Serial
{
bus_485 = A_Serial.read(); //Armazena o que foi lido na variável bus_485
if(bus_485 >= '0' && bus_485 <= '9' && i<3) //Se o caractere que foi recebido está entre 0 e 9 e i for menor que 3
{
if(i==0) pos_servo = pos_servo + ((bus_485-48)*100); //Se for o primeiro caractere (i=0),
//transforma em valor inteiro, multiplica por 100 e
//soma a variável pos_servo
else if(i==1) pos_servo = pos_servo + ((bus_485-48)*10); //Senão, se for o segundo caractere (i=1),
//transforma em valor inteiro, multiplica por 10 e
//soma a variável por_servo
else if(i==2) //Senão, se for o terceiro caractere (i=2),
{
pos_servo = pos_servo + bus_485-48; //Transforma em valor inteirro, multiplica por 100 e soma a variável por servo
servo.write(pos_servo); //Posiciona o servo para o valor que for enviado pelo dispositivo B
pos_servo=0; //Zera variável por_servo;
}
i++; //Incrementa a variável i para terminar a contagem e receber os próximo caracteres
}
else //Senão
{
bus_485 = ' '; //Limpa a variável bus_485
i=0; //Zera a variável de contagem i
}
}
}
//------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------
//Dispositivo B
#include <SoftwareSerial.h> //Inclui a biblioteca SoftwareSerial.h
SoftwareSerial B_Serial(2, 3); //Instância a biblioteca SoftwareSerial
int i=0; //Variável para contagem
int pot_map=0; //Variável para armazenar potenciometro
char bus_485; //Variável para armazenar o caractere que foi recebido pela Serial
void setup()
{
B_Serial.begin(1200); //Iniciar a serial com um baud rate de 1200
pinMode(6, OUTPUT); //Configura o pino 6(Enable) como saída
digitalWrite(6, LOW); //Coloca o nível 6 em nível lógico baixo
}
void loop()
{
//Se algo for recebido pela Serial, armazena na variável bus_485
if(B_Serial.available() > 0) bus_485 = B_Serial.read();
//Se o que for recebido for igual a I ou i e diferente de P ou p,
//Executa a função para enviar o valor do potenciômetro
if((bus_485 == 'I' || bus_485 == 'i') &&( bus_485 != 'P' || bus_485 != 'p')) envia_potenciometro();
//Senão se o que for recebido pela Serial for igual a P ou p e diferente de I ou i
//Para o envio do valor do potenciômetro
else if((bus_485 == 'P' || bus_485 == 'p') && (bus_485 != 'I' || bus_485 != 'i')){}
delay(25); //Aguarda 25 milissegundos
}
void envia_potenciometro()
{
pot_map = map(analogRead(A0), 0, 1023, 0, 179); //Converte a leitura analógica do potenciômetro
//de 0 a 1023 para 0 a 179
digitalWrite(6, HIGH); //Habilida a transmissão de dados
if(pot_map < 10) B_Serial.print("00"); //Se o valor lido pelo potenciômetro for menor que 10
//Envia "00" antes do valor do potenciometro
else if(pot_map < 100) B_Serial.print('0'); //Senão se o valor for menor que 100
//Envia '0' antes do valor do potenciometro
B_Serial.println(pot_map); //Envia o valor do potenciômetro
digitalWrite(6, LOW); //Desabilita a transmissão
}
//------------------------------------------------------------------------------------------------------------------------------------
Então é isso Garagistas! Esperamos que tenham gostado deste tutorial! Até o Próximo!
Referências:
Comentar
Boa noite.
Estou tentando reproduzir o esquema acima porém estou tendo alguns problemas:
- Hora a porta COM aparece como "Busy";
- Hora o monitor serial abre porém sem resposta;
Minha configuração:
- Estou utilizando o conversor USB/RS485 deste Kit;
- No lugar do Shield estou utilizando o CI MAX485;
- Dois Arduinos Nano;
Tenho dúvidas quanto:
- A ligação dos Jumpers do Conversor USB/RS485;
- Os resistores que devo usar entre os terminais A e B dos MAX485;
Desde já agradeço a ajuda.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)