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.
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
}
}
}