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:
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:
// 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...
Comentar
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.
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?
Pow véi... eu que agradeço a você Eduardo ;D
[]´s e fica com DEUS!
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
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
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 ?????
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);
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?
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.
Gostaria de saber como , utilizar o transmissor e o receptor com uma unica placa arduino.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)