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
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
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.
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()
seria uma pequena distancia, aproximadamente 50,00 metros no máximo e a comunicação seria em um único sentido.
Poder, pode... mas veja com quais distâncias irá trabalhar e se vai precisar que a comunicação seja "vai e volta"
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 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.
Felipe, faz assim, monta seu projeto e posta as dúvidas específicas, assim dá pra ajudar... :)
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
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... :(
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)