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: 58108

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 Leonilde Diogenes Gurgel Neto em 6 dezembro 2012 às 0:03

Fábio,

Pode utilizar os controles já prontos... mas eles vem com uma codificação e vc precisa testar isso com mais calma.

O "ajuste" é para sintonizar somente.

Comentário de Fábio Pereira em 5 dezembro 2012 às 23:10

existe a possibilidade de usar como transmissor um controle de portão que opere em 315 mhz? A idéia é acionar uma porta digital com o controle, e acredito que adaptar o módulo de transmissão é muito mais trabalhoso que utilizar um controle comum de mercado. Aquele ajuste que aparece na lateral do receptor é para ajustar a frequencia e diminuir o ruído?

Comentário de Leonilde Diogenes Gurgel Neto em 29 outubro 2012 às 14:30

Pow véi... eu que agradeço a você Eduardo ;D

[]´s e fica com DEUS!

Comentário de Eduardo Nogueira em 28 outubro 2012 às 23:08

Leonilde, funcionou... eu tava usando esse método mesmo sem ter visto seu post.... acho que era isso mesmo!!! Veja como ficou:


void enviaMSG(String strMsg){
strMsg = strMsg + ";";
Serial.print(strMsg);
int letras = strMsg.length();
char msg[letras] ;
strMsg.toCharArray(msg,strMsg.length());
/*
Serial.print("msg=[");
for (int i = 0; i < letras; i++)
{
Serial.print(msg[i]);
//Serial.print(",");
}
Serial.print("], lenght=");
Serial.println(letras);
*/

  digitalWrite(13, HIGH);
  delay(15);
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();
  delay(15);
  digitalWrite(13, LOW);
}

 

Agora ta indo bem.... dá pra construir o comando e passar os parametros pro outo arduino...

Obrigado pela ajuda!!! Abs

Comentário de Leonilde Diogenes Gurgel Neto em 27 outubro 2012 às 19:53

Eduardo,

Tenta isso http://arduino.cc/en/Reference/StringToCharArray

Nunca tentei isso e pesquisando rapidamente achei o link acima e qualquer coisa me avisa q tento aqui e te aviso.

[]´s

Comentário de Eduardo Nogueira em 27 outubro 2012 às 17:51

Leonilde o problema é que a função 

vw_send((uint8_t *)msg, strlen(msg));//Send the message

faz parta do VirtualWire e ela envia os dados via RF... a enviaMSG é ,minha posso mudar sem problemas, mas como transformar uma String em cons char *msg ?????

Comentário de Leonilde Diogenes Gurgel Neto em 27 outubro 2012 às 5:54

Bom dia Eduardo Nogueira,

Veja o lance é q concatenar pelo que sei é com o String() e na minha cabeça... como o C do Arduino não é C... veja é algo parecido então vc vai esbarrar com detalhes e etc.

Facilita sua vida e modifica a assinatura do método... algo do tipo mais parâmetros e etc

Ex: enviaMSG(const char *qualSensorOuPino, int valorA, int valorB);

Comentário de Eduardo Nogueira em 26 outubro 2012 às 23:31

Senhores, tenho uma dúvida sobre a linguagem ... estou tento problemas... vejam:

void enviaMSG(const char *msg){
digitalWrite(13, HIGH);// Flash a light to show transmitting
delay(15);
vw_send((uint8_t *)msg, strlen(msg));//Send the message
vw_wait_tx(); // Wait until the whole message is gone
delay(15);
digitalWrite(13, LOW);
}

A função acima funciona bem quando chamada assim:

enviaMSG("apagaLED=rgb");

Mas quando tento concatenar valores para passar dados dinâmicos, da erro de conversão

int joyY = analogRead(2);

enviaMSG("joyY=" + joyY + "0"); <== erro aqui!!!

Gera o seguinte ero :

error: invalid operands of types 'const char*' and 'const char [2]' to binary 'operator+'

Alguém pode me ajudar com isso?

Comentário de Leonilde Diogenes Gurgel Neto em 17 outubro 2012 às 10:32

Bom dia José Gabriel,

Veja... eu pensei nisso no começo e acabei desistindo da ideia e nem cheguei a tentar, pois, seguindo a teoria seria como assobiar e chupar cana ao mesmo tempo.

Mesmo assim... se vc tentasse programar de maneira mais baixa possivel... nos registros de maior velocidade e precisão... poderia fazer algo do tipo... alguns milisegundos envia e alguns milisegundos recebe e "talvez" vc em um ambiente apropriado conseguiria escutar um ECO com muito ruido e sem definição... o q poderia ser ruido "interferencia" de qlqr outra fonte também...

[]´s

PS: Se eu estiver errado pelo amor de DEUS me corrijam.

Comentário de jose gabriel da silva leite em 17 outubro 2012 às 10:06

Gostaria de saber como , utilizar o transmissor e o receptor com uma unica placa arduino.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço