LusoRobótica - Robótica em Português

Robótica => Tutoriais => Tópico iniciado por: rglove em 29 de Julho de 2012, 05:17

Título: RF Link Receiver/Transmitter - Arduino
Enviado 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:
Código: [Seleccione]
#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:
Código: [Seleccione]
#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
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: dio123 em 29 de Julho de 2012, 16:18
Tambem tou com  ideias de comprar um kit parecido / igual ao seu, para fazer umas brincadeiras.

bom tutorial, bem explicado, e simples.
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: rglove em 29 de Julho de 2012, 16:58
Depois conta como correu, se precisares de ajuda e se eu souber diz :)
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: c3dr1c em 29 de Julho de 2012, 17:54
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
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: iyahdub em 29 de Julho de 2012, 19:22
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)
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: rglove em 29 de Julho de 2012, 19:41
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
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: rglove em 31 de Julho de 2012, 03:44
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
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: senso em 31 de Julho de 2012, 03:47
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.
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: rglove em 31 de Julho de 2012, 03:54
É uma ideia, mas assim ia precisar de outro transmissor certo? Só tenho mesmo este.
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: senso em 31 de Julho de 2012, 04:01
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.
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: rglove em 31 de Julho de 2012, 04:11
Tenho de comprar uns para experimentar, mas neste momento não tenho mesmo possibilidade de gastar dinheiro, senão já tinha feito umas comprinhas :(
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: iyahdub em 06 de Agosto de 2012, 21:40
Citar
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
Código: [Seleccione]
#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

Código: [Seleccione]
#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("");
  }
}
Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: tops72 em 27 de Fevereiro de 2013, 22:43
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??

Título: Re: RF Link Receiver/Transmitter - Arduino
Enviado por: saminarob em 01 de Março de 2013, 13:53
What a lovely forum page. I’ll undoubtedly be back again. Please maintain writing!