Uma opção barata e eficiente para transmissão de dados entre placas Arduino, o módulo RF 433 MHz funciona muito bem em aplicações onde a velocidade de transmissão não é um ponto crítico.
Esses módulos são pequenos, baratos e relativamente fáceis de usar, e é isso que veremos neste artigo, enviando sinais de um Arduino para outro.
O módulo RF 433 MHz
O módulo transmissor funciona com alimentação entre 3,5 e 12V, o que influi na potência e alcance do sinal, que pode chegar à 200 metros quando utilizamos também antenas adequadas.
Para testar esses módulos RF com Arduino, vamos utilizar o seguinte material:
- 2 placas Arduino Uno
- 1 Módulo RF 433 MHz Transmissor
- 1 Módulo RF 433 MHz Receptor
- 1 Push button
- 1 Led
- 1 resistor de 220 ohms (resistor pull-up do push-button)
- 1 resistor de 470 ohms (para o led)
Vamos montar dois circuitos separados, um para o transmissor e outro para o receptor. Para pequenas distâncias, não é necessário o uso da antena.
Obs: Se deseja utilizar o módulo RF 433MHz com vários transmissores e um receptor, não deixe de conferir o post Sistema Chama Garçom com Arduino e módulo RF 433MHz, aqui mesmo no Arduino e Cia!
Circuito Arduino Uno – Transmissor
No circuito transmissor o pino DATA do módulo RF será conectado ao pino digital 4 do Arduino. O push-button vai no pino analógico A0, e a alimentação do circuito é de 5V:
Antes de carregar o programa, faça o download da biblioteca VirtualWire, neste link. Faça o download, descompacte o arquivo e coloque a pasta VirtualWire dentro da pasta LIBRARIES da IDE do Arduino.
Carregue o programa abaixo no Arduino que será o TRANSMISSOR. Em caso de problemas com a recepção, tente alterar a velocidade de comunicação alterando a linha vw_setup(5000) colocando um valor menor, lembrando que o valor deve ser o mesmo tanto programa do transmissor como do receptor.
O programa verifica se o botão foi pressionado, e nesse caso inverte o valor da variável estado (0 ou 1) para string, enviando esse valor para o módulo transmissor RF.
//Programa: Comunicacao com Modulo RF 433 - Emissor //Autor: Arduino e Cia #include <VirtualWire.h> //Define pinos Led e Botao const int ledPin = 13; const int pino_botao = A0; int valor_botao; char Valor_CharMsg[4]; //Armazena estado led = ligar/desligar int estado = 0; void setup() { Serial.begin(9600); pinMode(ledPin,OUTPUT); pinMode(pino_botao,INPUT); //Pino ligado ao pino DATA do transmissor RF vw_set_tx_pin(4); //Velocidade de comunicacao (bits por segundo) vw_setup(5000); Serial.println("Trasmissao modulo RF - Acione o botao..."); } void loop() { //Verifica o estado do push-button valor_botao = digitalRead(pino_botao); //itoa(valor_botao,Valor_CharMsg,10); //Caso o botao seja pressionado, envia dados if (valor_botao == 0) { //Altera o estado do led estado = !estado; //Converte valor para envio itoa(estado,Valor_CharMsg,10); //Liga o led da porta 13 para indicar envio dos dados digitalWrite(13, true); //Envio dos dados vw_send((uint8_t *)Valor_CharMsg, strlen(Valor_CharMsg)); //Aguarda envio dos dados vw_wait_tx(); //Desliga o led da porta 13 ao final da transmissao digitalWrite(13, false); Serial.print("Valor enviado: "); Serial.println(Valor_CharMsg); delay(500); } }
Verifique o funcionamento do circuito abrindo o serial monitor e checando se o estado do botão está sendo alterado:
Circuito Arduino Uno – Receptor
A alimentação do módulo receptor também é feita por meio do pino 5V do Arduino. O receptor possui 2 pinos de dados, e qualquer um deles pode ser utilizado para ligação ao Arduino, na porta 7. O led que vai acender ou apagar conforme os comandos enviados pelo Arduino Transmissor está ligado à porta 5:
O ideal é alimentar o Arduino com o módulo receptor utilizando uma bateria ou fonte externa, para testar o alcance do módulo.
O programa do receptor recebe do transmissor o valor 0 ou 1 em formato string, converte esse valor para int (inteiro) e aciona a porta 5, ligando ou desligando o led.
//Programa: Comunicacao com Modulo RF 433 - Receptor //Autor: Arduino e Cia #include <VirtualWire.h> //Define pino led int ledPin = 5; int valor_recebido_RF; char recebido_RF_char[4]; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); //Pino ligado ao pino DATA do receptor RF vw_set_rx_pin(7); //Velocidade de comunicacao (bits por segundo) vw_setup(5000); //Inicia a recepcao vw_rx_start(); Serial.println("Recepcao modulo RF - Aguardando..."); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int i; for (i = 0; i < buflen; i++) { //Armazena os caracteres recebidos recebido_RF_char[i] = char(buf[i]); } recebido_RF_char[buflen] = '\0'; //Converte o valor recebido para integer valor_recebido_RF = atoi(recebido_RF_char); //Mostra no serial monitor o valor recebido Serial.print("Recebido: "); Serial.print(valor_recebido_RF); //Altera o estado do led conforme o numero recebido if (valor_recebido_RF == 1) { digitalWrite(ledPin, HIGH); Serial.println(" - Led aceso !"); } if (valor_recebido_RF == 0) { digitalWrite(ledPin, LOW); Serial.println(" - Led apagado !"); } } }
Você também pode acompanhar o resultado da recepção desse circuito no serial monitor, que vai ter informações sobre o valor recebido e o estado do led:
Gostou do post módulo RF 433 MHz com Arduino? Confira aqui mesmo no Arduino e Cia outros posts sobre comunicação wireless.