Módulo RF 433Mhz – Comunicação entre duas placas Arduino
Na maioria das vezes em que falamos sobre comunicação sem fio, pensamos imediatamente no acesso à internet através de computadores ou celulares por meio de algum modem ou roteador que esteja disponibilizando o sinal para tal propósito, no entanto, existem muitos outros métodos de comunicação sem fio. Neste tutorial, demonstraremos como é possível estabelecer uma comunicação sem fio entre duas placas Arduino via radiofrequência, utilizando os módulos Receptor e Transmissor RF 433Mhz (Módulo RF 433Mhz).
[toc]
O que é radiofrequência?
Quando pesquisamos sobre o que vem a ser o conceito de radiofrequência, nos deparamos com várias definições, no entanto, a mais adequada é que afirma que a radiofrequência consiste em uma faixa de frequências que engloba valores de aproximadamente 3KHz (algumas referências trazem valores de 9KHz, 10KHz) até 300GHz, os quais, correspondem ao intervalo de frequências utilizadas por ondas de rádio.
O uso da radiofrequência permite o controle dos mais diversos dispositivos sem que seja necessária a utilização de qualquer tipo de fio. Podemos facilmente encontrar aplicações que utilizam a radiofrequência para atender os seus propósitos, como por exemplo, os portões eletrônicos de residências, os quais, através de um controle remoto operando dentro de uma determinada faixa de frequência, pode-se acionar o motor do portão a uma grande distância.
Os módulos Receptor e Transmissor RF433Mhz
Para realizar o projeto vamos utilizar dois módulos (apresentados na figura abaixo) para que possamos estabelecer uma comunicação sem fio entre duas placas Arduino e assim, comandar uma delas através da outra.
Estes módulos trabalham à uma frequência de 433MHz e tem um alcance de até 90 metros em espaços abertos. Através da utilização destes, é possível realizar transferência de dados em uma velocidade que pode variar até 9200 bits por segundo, de modo que, quanto maior for a distância entre o elemento transmissor e o elemento receptor, menor deve ser a velocidade na transmissão dos dados para diminuir a probabilidade de erros.
Na figura acima, o módulo apresentado do lado direito, é o módulo transmissor. Este contem três pinos: Um para alimentação, outro para o terra e o último para dados. Por outro lado, o módulo presente do lado esquerdo, é o módulo receptor e apesar de este conter 4 pinos, utilizamos apenas 3 deles (assim como o módulo transmissor, utilizamos um pino para alimentação, um para o terra e outro para dados.
Mãos à obra – Comunicando duas placas Arduino via radiofrequência
Nesta seção iremos demonstrar todos os passos que você deve seguir para aprender fazer com que duas placas Arduino se comuniquem via radiofrequência.
Componentes necessários
Montando o projeto
Neste tutorial temos dois hardwares que serão utilizados. O primeiro deles irá conter um Arduino Micro, que por sua vez, irá atuar em conjunto com um módulo Transmissor RF 433Mhz.
O segundo hardware irá conter um Arduino UNO, o qual, irá atuar em conjunto com um módulo Receptor RF 433Mhz.
Programando
Conforme apresentado no tópico anterior, o projeto a ser desenvolvido neste tutorial utiliza duas placas Arduino, portanto, teremos a presença de dois códigos para serem gravados em ambas as placas. Primeiramente, apresentamos o código a ser gravado no Arduino Micro, que por sua vez, estará atuando no envio das informações.
#include <VirtualWire.h> bool estado_led; char data[2]; void setup() { vw_set_tx_pin(5); vw_setup(2000); } void loop() { estado_led = !estado_led; itoa(estado_led, data, 2); vw_send((uint8_t *)data, strlen(data)); vw_wait_tx(); delay(2000); }
Em seguida, apresentamos o código a ser gravado no Arduino UNO, que em nosso projeto, deverá receber as informações obtidas pelo Receptor RF433 Mhz.
#include <VirtualWire.h> byte message[VW_MAX_MESSAGE_LEN]; // Armazena as mensagens recebidas byte msgLength = VW_MAX_MESSAGE_LEN; // Armazena o tamanho das mensagens void setup() { vw_set_rx_pin(5); // Define o pino 5 do Arduino como entrada //de dados do receptor vw_setup(2000); // Bits por segundo pinMode(13,OUTPUT); vw_rx_start(); // Inicializa o receptor } void loop() { if (vw_get_message(message, &msgLength)) // Non-blocking { Serial.print("Recebido: "); Serial.write(message[0]); if(message[0] == '0'){ digitalWrite(13, LOW); } else if(message[0] == '1'){ digitalWrite(13,HIGH); } } }
Entendendo a fundo
Software – Arduino Micro / Transmissor RF 433Mhz
– Incluindo a biblioteca que será utilizadas
Primeiramente, para desenvolvermos uma aplicação como esta, devemos incluir a biblioteca que será utilizada no código, para que assim, o mesmo possa funcionar de maneira adequada. A biblioteca VirtualWire.h é responsável pela comunicação que será estabelecida entre o Arduino UNO e o Arduino Micro através do par Transmissor/Receptor RF 433Mhz.
#include <VirtualWire.h>
-Declarando as variáveis do projeto
Posteriormente, temos um bloco onde ocorre a declaração das variáveis que serão utilizadas no decorrer do programa. A variável estado_led (do tipo booleana) é responsável por armazenar o valor referente ao estado desejado do led (que será acionado na placa Arduino receptora) e a variável data, que por sua vez, é um vetor de caracteres, terá a função de armazenar o dado que será enviado (posteriormente explicaremos o motivo desta variável ter duas posições).
bool estado_led; char data[2];
– Estabelecendo as configurações iniciais
Na função setup(), utilizamos duas funções de configuração do módulo transmissor. A primeira delas é a função vw_set_tx_pin(), que por sua vez, é responsável por determinar qual pino do Arduino Micro será utilizado para enviar os dados da placa para o módulo Transmissor RF 433Mhz.
A outra função existente neste bloco é a função vw_setup(), a qual, serve para inicializar a comunicação entre o Arduino Micro e o módulo Transmissor RF 433Mhz, de modo que, ao utilizarmos a mesma, devemos passar como parâmetro a velocidade de transmissão em bits por segundo.
void setup() { vw_set_tx_pin(5); vw_setup(2000); }
– Enviando dados através do transmissor RF 433Mhz
Dentro da função loop() vamos estabelecer toda parte referente ao envio dos dados propriamente dito. O primeiro passo a ser realizado é a inversão do conteúdo armazenado na variável estado_led, de modo que, como esta variável é do tipo booleana, os valores irão sendo alternados entre 0 e 1 a cada passagem pelo ciclo da função loop().
estado_led = !estado_led;
Em seguida, utilizamos a função itoa() para transformar o valor contido na variável estado_led em uma string e armazenar este valor, já transformado, na variável data (como dissemos anteriormente, esta variável possui duas posições, pois, após o processo de conversão de um determinado número em string, além do mesmo, surge também como resultado, o caractere terminador de strings “\0”) .
A função itoa() possui 3 parâmetros, dos quais, o primeiro refere-se à variável cujo valor queremos transformar em string. O segundo, é a variável na qual queremos guardar o resultado gerado e a terceira é o tipo de dado que estamos convertendo, logo, como estamos convertendo um valor binário, utilizamos o número 2 nesta posição.
itoa(estado_led, data, 2);
Posteriormente, utilizamos a função vw_send() para enviar os dados para o Transmissor RF433Mhz transmiti-los (note que esta função possui 2 parâmetros, de modo que, o primeiro deles refere-se à variável que queremos enviar e o seguindo diz respeito ao tamanho da mesma. Sugerimos que utilize esta função neste formato, trocando apenas o nome da variável que você irá utilizar).
vw_send((uint8_t *)data, strlen(data));
Por fim, utilizamos a função vw_wait_tx() para que o programa aguarde a transferência total da mensagem e a função delay() para estipular o tempo que o led levará para trocar de estado.
vw_wait_tx(); delay(2000);
Veja como ficou nossa função loop()
void loop() { estado_led = !estado_led; itoa(estado_led, data, 2); vw_send((uint8_t *)data, strlen(data)); vw_wait_tx(); delay(2000); }
Software – Arduino UNO / Receptor RF 433Mhz
– Incluindo a biblioteca que será utilizadas
Assim como no programa desenvolvido para o Arduino Micro, devemos incluir a biblioteca que será utilizada neste código, para que assim, o mesmo possa funcionar de maneira adequada. A biblioteca VirtualWire.h é responsável pela comunicação que será estabelecida entre o Arduino UNO e o Arduino Micro através do par Transmissor/Receptor RF 433Mhz.
#include <VirtualWire.h>
-Declarando as variáveis do projeto
Posteriormente, temos um bloco onde ocorre a declaração das variáveis que serão utilizadas no decorrer do programa. As variáveis tamanho_msg e msg, ambas do tipo byte, são responsáveis por armazenar informações referentes às mensagens que serão recebidas, para que, utilizando as mesmas, seja possível interpretá-las e tomar as ações necessárias com base no conteúdo recebido.
Apenas a título de curiosidade, o elemento VW_MAX_MESSAGE_LEN é próprio da biblioteca utilizada e armazena o valor referente ao tamanho da mensagem.
byte tamanho_msg = VW_MAX_MESSAGE_LEN; byte message[VW_MAX_MESSAGE_LEN];
– Estabelecendo as configurações iniciais
Na função setup(), utilizamos três funções para a configuração do módulo receptor. A primeira delas é a função vw_set_rx_pin(), que por sua vez, é responsável por determinar qual pino do Arduino UNO será utilizado para receber os dados enviados do módulo Receptor RF 433Mhz para a placa Arduino utilizada.
A segunda função existente neste bloco é a função vw_setup(), a qual, serve para inicializar a comunicação entre o Arduino UNO e o módulo Receptor RF 433Mhz, de modo que, ao utilizarmos a mesma, devemos passar como parâmetro a velocidade de transmissão em bits por segundo (note que esta informação deve ser igual à estabelecida no módulo Transmissor RF 433Mhz). Por fim, através da função vw_rx_start() inicializamos a função de recebimento de dados do Receptor RF 433Mhz. Além disso, definimos o modo de operação do pino 13 através da função pinMode().
void setup() { vw_set_rx_pin(5); // Define o pino 5 do Arduino como entrada vw_setup(2000); //Serial.begin(9600); //while(!Serial){} //de dados do receptor vw_setup(2000); // Bits por segundo pinMode(13,OUTPUT); vw_rx_start(); // Inicializa o receptor }
– Recebendo dados através do Receptor RF 433Mhz
Basicamente, o que fazemos na função loop() é conferir se houve o recebimento de algum dado através da função vw_get_message() e caso tenha, verificamos se este valor, em string, corresponde ao caractere 0, o qual, será responsável por fazer com que o led seja apagado. Em contrapartida, caso, o valor encontrado seja o caractere 1, o led deverá ser acionado.
void loop() { uint8_t message[VW_MAX_MESSAGE_LEN]; uint8_t msgLength = VW_MAX_MESSAGE_LEN; //display.setCursor(0, 0); //Seta a posição do cursor if (vw_get_message(message, &msgLength)) // Non-blocking { Serial.print("Recebido: "); Serial.write(message[0]); if(message[0] == '0'){ digitalWrite(13, LOW); } else{ digitalWrite(13,HIGH); } Serial.println(); }
Considerações finais
Neste tutorial, demonstramos como você pode utilizar o conceito de radiofrequência para fazer com que duas placas Arduino troquem informações entre si. Este foi apenas um conteúdo para que você tenha uma noção de como das os primeiros passos com esta tecnologia, portanto, esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Minha ideia seria através de teclas com resistores na A0 enviar um comando para outro Arduíno e esse arduino enviar um comando de controle IR para um radio, seria possível?
Olá Daniel,
Inicialmente, parabéns pelo teu trabalho.
É possível identificar a distância entre o transmissor e o receptor? E qual seria a precisão desta medição de distância?
Boa tarde,
Seria possível acionar uma porta para por exemplo acender um led de acordo com a intensidade do sinal dos módulos rf?
Muito bom
Parabéns Daniel, eu acabei tirando minha duvida com esse tutoria. Agradeço de coração!
Olá Daniel! Excelente tutorial, parabéns!
Você sabe me informar se é possível substituir o Arduino UNO, no qual o receptor RF está conectado, por um ESP8266?
Minha ideia é usar o transmissor RF conectado ao arduino para ler um sensor e fazer a transmissao da leitura para o receptor RF conectado ao esp, para em seguida, enviar essa informação via wifi para um smartphone usando algum aplicativo.
Para que serve o Serial.write?
Se caso eu não fosse enviar só valores binarios, como seria essa comunicação? No caso enviaria 1, 2, 3…
Oi Daniel, vi que você utilizou o fritzing fazer o desenho e gostaria de saber como você faz para achar os modulos RF pq eu já procurei e não achei, pode me ajudar?
Amigo, é só procurar no google que você acha! Conseguiu já?
Boa tarde,
Estou tentando passar os dados lidos de um potenciometro de um arduino ao outro, porem nao estou conseguindo, nao tenho mais nenhuma ideia do que pode ser… gostaria de uma ajuda.
O que você já tentou fazer para resolver o problema? Assim podemos ter um ponto de partida!