Comunicação entre dois Arduinos com auxílio do PC, através de Rádio Frequência, utilizando os módulos de RF 433Mhz
Autor: Victorio | Publicado: 2012-02-28T02:24:00-08:00


Há algum tempo venho pensando em desenvolver um link de comunicação serial entre o PC e o arduino com um display digital. Algo onde fosse possível escrever no PC e transmitir para o LCD. Conversando com meu filho sobre esse assunto tivemos a idéia de desenvolver um módulo transmissor e um receptor sem fio, onde fosse possível escrever uma mensagem na tela do PC e esta mesnagem ser transmitida para o LCD remotamente. Pensamos em algumas possibilidade e após verificar o que tinhamos disponível em nossa bancada resolvemos utilizar os Módulo RF Transmissor+receptor 433mhz, um LCD de fundo azul e letras brancas, uma placa protoshield, baterias para o módulo remoto, fios e conectores.




Começamos pela montagem da base do LCD que deve ser compacta e por este motivo optamos por montar em uma ProtoShield que são placas de circuito impresso normalmente projetadas para acoplar em cima do Arduino.e utilizar as mesmas conexões.



A ligação do LCD ao arduino é muito simples, utilizamos os pinos digitais 2, 3, 4, 5, 6, 7 que estão livres e não são utilizados internamente pela VirtualWire, que falaremos mais adiante.



Na ProtoShield soldamos os pinos refrente as conexões do Arduino para que a placa se encaixe perfeitamente. Também soldamos as barras de conexão que serão usadas para encaixar os pinos de 1 a 16 do LCD e todas as ligações referente aos pinos de contraste, backlight e alimentação do módulo.















Em seguida construímos
os conectores que ligam os componentes de RF a placa do Arduino. São
necessários apenas quatro fios para ligar, que podem ser da seguinte forma: Um
fio vermelho para os 5&nbsp; ou 3,3 Volts
dependendo do módulo transmissor. Um fio preto para o GND (negativo), um fio
branco para a comunicação de dados e outro para a antena que deve ter 30
centímetros. 



No módulo receptor
é comum ter mais do que quatro terminais, mas alguns são interligados
internamente, você deve consultar o Datasheet do fabricante para ter certesa de
como fazer as ligações.




























No Arduíno que
será usado como transmissor utilizamos o pino digital 12 para a transmissão de
dados, que é o default no VirtualWire.h. Os fios positivo e GND foram ligados
nos pinos 3V3 e GND.



No módulo
receptor, utilizamos o pino digital 13 para a transmissão de dados, que é o default no VirtualWire.h. Os fios positivo e GND foram ligados nos pinos 5V e GND. 



A pós a montagem
da ProtoShield, soldagem da barra de terminais no módulo LCD e os conectores
dos módulos RF, encaixamos todos os módulos e concluímos a parte referente ao hardware
do nosso projeto.

















































O VirtualWire é uma biblioteca que fornece recursos para enviar mensagens curtas. Pode ser
utilizado com diversos modelos de transmissores e receptores de
rádio de baixo custo. Tem tudo o
que é necessário para transmitir
e receber dados através dos módulos Arduíno. Pode ser
baixado de vários sites conhecidos que falam sobre Arduino.





O código fonte foi
retirado de alguns exemplos e adaptado para exibir mensagens em uma tela de
LCD. 



O&nbsp; “VirtualWirw.h”&nbsp; deve ser descompactado para dentro da
pasta&nbsp; “/libraries”





//TRANSMISSOR



#include &lt;VirtualWire.h&gt; // you must download
and install the VirtualWire.h to your hardware/libraries folder



char myCmd[16];

int inputSize=0;



void setup()

{

Serial.begin(9600);

// Initialise the IO and ISR

vw_set_ptt_inverted(true); // Required for RF Link
module

vw_setup(2000);
// Bits per sec



vw_set_tx_pin(12); // Set the digital IO pin to use
for transmit data. Defaults to 12.



}

void loop()

{

&nbsp;&nbsp; inputSize=0;

&nbsp;&nbsp; if
(Serial.available() &gt; 0) {

&nbsp;&nbsp; delay(300);

&nbsp;&nbsp; inputSize =
Serial.available();

&nbsp;&nbsp;
Serial.print("inputSize=");

&nbsp;&nbsp;
Serial.println(inputSize);



&nbsp;&nbsp; for (int i =
0; i &lt; inputSize; i++){

&nbsp;&nbsp;&nbsp;&nbsp; myCmd[i] =
Serial.read();

&nbsp;&nbsp; }

&nbsp;&nbsp; 

&nbsp;&nbsp; // say what
you got:

&nbsp;&nbsp;
Serial.print("I received: ");

&nbsp;&nbsp;
Serial.println(myCmd);



}&nbsp; 

&nbsp; 



vw_send((uint8_t *)myCmd, strlen(myCmd));

vw_wait_tx(); // Wait for message to finish

delay(200);

}





//RECEPTOR
LCD



#include &lt;VirtualWire.h&gt;



#include &lt;LiquidCrystal.h&gt;

// initialize the library with the numbers of the
interface pins

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);



int i;

int cont;

int message_ok;



void setup()

{



&nbsp;&nbsp;&nbsp;
Serial.begin(9600); // Debugging
only

&nbsp;&nbsp;&nbsp; Serial.println("setup");



&nbsp;&nbsp;&nbsp; // set up
the LCD's number of columns and rows: 

&nbsp;&nbsp;&nbsp;
lcd.begin(16, 2);

&nbsp;&nbsp;&nbsp; // Print a
message to the LCD.

&nbsp;&nbsp;&nbsp;
lcd.print("Setup LCD");



&nbsp;&nbsp;&nbsp; //
Initialise the IO and ISR

&nbsp;&nbsp;&nbsp;
vw_set_ptt_inverted(true); // Required for DR3100

&nbsp;&nbsp;&nbsp; vw_setup(2000);&nbsp;&nbsp;&nbsp;&nbsp;  // Bits per sec



&nbsp;&nbsp;&nbsp;
vw_rx_start();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start the
receiver PLL running



&nbsp;&nbsp;&nbsp; lcd.clear();

&nbsp;&nbsp;&nbsp;
lcd.print("VirtualWire&nbsp;&nbsp;&nbsp;&nbsp;
");



}



void loop()

{

&nbsp;&nbsp;&nbsp; // set the
cursor to column 0, line 1 (note: line 1 is the second row, since counting
begins with 0)

&nbsp;&nbsp;&nbsp;
lcd.setCursor(0, 1); 

&nbsp; 

&nbsp;&nbsp;&nbsp; uint8_t
buf[VW_MAX_MESSAGE_LEN];

&nbsp;&nbsp;&nbsp; uint8_t
buflen = VW_MAX_MESSAGE_LEN;



&nbsp;&nbsp;&nbsp; //reception
to stabilize

&nbsp;&nbsp;&nbsp; message_ok =
0;

&nbsp;&nbsp;&nbsp; cont = 0;

&nbsp;&nbsp;&nbsp; for (cont =
0; cont &lt; 12 ; cont++)

&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
delay(50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // wait for
reception to stabilize

&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message_ok
= vw_get_message(buf, &amp;buflen);&nbsp; //
check the reception

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(message_ok &gt; 0){cont = 12;} //force the output

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Serial.print(message_ok);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Serial.print(" ");







&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp; //if
(vw_get_message(buf, &amp;buflen)) // Non-blocking

&nbsp;&nbsp;&nbsp; if
(message_ok &gt; 0)

&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
digitalWrite(13, true); // Flash a light to show received good message

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Message
with a good checksum received, dump it.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.print("Got:
");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0;
i &lt; buflen; i++)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print(buf[i], HEX);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print(" ");



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
lcd.print(buf[i]);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
digitalWrite(13, false);

&nbsp;&nbsp;&nbsp; }else

&nbsp;&nbsp;&nbsp; {
lcd.print("No message.....");}

&nbsp; &nbsp;&nbsp;&nbsp;

}






[]'s Marcelo Victorio de A. Costa.