Transmissão de dados analógicos no módulo RF usando Arduino (Parte 17/23)

A transmissão de dados digitais através de um módulo RF é bastante comum. Os módulos RF 434 são capazes de transmitir dados de 4 bits junto com o byte de endereço. Os circuitos que usam módulos RF para transmissão de dados digitais são simples e usam ICs codificador HT12E e decodificador HT12D para conversão de dados paralelo para serial e serial para paralelo, respectivamente. Em situações da vida real, a fonte dos dados digitais são apenas os computadores, microcomputadores ou CIs digitais. O mundo real não é o digital, é analógico. Tipo, a maioria dos sensores são, na verdade, sensores analógicos e são capazes de transmitir os dados analógicos para o formato digital apenas quando um microcomputador os processa do formato analógico para o digital.

Os microcontroladores Arduino mais comumente usados ​​em projetos de hardware também são capazes de ler dados analógicos e representá-los em formato digital. A digitalização de dados analógicos para um formato digital pode ser realizada usando a biblioteca virtualWire de código aberto do Arduino. Os dados analógicos lidos podem ser enviados em série para um transmissor de RF a partir de qualquer pino de entrada/saída digital.

Este projeto demonstra a leitura dos dados analógicos do sensor LDR por uma placa Arduino e sua transmissão para outra placa Arduino que exibe os dados de forma digitalizada em uma tela LCD.

Componentes necessários

Sr. Não Componentes necessários Quantidade
1 Módulo RF Rx (434 MHz) 1
2 Módulo RF Tx (434Mhz) 1
3 LDR 1
4 LCD 1
5 Pote de 1k 1
6 Resistor de 10k 1
7 Placa de desenvolvimento Arduino pro mini 2
8 Bateria – 9V 2
9 Tábua de Pão 2
10 Conectando fios

Diagrama de blocos do transmissor de dados RF analógico baseado em Arduino

Figura 1: Diagrama de blocos do transmissor de dados RF analógico baseado em Arduino

Conexões de Circuito

O sensor analógico utilizado neste projeto é um LDR (Light Dependent Resistor). O LDR está conectado ao pino A2 do Arduino Pro Mini. O sensor LDR está conectado em uma configuração pull-up. Nesta configuração, o LDR é conectado entre o VCC e a saída (pino A2 do Arduino) e um resistor pull-up de valor adequado é conectado entre a saída e o terra. Os dados analógicos lidos no pino A2 saem em série do pino 12 (pino de E/S digital) do Arduino, então o pino 12 está conectado ao pino 2 do transmissor RF. O transmissor RF possui uma antena conectada ao pino 4 para maior alcance operacional.

No lado do display, os dados transmitidos serialmente são buscados por um receptor RF. O pino 2 do receptor está conectado ao pino 11 da segunda placa Arduino. Um LCD é conectado à placa Arduino para exibir a leitura do sensor recebido. O display LCD 16X2 é conectado à placa Arduino conectando seus pinos de dados aos pinos 7 a 4 da placa Arduino. Os pinos RS e E do LCD estão conectados aos pinos 3 e 2 do Arduino ProMini, respectivamente. O pino RW do LCD está aterrado.

Tabela listando conexões de circuito entre Arduino Uno e Character LCD

Fig. 2: Tabela listando conexões de circuito entre Arduino Uno e Character LCD

A biblioteca de códigos padrão para interface do Arduino UNO e Arduino Pro Mini é usada no projeto para programar o LCD com a placa.

Protótipo do lado do receptor do transmissor de dados RF analógico baseado em Arduino

Fig. 3: Protótipo do lado do receptor do transmissor de dados RF analógico baseado em Arduino

Como funciona o circuito

O sensor LDR funciona segundo o princípio da fotocondutividade. Sua resistência é reduzida quando a luz incide sobre ele, pois a resistividade do sensor é reduzida na exposição à luz. O sensor LDR está conectado na configuração pull-up. A tensão é reduzida primeiro pelo LDR e depois pela junção de saída e pelo resistor pull-up. Quando a luz incide sobre o LDR, sua resistência é reduzida e, portanto, a queda de tensão pelo resistor pull-up no pino de dados analógico é maior. Embora quando o LDR é coberto para restringir sua exposição à luz, o valor da resistência aumenta, de modo que a queda de tensão pelo resistor pull-up no pino de dados analógicos é reduzida. A leitura analógica é realizada no pino A2 do Arduino Pro Mini. Isso pode ser feito em qualquer pino de A0 a A7 do Arduino Pro Mini.

Os dados analógicos lidos são armazenados digitalmente em uma variável no código do programa que é convertida para uma forma decimal digitalizada usando a lógica do programa. A leitura digitalizada sai em série do pino 12 da placa Arduino do lado do transmissor para o transmissor RF.

A leitura digitalizada é detectada pelo receptor RF e sai em série do pino 2 do receptor ao pino 11 da placa Arduino do lado do receptor. A leitura é exibida em uma tela LCD usando as funções da biblioteca padrão lcd.h no código do programa. A execução principal do projeto é orientada a software, portanto o código do programa é aquele que precisa ser cuidadosamente compreendido.

Protótipo do lado do transmissor do transmissor de dados RF analógico baseado em Arduino

Fig. 4: Protótipo do lado do transmissor do transmissor de dados RF analógico baseado em Arduino

Guia de programação

No lado do transmissor, a placa Arduino deve ler a leitura analógica na forma de queda de tensão no pino de interface do sensor. Para o mesmo, a biblioteca VirtualWire é importada.

#include

Um LED foi conectado ao pino 13 para uma indicação visual da transmissão de dados. Uma variável “ledPin” é declarada e atribuída ao pino 13. O sensor LDR está conectado no pino A2, então uma variável “Sensor1Pin” é declarada e mapeada para o pino A2 do Arduino. Uma variável “Sensor1Data” é declarada para buscar leitura analógica digitalmente e o array “Sensor1CharMsg” é criado para representação decimal precisa de 3 dígitos da leitura.

//LEDs

const int ledPin = 13;

//Sensores

const int Sensor1Pin = A2;

int Sensor1Dados;

Uma função setup é chamada, dentro da qual o pino com interface do LED é definido como saída digital e o pino com interface do sensor é definido para o modo de entrada usando a função pinMode . A taxa de transmissão do Arduino é definida para 9.600 bits por segundo usando a função Serial.begin. A taxa de transmissão para saída serial é definida para 2.000 bits por segundo usando a função vw_setup da biblioteca VirtualWire.

Uma função de loop é chamada onde os dados analógicos do pino A2 são lidos usando a função analogRead e atribuídos à variável Sensor1Data. O valor Seria1Data é convertido para representação em formato decimal e armazenado no array Sensor1CharMsg usando itoa função de conversão de número inteiro para caractere.

loop vazio

As leituras armazenadas na variável e no array são armazenadas em buffer serialmente usando a função Serial.print .

O pino com interface do LED é definido como HIGH para acender o LED como indicação de transmissão de dados. A leitura armazenada no array Sensor1Char é convertida em caracteres não assinados até que todos os quatro elementos do array sejam convertidos para o formato unsigned char. Os caracteres são enviados em série usando a função vw_send e a função vw_wait_tx é usada para continuar a transmissão até que todos os dados (todos os quatro caracteres) sejam retirados em série do buffer. O LED está apagado como indicação de que a transmissão de dados foi concluída.

No lado do receptor, novamente a biblioteca VirtualWire é importada para leitura de dados analógicos.

Uma variável ledPin é atribuída ao pino 13 onde o LED indicador de recepção de dados está conectado. Uma variável Sensor1Data é declarada para ler a leitura dos dados como inteiro e o array Sensor1CharMsg é criado para mapear a forma decimal da leitura dos dados.

Uma função de configuração é chamada, onde a taxa de transmissão do Arduino do lado do receptor é definida para 9600 bits por segundo usando a função Serial.begin . O pino conectado ao LED está definido como saída digital.

O módulo transmissor e receptor de RF não possui pino Push To Talk. Eles ficam inativos quando nenhum dado está presente para transmitir ou receber, respectivamente. Portanto, vw_set_ptt_inverted(true) é usado para configurar a polaridade push to talk e solicitar que o receptor continue recebendo dados após buscar o primeiro caractere. A taxa de transmissão para entrada serial é definida para 2.000 bits por segundo usando a função vw_setup . A recepção dos dados é iniciada através da função vw_rx_start .

Uma função de loop é chamada onde os dados no buffer do microcontrolador são lidos e exibidos na tela LCD. Um array “buf” é declarado do tipo unsigned char para buscar bytes de char recebidos e a variável “buflen” é declarada para armazenar o comprimento dos dados do buffer recebidos.

O buffer de caracteres recebido é lido usando a função vw_get_message e um contador “i” é inicializado. O pino de interface do LED é definido como HIGH para indicar que os dados foram recebidos e o buffer de caracteres recebidos é convertido em tipo de dados de caracteres e armazenado na matriz Sensor1Msg.

O último caractere da matriz é definido como caractere Nulo para que, se o buffer de leitura tiver menos de quatro dígitos, ele não exiba um valor lixo na tela LCD. Os elementos do array Sensor1Msg são convertidos em números inteiros e armazenados no array Sensor1Data. Os inteiros da matriz Sensor1Data são exibidos no LCD usando a função Serial.print e o pino com interface do LED é definido como LOW para desligar o LED como uma indicação visual de que os dados foram lidos e exibidos com sucesso. A leitura analógica foi lida no projeto como a leitura de tensão no pino analógico do Arduino Pro Mini.

A leitura do sensor não foi calibrada para mostrar qualquer quantidade física real, como intensidade de luz ou luminosidade, no caso de sensor baseado em luz. No entanto, a leitura real de uma grandeza física pode ser exibida através do projeto, julgando a calibração do sensor em relação à grandeza física sob medição. A lógica para converter a leitura de tensão na medição da grandeza física sob observação pode ser incorporada na lógica do programa com base na calibração do sensor.

Código-fonte do projeto

###

#include 

// LED's

const int ledPin = 13;

// Sensors 

const int Sensor1Pin = A2;

int Sensor1Data;

char Sensor1CharMsg(4); 

void setup  {

 // PinModes 

 // LED
pinMode(ledPin,OUTPUT);

 // Sensor(s)

 pinMode(Sensor1Pin,INPUT);

  // for debugging

 Serial.begin(9600); 

  // VirtualWire setup

 vw_setup(2000);     // Bits per sec

}
// Read and store Sensor 1 data

  Sensor1Data = analogRead(Sensor1Pin);

    // Convert integer data to Char array directly 

  itoa(Sensor1Data,Sensor1CharMsg,10);
// DEBUG

  Serial.print("Sensor1 Integer: ");

  Serial.print(Sensor1Data);

  Serial.print(" Sensor1 CharMsg: ");

  Serial.print(Sensor1CharMsg);

  Serial.println(" ");

  delay(1000);

  // END DEBUG
digitalWrite(13, true); // Turn on a light to show transmitting

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

 vw_wait_tx ; // Wait until the whole message is gone

 digitalWrite(13, false); // Turn off a light after transmission

 delay(200);

} // END void loop...

#include // LED's
int ledPin = 13;

// Sensors 

int Sensor1Data;

// RF Transmission container

char Sensor1CharMsg(4);
void setup  {

  Serial.begin(9600);

    // sets the digital pin as output

  pinMode(ledPin, OUTPUT); 

    // VirtualWire 

    // Initialise the IO and ISR

    // Required for DR3100

    vw_set_ptt_inverted(true); 

    // Bits per sec

    vw_setup(2000);
// Start the receiver PLL running

    vw_rx_start ;       

} // END void setup
void loop {

    uint8_t buf(VW_MAX_MESSAGE_LEN);

    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    // Non-blocking

    if (vw_get_message(buf, &buflen))
{

    int i;

        // Turn on a light to show received good message 

        digitalWrite(13, true); 

            // Message with a good checksum received, dump it. 

        for (i = 0; i < buflen; i++)
{            

          // Fill Sensor1CharMsg Char array with corresponding 

          // chars from buffer.   

          Sensor1CharMsg(i) = char(buf(i));

    }
// Null terminate the char array

        // This needs to be done otherwise problems will occur

        // when the incoming messages has less digits than the

        // one before. 

        Sensor1CharMsg(buflen) = '';

        // Convert Sensor1CharMsg Char array to integer

        Sensor1Data = atoi(Sensor1CharMsg);
// DEBUG 

        Serial.print("Sensor 1: ");

        Serial.println(Sensor1Data);

        // END DEBUG

        // Turn off light to and await next message 

        digitalWrite(13, false);

    }

}

###

Diagramas de circuito

Diagrama de Circuito-Transmissor de Dados RF Analógico Baseado em Arduino

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.