quarta-feira, 17 de março de 2021

Controlando Servo Motor a distância usando Joystick via RF 433 Mhz via arduino (sem fio)

Fala makers, primeiro de tudo gostaria de pedir pra vocês se escreverem la no canal do Youtube e fortalecer o trabalho, estarei postando agora com muito mais frequência.  Clique aqui pra se escrever no canal e já deixe sua solicitação de tutoriais. 



Chegou o tão esperado tutorial, nesse tutorial iremos controlar um servo motor a distância utilizando o módulo RF 433 Mhz. Já temos um tutorial de com utilizar esse módulo, você pode acessar clicando aqui, você também pode acessar o vídeo tutorial clicando aqui.

Há algum tempo atrás era muito complicado controlar um servo motor utilizando as biblioteca VirtualWire.h junto com o a biblioteca Servo.h, Ambas as bibliotecas utilizam o Timer1, por conta desse problema foi criada a biblioteca ServoTimer2.h. Agora chega de enrolação, vamos a introdução.

Vamos entender como como funciona os módulos RF 433 Mhz

Figura 1- Módulos RF 433Mhz


No circuito os dois módulos foram usados antenas, para grandes distâncias (até 200 metros em local aberto), a instalação da antena é essencial. Outro detalhe é que o módulo transmissor aceita tensões na faixa de 3,5 a 12v, o que também faz uma grande diferença no alcance da transmissão. São componentes básicos para comunicação via rádio frequência, presente em sistemas de alarmes, controle remoto, aquisição de dados e robótica em geral. Seu funcionamento é bem simples o transmissor envia uma série de dados para o receptor fazendo um método de transmissão simplex. Porém é necessário que você utilize um encoder (codificador) e um decoder (decodificador) para facilitar o processo de transmissão entre seus módulos, Nesse caso vamos utilizar 2 arduinos para essa comunicação.


Biblioteca VirtualWire.h

Nessa tutorial estamos utilizando a biblioteca VirtualWire.h, ela facilita a aplicação desses módulos, sendo uma biblioteca bastante útil e simples. Com as bibliotecas do arduino fica muito fácil você construir seu próprio dispositivos, pois não necessita de especialização ou conhecimento prévio. Você pode baixar essa biblioteca clicando aqui.


Servo Motor

O servo motor é um atuador rotativo ou linear que permita o controle de posição angular ou linear, velocidade e aceleração. Consiste em um motor adequado acoplado a um sensor de realimentação. Eles são usados em aplicações com robótica, máquinas, CNC ou manufatura automatizada. Basicamente você consegue controla a posição com precisão controlando o ângulo. Nesse projeto iremos de forma aleatória definir posições passando o conhecimento necessário para que vocês possam utilizar em seus projetos e modificar. 


   Biblioteca ServoTimer2.h

Amabas as bibliotecas Servo.h e a VirtualWire.h  utilizam o mesmo Timer, ou seja, você não pode utilizar as duas no mesmo projeto. Para contorna essa situação foi desenvolvida a ServoTimer2.h, tendo duas diferenças, primeiro ela utiliza o Timer2, segundo é a forma com que a posição é controlada, enquanto que na biblioteca Servo.h a posição é controlado pela posição em graus a ServoTimer2.h é controlada por pulso. O Pulso máximo é 2250 que é para 180 graus e 750 que é 0 grau, você pode baixar clicando aqui.


 Joystick

O Joystick é similar a dois potenciômetros conectados, um para o controle vertical(eixo Y) e outro para o controle horizontal(eixo X). Os potenciômetros variam a resistência, agindo como sensor, portanto variando a a tensão de acordo com a rotação.

creat.arduino
Funcionamento interno do joystick


 Montagem do Transmissor

A montagem do transmissor é simples, estamos utilizando o módulo Joystick Ky-023, e o transmissor RF 433 Mhz, estamos utilizando 2 portas analógicas e duas portas digitais.




Montagem do Receptor

Na montagem do receptor fique atento a pinagem do seu servo motor, colocamos um led para testar a comunicação, referente ao receptor a montagem é simples. Estamos utilizando 3 portas digitais.



Sketch Transmissor

/* MSmaker RF Example
  developed by MSmaker
  date: March 17, 2021
  universomakers@gmail.com
*/
#include <VirtualWire.h> //Inclui a biblioteca VirtualWire.h


int eixo_X = A0; //Define o pino analógico A0 como eixo_X
int eixo_Y = A1; //Define o pino analógico A1 como eixo_X
int botao = 2; //Define o pino digital 2 como botão, botão do Joystick
char *dado ; //Cria a variável que ira armazenar a informação pré definida enviadas pelos botões

void setup()
{

  pinMode (botao, INPUT_PULLUP); //Define o botao como entrada digital e ativa o PULLUP ( resistor interno)

  //Configura o Arduino para trabalhar como transmissor
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_tx_pin(3);//Configura o pino 3 como tx
  //===================================================
  Serial.begin(9600);
  //Configura o estado das portas digitais
  pinMode(3, OUTPUT);//Configura pino 3 como saída
  pinMode(4, INPUT);//Configura o pino 4 como entrada
}

void loop() {

  if ((analogRead(eixo_X)) == 0) { //Verifica se o valor é 0
    Serial.println("PARA BAIXO"); //Imprime no monitor serial apenas para verificação
    dado = "A"; //Armazena o dado pré determinado
    vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável "dado"
    vw_wait_tx(); //Aguarda o fim de transmissão
    delay(100); //Aguarda um tempo para a próxima leitura
    Serial.println(dado);//Imprime no monitor serial verificação
  } else {
    if ((analogRead(eixo_X)) == 1023) { //Verifica se o valor é 1023
      Serial.println("PARA CIMA"); //Imprime no monitor serial serial verificação
      dado = "B"; //Armazena o dado pré determinado
      vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável "dado"
      vw_wait_tx(); //Aguarda o fim de transmissão
      delay(100); //Aguarda um tempo para a próxima leitura
      Serial.println(dado);//Imprime no monitor serial verificação
    } else {
      if ((analogRead(eixo_Y)) == 0) { //Verifica se o valor é 0
        Serial.println("ESQUERDA"); //Imprime no monitor serial verificação
        dado = "C"; //Armazena o dado pré determinado
        vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável "dado"
        vw_wait_tx(); //Aguarda o fim de transmissão
        delay(100); //Aguarda um tempo para a próxima leitura
        Serial.println(dado);//Imprime no monitor serial verificação
      } else {
        if ((analogRead(eixo_Y)) == 1023) { //Verifica se o valor é 1023
          Serial.println("DIREITA"); //Imprime no monitor serial verificação
          dado = "D"; //Armazena o dado pré determinado
          vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável "dado"
          vw_wait_tx(); //Aguarda o fim de transmissão
          delay(100); //Aguarda um tempo para a próxima leitura
          Serial.println(dado);//Imprime no monitor serial verificação
        } else {
          if (digitalRead(botao) == LOW) { //Verifica se o botão esta pressionado
            Serial.println("BOTAO PRESSIONADO"); //Imprime no monitor serial
            dado = "E"; //Armazena o dado pré determinado
            vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável "dado"
            vw_wait_tx(); //Aguarda o fim de transmissão
            delay(100); //Aguarda um tempo para a próxima leitura
            Serial.println(dado);//Imprime no monitor serial verificação
          }
        }
      }
    }
  }
  delay(500); //Intervalo de 500 milissegundos
}

Sketch Receptor

/* MSmaker RF Example
  developed by MSmaker
  date: March 17, 2021
  universomakers@gmail.com
*/
#include <VirtualWire.h> //Inclui a biblioteca VirtualWire.h
#include"ServoTimer2.h"// Inclui a biblioteca ServoTimer2.h
ServoTimer2 servo1;//Configura um servo motor

void setup()
{
  servo1.attach(6);
  //Configura o Arduino para trabalhar como receptor
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_rx_pin(3);//Configura o pino 3 como RX
  vw_rx_start();
  //=================================================

  pinMode(3, INPUT);//Configura o pino 3 RX como entrada
  pinMode(4, OUTPUT);//configura o pino 4 como saída, nesse caso vamos colocar um led pra teste
  Serial.begin(9600);//Configura a velocidade da porta serial
}


void loop()
{
  char cod;//Cria uma variavel para armazenar o dado recebido.
  uint8_t buf[VW_MAX_MESSAGE_LEN]; //Recebe os dados e armazena na variável buf
  uint8_t buflen = VW_MAX_MESSAGE_LEN; //Armazena na variável buflen o tamanho do dado recebido

  if (vw_get_message(buf, &buflen)) //Pega a mensagem que foi recebida
  {

    cod = buf[0]; //Converte a variável em Char
    Serial.println(cod); //Para verificar valores recebidos e corrigir possiveis erros
    if (cod == 'A') // Compara a informação recebida e se for a correspondente aciona o servo motor
    {
      Serial.println(cod); //Imprime o dado de entrada para verificação apenas
      servo1.write(750);  //Pulso minimo 0 graus
    }
    if (cod == 'B')//Compara a informação recebida e se for a correspondente aciona o servo motor
    {
      Serial.println(cod);//Imprime o dado de entrada para verificação apenas
      servo1.write(1500);  //Pulso para 90 graus
    }
    if (cod == 'C')//Compara a informação recebida e se for a correspondente aciona o servo motor
    {
      Serial.println(cod);//Imprime o dado de entrada para verificação apenas
      servo1.write(1950);  //Pulso para 120 graus
    }
    if (cod == 'D')//Compara a informação recebida e se for a correspondente aciona o servo motor
    {
      Serial.println(cod);//Imprime o dado de entrada para verificação apenas
      servo1.write(2250);  //Pulso maximo para 180 graus
    }
    if (cod == 'E')//Compara a informação recebida e se for a correspondente aciona o LED
    {
      Serial.println(cod); //Imprime o dado de entrada para verificação apenas
      digitalWrite(4, !digitalRead(4)); // Inverte o estado da saída D4
    }
  }

}

Nenhum comentário:

Postar um comentário