Tutorial transmissor e receptor RF Link com Arduino

No mercado existe vários tipos e meios de comunicação para usar com Arduino. Neste tutorial usaremos os RF Link Receiver - 4800bps(315Mhz) e RF Link Transmitter - 315Mhz e testaremos a comunicção entre eles utilizando a biblioteca Virtual Wire e a documentação disponível aqui.

Neste tutorial vamos mostrar como mandar uma mensagem utilizando o RF Link Transmitter - 315Mhz com um Arduino e recebendo a mensagem utilizando o RF Link Receiver - 4800bps(315Mhz) com outro Arduino.

Antes de mais nada, baixe a biblioteca Virtual Wire e extraia para a pasta "libraries" localizada dentro da pasta da IDE do Arduino. Nesta biblioteca é bem fácil de usar, pois já existe um tratamento de erros para filtrar os erros que chegam no receptor.

Agora para montar o emissor RF Link Transmitter - 315Mhz com Arduino, faça a seguinte ligação:

Onde:

  • O Fio vermelho vai para o VCC ou 5V
  • O Fio preto vai para o GND
  • O FIo verde vai para o pino digital 12 do Arduino
  • Por opção, pode-se colocar uma antena para melhor captação de dados. O comprimento da antena é de cerca de 25cm 

Agora, abra a IDE do Arduino e vá em File/Examples/VirtualWire e selecione "transmitter",conecte o Arduino, selecione a versão do Arduino(UNO, Duemilanove,etc) e clique em UPLOAD. Abaixo mostra a programação:

// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
Serial.begin(9600);                                      // Debugging only
Serial.println("setup");

// Initialise the IO and ISR
vw_set_ptt_inverted(true);                          // Required for DR3100
vw_setup(2000);                                          // Bits per sec
}

void loop()
{
const char *msg = "hello";

digitalWrite(13, true);                                   // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));      //Send the message
vw_wait_tx();                                                // Wait until the whole message is gone
digitalWrite(13, false);
delay(200);
}

A programação "transmitter" é um exemplo básico onde manda a palavra "hello" para o receptor. 

Pronto, agora vamos montar o RF Link Receiver - 4800bps(315Mhz):

Onde:

  • O fio vermelho vai para o VCC ou 5V
  • O fio preto vai para GND
  • O fio verde vai para o pino digital 11 do Arduino
  • Por opção, pode-se colocar uma antena para melhor captação de dados. O comprimento da antena é de cerca de 25cm
Agora, com outro Arduino e com a IDE do Arduino aberto, vá em File/Examples/ e clique em "receiver" e faça o mesmo procedimento que o do emissor. Abaixo mostra a programação do "receiver":

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec

vw_rx_start(); // Start the receiver PLL running
}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;

digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}

Este exemplo mostra o receiver recebendo a informação do emissor, que nesse caso é o "hello". Ao abrir o Serial monitor do Arduino-1.0, você verá que os dados que chegam são números, estes números são números da tabela ASCII. Você pode ver que o número hexadecimal "68" equivale a letra "h".

E é isso!!! Esperamos que tenham gostado!!! Caso tenham dúvida sobre este tutorial, postem aqui mesmo neste blog. Vocês podem ver outros tutoriais, clicando aqui. Temos a seção de projetos também que vocês podem ver e postar seus projetos! Até a próxima!!

Referências:

http://www.labdegaragem.org/loja/index.php/38-comunicacao/rf-link-r...

http://www.labdegaragem.org/loja/index.php/38-comunicacao/rf-link-t...

http://arduino.cc/playground/Main/InterfacingWithHardware#Communica...

http://www.sparkfun.com/products/10533

http://www.open.com.au/mikem/arduino/VirtualWire.pdf

http://www.open.com.au/mikem/arduino/VirtualWire-1.9.zip

http://www.sparkfun.com/datasheets/RF/KLP_Walkthrough.pdf

http://winavr.scienceprog.com/example-avr-projects/running-tx433-an...

Exibições: 58104

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Rafael cleber da silva em 4 agosto 2013 às 19:38

Boa noite, Gostaria de saber como faço para que ao acionar o emissor ele mande um registro como um numero como um numero sem precisar uma um  micro controlador para isso, como exemplo um controle de portao

Comentário de Evandro Gomes da Silva em 17 junho 2013 às 23:11

socorro!!!!!

alguem sabe o porque quando eu vou compilar esse codigo dar um erro na parte "vw_set_ptt_inverted(true);                          // Required for DR3100" porque será? Sou novo nessa área e me interessei muito por esse artigo. Quem puder me ajudar agradeço bastante.

Comentário de Rodrigo Moraes Silveira em 19 abril 2013 às 23:11

Olá, fiz algumas modificações nos exemplos transmiter e receiver, usando os exemplos server e client da biblioteca VirtualWire. Porém com ambos equipamedos com um emissor e um redeptor de RF

Um arduino envia a mensagem "hello", o outro verifica o conteúdo da mensagem e responde com um ok. Meio tosco mas funcional, fontes no final da mensagem

A questão é: liguei a entrada RSSI do receptor no pino 3 do Arduino, e fiz uma leitura analógica

#define RSSI_PIN 3

...

Serial.println(getRSSI(RSSI_PIN));

...

int getRSSI(int pin)
{
    pinMode(pin, INPUT);
    return analogRead(pin);
}  // end getRSSI()

Estou recebendo valores entre 640 e 650, mas gostaria de modificá-los para RSSI mesmo (0 a 31) ou até mesmo em dBm. Alguém tem alguma idéia?

Abraço

Segue os fontes

ArduinoRF1(onde começa tudo)

/
#include <VirtualWire.h>
#define TX_PIN 12
#define RX_PIN 11
#define RSSI_PIN 3

void setup()
{
    Serial.begin(9600);      // Debugging only
    Serial.println("setup");
 
    // Initialise the IO and ISR
    vw_set_tx_pin(TX_PIN);
    vw_set_rx_pin(RX_PIN);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);     // Bits per sec

    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
    const char *msg = "hello";

    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    Serial.println(getRSSI(RSSI_PIN));
    
    
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    //Serial.print("Message sent\n");
    digitalWrite(13, false);
    delay(200);
    
    // Wait at most 200ms for a reply
    if (vw_wait_rx_max(800))
    {
      if (vw_get_message(buf, &buflen)) // Non-blocking
      {
        int i;
        digitalWrite(13, true); // Flash a light to show received good message
      // Message with a good checksum received, dump it.
      Serial.print("Got: ");
      String str = "";
      for (i = 0; i < buflen; i++)
      {
          Serial.print((char)buf[i]);//, HEX);
          Serial.print(" ");
              str += (char)buf[i];            
      } // end for
      Serial.println("");
        digitalWrite(13, false);  
      }  // end if
    }  // end if
    else
    Serial.println("Timout");
 
}  // end loop()

int getRSSI(int pin)
{
    pinMode(pin, INPUT);
    return analogRead(pin);
}  // end getRSSI()

ArduinoRF2 (o segundo arduino)

#include <VirtualWire.h>

#define TX_PIN 12
#define RX_PIN 11

void setup()
{
    Serial.begin(9600);    // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_tx_pin(TX_PIN);
    vw_set_rx_pin(RX_PIN);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);     // Bits per sec

    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
    const char *msg = "ok";
    
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    // Wait for a message
    vw_wait_rx();
    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
    int i;

       digitalWrite(13, true); // Flash a light to show received good message
    // Message with a good checksum received, dump it.
    Serial.print("Got: ");
    String str = "";
    for (i = 0; i < buflen; i++)
    {
        Serial.print((char)buf[i]);//, HEX);
        Serial.print(" ");
            str += (char)buf[i];            
    } // end for
    Serial.println("");
        if (str == "hello") {
          vw_send((uint8_t *)msg, strlen(msg));
          vw_wait_tx(); // Wait until the whole message is gone
          Serial.print("Response sent\n");
          delay(200);
        } // end if
        digitalWrite(13, false);
    }  // end if
} // end loop()

Comentário de Valdir Nunes Santos em 8 abril 2013 às 18:13

seria uma pequena distancia, aproximadamente 50,00 metros no máximo e a comunicação seria em um único sentido.

Comentário de Eduardo Nogueira em 8 abril 2013 às 15:59

Poder, pode... mas veja com quais distâncias irá trabalhar e se vai precisar que a comunicação seja "vai e volta"

Comentário de Valdir Nunes Santos em 8 abril 2013 às 15:44

preciso transmitir um sinal para um receptor que será instalado em um veículo usando arduino, será que posso usar o projeto acima como base.

Comentário de Fábio Pereira em 2 abril 2013 às 21:23

"Comentário de felipe araujo dos santos 4 horas atrás

Boa Tarde 

Estou precisando montar um projeto  para facul 

e nao sei como pode ser feito ....... um circuito para acender 3 lampadas via botao. e desligar cada lampada via controle rf 

alguem me ajuda ?

abracos"

Se tu usar um controle baseado no HT6P20 (esses de learn code), tem um script pra decriptar aqui no site. Estes controles geralmente possuem 3 botões. Resolvido o problema do controle.

Vai precisar de um Derivado do arduino (Garagino, UNO, NANO, duemilanove , ......) e um receptor rf de 433mhz.

Vai precisar de um shield de reles para acionamento das lampadas, se for mais prendado, ou estiver afim de por a mão na massa, tem vários esquemas de como fazer no google.

Um pouco de conhecimento em programação (hehehehhe), um pouco de google, cola e dois clipes de papel. É .... da pra fazer.

Comentário de Eduardo Nogueira em 2 abril 2013 às 19:43

Felipe, faz assim, monta seu projeto e posta as dúvidas específicas, assim dá pra ajudar... :)

Comentário de felipe araujo dos santos em 2 abril 2013 às 17:06

Boa Tarde 

Estou precisando montar um projeto  para facul 

e nao sei como pode ser feito ....... um circuito para acender 3 lampadas via botao. e desligar cada lampada via controle rf 

alguem me ajuda ?

abracos

Comentário de Rafael Spessotto em 22 janeiro 2013 às 19:07

Senhores, nao consegui fazer funcionar esse exemplo...pelo que to vendo a luzinha do transmissor so fica acessa...nao parece que ta enviando nada..alguem pode ajudar? pelo que vi fiz tudo certinho exatamente como nas figuras... :(

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço