LusoRobótica - Robótica em Português
Robótica => Tutoriais => Tópico iniciado por: rglove em 29 de Julho de 2012, 05:17
-
Boas, quando comprei estes módulos RF não tinha conhecimentos nenhuns de electrónica e nunca tinha programado um arduino, portanto achei complicado começar a comunicar sem fios. Neste momento já acho simples e como não encontrei nenhum tutorial sobre isso aqui, pensei que seria boa ideia fazer um e contribuir com o pouco que sei :)
Os receptor/transmissor que usei são os seguintes:
Transmissor
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.inmotion.pt%2Fstore%2Fimages%2FINM-0308-c.jpg&hash=d097bbce14d30c3fea65e114875b3105de605ead)
Receptor
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.inmotion.pt%2Fstore%2Fimages%2FINM-0309-b.jpg&hash=f257d6513107bef8f34407f3ec24055a068a718d)
São módulos relativamente baratos e têm um alcance de 100 metros em terreno aberto.
A velocidade máxima de recepção/transmissão dos que utilizei é de 4800bps.
Para comunicar com os módulos precisamos, em primeiro lugar de 2 arduinos. Eu utilizei um Arduino Mega e um Arduino Uno. Ligar o transmissor é bastante simples. O que eu tenho apenas tem indicação para a antena, mas através de uma pesquisa rápida na internet ou mesmo acedendo à datasheet do mesmo se consegue saber para que são os outros pinos. Os 2 arduinos vão comunicar com o computador pela porta Serial, portanto devem estar ligados através do cabo usb ao mesmo.
Deixo aqui uma imagem com o pinout do transmissor e receptor:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.engineersgarage.com%2Fsites%2Fdefault%2Ffiles%2FRF%2520Module%2520Pins.jpg%3F1290078683&hash=a768f899dd688d186c9d534581f2478d20619aac)
A ligação com o arduino é bastante simples em ambos os casos:
Vcc - Alimentação (de 5V a 12V)
GND - Ground
Data - Qualquer pino digital do arduino
Convém ter o arduino sem nenhum código a correr que utilize os pinos guardados para a comunicação, há pouco esqueci-me que tinha o arduino a utilizar um pino como saída e liguei o pino Data ao pino do arduino. Passado uns segundos cheirou-me a queimado e lembrei-me logo... Felizmente não estraguei nada, mas aprendi a lição...
O código para o transmissor é o seguinte:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
char info[30];
int index = 0;
char inChar;
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
}
void loop()
{
if (Serial.available() > 0) { // Se houver informação à espera para ser lida começa o loop abaixo
while (1) {
inChar = Serial.read(); // Guarda temporariamente o primeiro caracter/byte
info[index] = inChar; // Coloca o caracter numa array de caracteres
index++; // acrescenta 1 valor a index, de forma a que quando se repetirem as operações de cima o byte não seja escrito no mesmo sítio
delay(2); // Este pequeno delay é necessário para que chegue o próximo byte, caso este delay não cá esteja o arduino vai terminar o loop
if (Serial.available() <= 0) { // Esta condição é necessária para verificar se existe mais informação para ser lida
index = 0; // Como não existe mais informação para ler a variável index volta a 0
const char *msg = info;
vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
vw_wait_tx(); // espera que a informação seja transferida
memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
break; // por fim termina o loop e dá continuidade ao código (neste caso não há mais código, mas poderia haver)
}
}
}
}
Receptor:
#include <VirtualWire.h>
char info[30];
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
info[i]=buf[i];
}
Serial.println(String(info)); // Enviamos pela porta Serial a informação recebida
memset( &info, 0, sizeof(info) ); // Fazemos reset à variável info para utilizar uma outra vez
digitalWrite(13, false);
}
}
Pronto, basicamente é isto...
Fica aqui ainda uma imagem do resultado final :)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg444.imageshack.us%2Fimg444%2F689%2F37027039.jpg&hash=662a1d59ba458d17aa90b582df4f31a100969851)
À esquerda está a janela do receptor e à direita está a do transmissor.
Cumprimentos
-
Tambem tou com ideias de comprar um kit parecido / igual ao seu, para fazer umas brincadeiras.
bom tutorial, bem explicado, e simples.
-
Depois conta como correu, se precisares de ajuda e se eu souber diz :)
-
Obrigado pelo tutorial. Por acaso, à uns tempos andei a ver esses artigos, pois sao bem mais baratos que os xbee (se bem que xbee é uma coisa diferente).
Quando comprar, ja sei por onde me guiar :D
Aproveito para te perguntar, se quando transmites informação, os dados demoram muito tempo aparecer no receptor.
Abraço
-
Tb tenho aqui ja um par RF Transmissor/Receptor a 433.92MHz AM pela RF Solutions
Transmissor - AM-RT4 e Receptor - AM-HRR.
Problema e que nao tenho tido tempo nenhum com tanto trabalho. Mas tenho o codigo mais ou menos desenvolvido ( foi dificil encontrar outros projectos similares ja que e quase tudo Zigbees, etc)... Mas tenho que ver se perco algum tempo e documentar o projecto para partilhar !
Ja agora, mantem o pessoal informado, sff !
PS- Alguns links que possam ajudar, que tinha guardado
http://thegiblins.com/projects/arduino_homeeasy_receiver_manual1.php?Bigulate=0 (http://thegiblins.com/projects/arduino_homeeasy_receiver_manual1.php?Bigulate=0)
http://arduino.cc/forum/index.php/topic,109265.0.html (http://arduino.cc/forum/index.php/topic,109265.0.html)
-
Obrigado pelo tutorial. Por acaso, à uns tempos andei a ver esses artigos, pois sao bem mais baratos que os xbee (se bem que xbee é uma coisa diferente).
Quando comprar, ja sei por onde me guiar :D
Aproveito para te perguntar, se quando transmites informação, os dados demoram muito tempo aparecer no receptor.
Abraço
Pois, eu comprei estes módulos porque não tinha dinheiro para gastar em Xbees, são bem mais caros :s Ainda não testei grandes distâncias, mas do que testei os dados demoram menos de meio segundo a chegar, não é instantâneo, mas não demora assim tanto tempo, mas eu também não utilizei antenas, se calhar com antenas melhora.
Tb tenho aqui ja um par RF Transmissor/Receptor a 433.92MHz AM pela RF Solutions
Transmissor - AM-RT4 e Receptor - AM-HRR.
Problema e que nao tenho tido tempo nenhum com tanto trabalho. Mas tenho o codigo mais ou menos desenvolvido ( foi dificil encontrar outros projectos similares ja que e quase tudo Zigbees, etc)... Mas tenho que ver se perco algum tempo e documentar o projecto para partilhar !
Ja agora, mantem o pessoal informado, sff !
PS- Alguns links que possam ajudar, que tinha guardado
http://thegiblins.com/projects/arduino_homeeasy_receiver_manual1.php?Bigulate=0 (http://thegiblins.com/projects/arduino_homeeasy_receiver_manual1.php?Bigulate=0)
http://arduino.cc/forum/index.php/topic,109265.0.html (http://arduino.cc/forum/index.php/topic,109265.0.html)
Boa sorte, eu vou tentar fazer um vídeo hoje e assim podem ver a velocidade de transmissão e todo o setup.
Pois, por acaso a datasheet do meu tinha um código de exemplo, mas já não me lembro porquê o código não estava a funcionar e tive de procurar alternativas, foi aí que encontrei esta biblioteca.
Acho que para projectos que não requiram comunicação a longas distâncias estes módulos servem bem.
Cumprimentos
-
Aqui está o vídeo onde podem ver a velocidade de transmissão. Experimentei a 4800bps mas não estava a funcionar bem, alguns bytes não chegavam ao receptor, portanto baixei para 4000bps e estava a funcionar bem.
Não escrevi mensagens compridas porque o código estava programado para mensagens de 30 caracteres, no entanto podem alterar a array para um comprimento superior.
O transmissor estava a uma distância de 3/4m do receptor. Não consegui testar distâncias maiores porque tenho o fixo estragado e a minha irmã decidiu meter password no portátil dela... Fica para a próxima.
Teste de módulos RF (http://www.youtube.com/watch?v=bZ4YYvpSq90#ws)
Cumprimentos
-
Podes implementar ai um sistema de CRC simples e assim tens correcção de erros, se o CRC da mensagem recebida for diferente do suposto crc do original, pede uma re-transmissão.
-
É uma ideia, mas assim ia precisar de outro transmissor certo? Só tenho mesmo este.
-
Dai eu já ter dito para usar algo melhor, e até mais barato que esses, como por exemplo o nRF, que até tratam de re-transmissão no hardware se não me engano, mas pelo menos consegues baud-rates muito maiores, e são bi-direccionais.
-
Tenho de comprar uns para experimentar, mas neste momento não tenho mesmo possibilidade de gastar dinheiro, senão já tinha feito umas comprinhas :(
-
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
Esta funcao so e usada no caso do transceiver DR3100; Que vem de um protocolo em domotica no Home-easy.
Na biblioteca diz que por defeito, o PTT pin qdo o transmissor esta enabled. Com esta flag, ele vai LOW qdo o transmissor estiver enabled( para fins do DR3100, parece).
Um caso simples, nao usando o referido DR3100, teria sido
#include <VirtualWire.h>
void setup()
{
vw_setup(2000); // Bits per sec
}
void loop()
{
const char *msg = "hello";
vw_send((uint8_t *)msg, strlen(msg));
delay(400);
}
ou
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
Serial.println("setup");
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;
// Message with a good checksum received, dump HEX
Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
}
}
-
Boas.
Sobre RF e queria saber tb estou a pensar em comprar esse modulos,mas dps não é preciso alguma coisa para a verificação de erros??
-
What a lovely forum page. I’ll undoubtedly be back again. Please maintain writing!