Tutorial: Controlando servomotor pelo potenciômetro via Rede RS-485

 

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:

1x Arduino Uno

2x Shield RS485

1x Conversor USB/RS485

1x Potenciômetro 10K

1x Servomotor Pequeno

1x Protoboard

Alguns Jumpers

 

 

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:

  1. Comunicação em até 10Mbps para redes de curta distância;
  2. Número máximo de dispositivos entre 32 e 256 na rede (conforme resistência unitária de cada equipamento e distância da rede);
  3. Baixo custo de implantação;
  4. Tolerância a interferência eletromagnética, principalmente se sua instalação possuir blindagem;
  5. Comunicação diferencial (não requer terra comum).

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:

http://www.scadabr.com.br/?q=rs485

Exibições: 4254

Comentar

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)

Comentário de David Luna Santos em 30 janeiro 2016 às 22:31

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.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço