sexta-feira, 17 de julho de 2015

Tutorial 3: Comunicação Wireless utilizando Arduino e os Módulos RF 433Mhz



Fala Makers nesse tutorial vamos fazer um controle a distância utilizando os módulos RF 433Mhz, vamos simplesmente controlar 4 LED's, que mais a frente podem ser substituídos por outros dispositivos mais interessantes. Porém o mais importante é entender como o mesmo funciona de forma prática e descomplicada.

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.

Montagem do transmissor RF

Mais simples que seu funcionamento com essa biblioteca é a sua montagem, você pode usar fios retirados de um cabo de rede Ethernet como jumpers e o melhor cortar do tamanho necessário ao seu projeto. Veja as figuras abaixo como foram feitas as montagens:


Figura 2- Montagem do transmissor RF



Montagem do receptor RF


Figura 3-Montagem do receptor RF

Sketch Módulo transmissor RF



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

char *dado ; //Cria a variável que ira armazenar a informação pré definida enviadas pelos botões

void setup()
{
  //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);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
}

void loop()
{
  if (digitalRead(4) == 0) // Verifica se D4 está pressionado
  {
    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);//Para garantir que os seus botões estão funcionando, você pode verificar no monitor serial
  }
  if (digitalRead(5) == 0) // se estiver pressionado
  {
    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);
  }
  if (digitalRead(6) == 0) // se estiver pressionado
  {
    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);
  }
  if (digitalRead(7) == 0) // se estiver pressionado
  {
    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);
  }
}


Sketch Módulo receptor RF


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

void setup()
{
  int i;
  //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);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
}


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
    {
      Serial.println(cod); //Para garantir que está recebendo dados, você pode verificar no monitor serial
      digitalWrite(4, !digitalRead(4)); // Inverte o estado da saída D4
    }
    if (cod == 'B')
    {
      Serial.println(cod);
      digitalWrite(5, !digitalRead(5));
    }
    if (cod == 'C')
    {
      Serial.println(cod);
      digitalWrite(6, !digitalRead(6));
    }
    if (cod == 'D')
    {
      Serial.println(cod);
      digitalWrite(7, !digitalRead(7));
    }
  }

}