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 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 “VirtualWirw.h” deve ser descompactado para dentro da
pasta “/libraries”
//TRANSMISSOR
#include <VirtualWire.h> // 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()
{
inputSize=0;
if
(Serial.available() > 0) {
delay(300);
inputSize =
Serial.available();
Serial.print("inputSize=");
Serial.println(inputSize);
for (int i =
0; i < inputSize; i++){
myCmd[i] =
Serial.read();
}
// say what
you got:
Serial.print("I received: ");
Serial.println(myCmd);
}
vw_send((uint8_t *)myCmd, strlen(myCmd));
vw_wait_tx(); // Wait for message to finish
delay(200);
}
//RECEPTOR
LCD
#include <VirtualWire.h>
#include <LiquidCrystal.h>
// 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()
{
Serial.begin(9600); // Debugging
only
Serial.println("setup");
// set up
the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a
message to the LCD.
lcd.print("Setup LCD");
//
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
lcd.clear();
lcd.print("VirtualWire
");
}
void loop()
{
// set the
cursor to column 0, line 1 (note: line 1 is the second row, since counting
begins with 0)
lcd.setCursor(0, 1);
uint8_t
buf[VW_MAX_MESSAGE_LEN];
uint8_t
buflen = VW_MAX_MESSAGE_LEN;
//reception
to stabilize
message_ok =
0;
cont = 0;
for (cont =
0; cont < 12 ; cont++)
{
delay(50); // wait for
reception to stabilize
message_ok
= vw_get_message(buf, &buflen); //
check the reception
if
(message_ok > 0){cont = 12;} //force the output
Serial.print(message_ok);
Serial.print(" ");
}
//if
(vw_get_message(buf, &buflen)) // Non-blocking
if
(message_ok > 0)
{
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(" ");
lcd.print(buf[i]);
}
Serial.println("");
digitalWrite(13, false);
}else
{
lcd.print("No message.....");}
}
[]'s Marcelo Victorio de A. Costa.
Este comentário foi removido pelo autor.
ResponderExcluirOlá Victorio, executei o seu circuito e programa e consegui estabelecer a transmissão desejada. Bom, tenho uma dúvida sobre o limite de caracteres por envio de mensagem, pois observei que ao enviar uma msg maior que de 17 caracteres o serial monitor do transmissor trava de forma que para continuar com a comunicação tenho que reiniciar o programa do arduino e reconectar a porta usb, e ao mesmo tempo o receptor não recebe a mensagem. Ou seja, claramente, o código ou o hardware, tem um limite de 17 caracteres de comunicação. Primeiramente gostaria de agradecer pelo seu post, pois ele foi fundamental para meu estudo e comunicação em arduino. E gostaria de saber se você teria a resposta para o que ocorreu, se é uma limitação do código, da biblioteca ou do hardware, ou se você saberia como amplia o tamanho da msg... Agradeço desde já pela atenção ;D, aguardo sua resposta.
ResponderExcluir