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