Apresentaremos hoje os módulos de transmissão e recepção sem fio. Estes módulos possibilitam a comunicação entre dispositivos através de uma comunicação serial remota sem fio.
São fáceis de trabalhar e são diretamente compatíveis com a plataforma Arduino e com qualquer outro microcontrolador também.
Com eles você poderá fazer dois Arduinos conversarem entre si a distâncias de até por volta de 180m! A distância de funcionamento é relativa e varia de acordo com vários fatores, entre eles: ruídos eletromagnéticos do ambiente, tensão de alimentação do transmissor, uso de antenas apropriadas, velocidade de comunicação.
Neste exemplo de utilização, vamos controlar o brilho de um LED bicolor conectado em um Arduino remoto. Para tanto, iremos usar dois potenciômetros conectados nas portas analógicas do Arduino Transmissor (Tx). Cada potenciômetro irá definir a largura de pulso de PWM que será aplicada aos terminais do LED bicolor.
A estratégia de envio dos dados através do módulo transmissor foi a de usar o canal UART de comunicação onde cada bit do dado é enviado de forma serial através do pino TX.
Como o dado resultante da conversão A/D tem o tamanho de 10 bits, precisamos dividi-lo em dois e enviar os dois primeiros MSB e logo em seguida os oito LSB. Fazemos isto para os dois valores obtidos através dos canais A0 e A1. Um byte de start (0xFF) é enviado primeiro para indicar o início da transmissão.
Aqui temos o link para o algoritmo utilizado no Arduino Transmissor. Não foi usado nenhum protocolo de comunicação conhecido. Numa aplicação mais robusta se faz necessário o uso de protocolos de comunicação e rotinas que chequem a integridade dos dados recebidos.
No receptor utilizamos um Arduino DUE e conectamos a ele o LED bicolor e o modulo receptor RF. O algoritmo de recepção baseia-se na ideia de colher o que o canal Serial 1 (RX1 - pin 19) recebe e tratar os dados recebidos. Usamos um vetor (array) de 4 posições para, após o recebimento do byte de start (0xFF), os próximos dados poderem ser gravados.
Precisamos receber os dois valores de saída do A/D do Arduino UNO (transmissor), A0 e A1 e usá-los como referência para setar os sinais PWM que irão ser aplicados no LED bicolor de dois terminais do lado do receptor.
Como dito anteriormente, o A/D do Arduino UNO tem resolução de 10 bits. Portanto, os dois valores de saída do A/D para A0 e A1, serão recebidos em parcelas. Por isto usamos um vetor de 4 posições e não duas. Depois, fazendo as contas necessárias podemos unir novamente estes valores no Arduino DUE receptor e setar os valores PWM para o LED bicolor.
As antenas são necessárias quando a distância entre dispositivos começa a passar de ±5 metros. Em geral, o tamanho da antena é tido como ¼ do comprimento de onda (λ). Acompanhe:
Onde:
λ: comprimento de onda (m);
c: velocidade de propagação da onda (velocidade da luz) (m/s);
f: frequência da onda (Hz).
Para uma onde 315MHz, temos:
Como o comprimento da antena é ¼ do comprimento de onda (λ). Então o comprimento da antena para sistemas de RF com 315MHz é:
Portanto, uma antena de 24 cm é suficiente.
Arquivos de código ".ino" TX e RX.
Lembrem-se que esta foi apenas 1 estratégia para termos o resultado desejado. Existem muitas possibilidades que vocês podem descobrir. Adquira um dos kits RF disponíveis em nossa loja e explore ainda mais seu Arduino.
São fáceis de trabalhar e são diretamente compatíveis com a plataforma Arduino e com qualquer outro microcontrolador também.
Com eles você poderá fazer dois Arduinos conversarem entre si a distâncias de até por volta de 180m! A distância de funcionamento é relativa e varia de acordo com vários fatores, entre eles: ruídos eletromagnéticos do ambiente, tensão de alimentação do transmissor, uso de antenas apropriadas, velocidade de comunicação.
Neste exemplo de utilização, vamos controlar o brilho de um LED bicolor conectado em um Arduino remoto. Para tanto, iremos usar dois potenciômetros conectados nas portas analógicas do Arduino Transmissor (Tx). Cada potenciômetro irá definir a largura de pulso de PWM que será aplicada aos terminais do LED bicolor.
TRANSMISSÃO
Esquema de ligação do Arduino Transmissor
Lista de materiais para a montagem do transmissor:
- Arduino UNO R3;
- Módulo RF transmissor;
- 2x potenciômetros de 5k;
- Fios;
- Terminal macho MLTM para conector mini latch;
- Terminal fêmea MLTM para conector mini latch;
- Espaguete termo retrátil;
- Placa protótipo perfurada;
- Barra conector simples;
Fotos da montagem do transmissor:
A estratégia de envio dos dados através do módulo transmissor foi a de usar o canal UART de comunicação onde cada bit do dado é enviado de forma serial através do pino TX.
Como o dado resultante da conversão A/D tem o tamanho de 10 bits, precisamos dividi-lo em dois e enviar os dois primeiros MSB e logo em seguida os oito LSB. Fazemos isto para os dois valores obtidos através dos canais A0 e A1. Um byte de start (0xFF) é enviado primeiro para indicar o início da transmissão.
Aqui temos o link para o algoritmo utilizado no Arduino Transmissor. Não foi usado nenhum protocolo de comunicação conhecido. Numa aplicação mais robusta se faz necessário o uso de protocolos de comunicação e rotinas que chequem a integridade dos dados recebidos.
RECEPÇÃO
Esquema de ligação do Arduino Receptor
Lista de materiais para a montagem do receptor
Fotos da montagem do receptor:
No receptor utilizamos um Arduino DUE e conectamos a ele o LED bicolor e o modulo receptor RF. O algoritmo de recepção baseia-se na ideia de colher o que o canal Serial 1 (RX1 - pin 19) recebe e tratar os dados recebidos. Usamos um vetor (array) de 4 posições para, após o recebimento do byte de start (0xFF), os próximos dados poderem ser gravados.
Precisamos receber os dois valores de saída do A/D do Arduino UNO (transmissor), A0 e A1 e usá-los como referência para setar os sinais PWM que irão ser aplicados no LED bicolor de dois terminais do lado do receptor.
Como dito anteriormente, o A/D do Arduino UNO tem resolução de 10 bits. Portanto, os dois valores de saída do A/D para A0 e A1, serão recebidos em parcelas. Por isto usamos um vetor de 4 posições e não duas. Depois, fazendo as contas necessárias podemos unir novamente estes valores no Arduino DUE receptor e setar os valores PWM para o LED bicolor.
Antenas
As antenas são necessárias quando a distância entre dispositivos começa a passar de ±5 metros. Em geral, o tamanho da antena é tido como ¼ do comprimento de onda (λ). Acompanhe:
λ: comprimento de onda (m);
c: velocidade de propagação da onda (velocidade da luz) (m/s);
f: frequência da onda (Hz).
Para uma onde 315MHz, temos:
Como o comprimento da antena é ¼ do comprimento de onda (λ). Então o comprimento da antena para sistemas de RF com 315MHz é:
Portanto, uma antena de 24 cm é suficiente.
Arquivos de código ".ino" TX e RX.
* * *
Lembrem-se que esta foi apenas 1 estratégia para termos o resultado desejado. Existem muitas possibilidades que vocês podem descobrir. Adquira um dos kits RF disponíveis em nossa loja e explore ainda mais seu Arduino.
Não é preciso utilizar a biblioteca VirtualWire???
ResponderExcluirsabem dizer qual a aplicação da mesma se nao ha necessidade?
Olá!
ExcluirA Biblioteca VirtualWire não foi utilizada nesse exemplo, uma vez que a maneira apresentada por nós para a utilização do Kit RF foi apenas uma das muitas formas possíveis de utilização para o mesmo. A biblioteca VirtualWire é uma maneira conhecida de utilizar módulos RF, com bastante documentação divulgada na web.
Para testá-la, assumindo que já foi feito o download e a instalação da mesma, pode ser utilizado o seguinte código, que fará o led ligado ao pino 13 do Arduino receptor acender e apagar, de acordo com a transmissão enviada.
Para o transmissor:
#include
char *controller;
void setup() {
pinMode(13,OUTPUT);
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}
void loop(){
controller="1" ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
delay(2000);
controller="0" ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,0);
delay(2000);
}
Para o Receptor:
#include
void setup()
{
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4000); // Bits per sec
pinMode(13, OUTPUT);
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
{
if(buf[0]=='1'){
digitalWrite(13,1);
}
if(buf[0]=='0'){
digitalWrite(13,0);
}
}
}
Lembrando que é necessário que se use 2 Arduinos, e que a ligação dos módulos seja feita de maneira que o terminal de dados fique no pino 12 do Arduino, tanto no receptor quanto no transmissor
Esperamos ter ajudado.
Obrigado pelo feedback!
Aproveite nossas postagens e visite a nossa loja em www.eletrodex.com.br
Olá,
ResponderExcluirPelo código eu vi que a velocidade é de 4800.
Existe alguma opção de aumentar esta velocidade?
Em caso positivo, como eu configuro isto no emissor/receptor?
Obrigado.
Sim, é possível, Diego.
ExcluirBasta alterar o valor 4800 na linha "Serial.begin(4800);" para um valor que seja mais conveniente.
Porém, é importante lembrar que este valor deverá ser um múltiplo inteiro do valor 4800 (por exemplo: 9600, 19200...),para facilitar a visualização dos dados no Monitor Serial.
Esperamos ter ajudado.
Obrigado pelo feedback!
Aproveite nossas postagens e visite a nossa loja em www.eletrodex.com.br
Obrigado!!
ExcluirJá efetuei a compra! :D
Olá!
ResponderExcluirSeria possível aumentar a distância de comunicação, algo próximo de 1km, seja utilizando este módulo ou um módulo mais sofisticado? O fato de a antena e o receptor estarem em movimento pode afetar o funcionamento?
Caso seja necessário um módulo mais sofisticado, vocês poderia produzir um protótipo e posteriormente em escala?
Muito bom. E para dois led's qual seria alteração necessária nesse código?
ResponderExcluirlegal mas nao tem links
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluir