Comunicação sem fio entre PC e Arduino para exibição de mensagens (Parte 20/23)

É comum a utilização de telas em estações ferroviárias, aeroportos, pontos de ônibus e outros locais públicos para mostrar mensagens ou alertas. Assim como na estação ferroviária, painéis de exibição são instalados na plataforma para mostrar o alerta de um trem chegando à plataforma e mostrar os números dos vagões no local específico da plataforma. Expositores semelhantes são usados ​​em aeroportos e pontos de ônibus para exibir informações úteis aos viajantes. Mesmo em bancos e escritórios, os displays são usados ​​para mostrar o número do token atual ou outras informações relevantes do cliente. Essas placas de exibição obtêm as informações a serem exibidas em um computador. Freqüentemente, o computador e a placa do monitor são conectados por meio de um cabo para transmissão de dados.

A conexão com fio entre o computador e a placa de exibição é suficiente e viável até que a mensagem seja enviada para uma única unidade de exibição. Como em um banco no caixa, a conexão com fio entre o computador e a placa de exibição do token não é mais cara devido à necessidade de fio curto e não é muito complexa, pois apenas uma placa de exibição precisa ser conectada ao computador. Este não é o caso dos painéis de visualização instalados em estações ferroviárias e aeroportos. O custo para instalar uma conexão com fio torna-se mais caro e complexo nesse caso. Portanto, o computador e as placas de vídeo precisam ser conectados por meio de um meio sem fio.

Protótipo de circuito lateral do PC para comunicação de dados RF com PC

Fig. 1: Protótipo de circuito lateral do PC para comunicação de dados RF com PC

Este projeto mostra uma transmissão sem fio semelhante de mensagem de um computador para os circuitos de exibição usando o módulo RF de 434 MHz. O módulo RF tem um alcance entre 50-60 metros e pode ser estendido para 300-350 metros usando uma antena e aumentando a potência de transmissão.

Portanto, este projeto de baixo custo pode ser instalado em locais públicos para conectar várias placas de exibição a um computador. Um computador não pode interagir diretamente com o módulo RF, portanto ele deve se conectar através do módulo RF usando uma placa Arduino.

Componentes necessários

Sr. Não. Componentes necessários Quantidade
1 Módulo RF Rx (434Mhz) 1
2 Módulo RF Tx (434Mhz) 1
3 PC de mesa com software Arduino 1
4 LCD 1
5 1 K pote 1
6 Resistor de 10 K 1
7 Placa de desenvolvimento Arduino pro mini 2
8 Bateria – 9V 2
9 Tábua de ensaio 2
10 Conectando fios

Diagrama de blocos de comunicação de dados RF de PC para Arduino

Figura 2: Diagrama de blocos de comunicação de dados RF de PC para Arduino

Conexões de Circuito

Os dados a serem transmitidos às unidades de exibição são passados ​​através do monitor serial no PC. Para conectar o PC ao RF, o primeiro PC é conectado à placa Arduino usando o cabo USB. O transmissor RF tem interface direta com o Arduino conectando seu pino de entrada serial (pino 2) ao pino 12 do Arduino Pro Mini e uma antena conectada ao pino 4 do módulo. Na unidade de exibição do receptor, um receptor RF é conectado a outro Arduino Pro Mini com pino de saída serial (pino 2) conectado ao pino 11 da placa Arduino do lado do receptor e uma antena conectada ao pino 8 do módulo RF. Um LCD é conectado à placa Arduino do lado do receptor para exibir as mensagens transmitidas. 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 Pro Mini, respectivamente. O pino RW do LCD está aterrado.

LCD Arduino UNO
RS 3
RW GRND
E 2
D7,D6,D5,D4 7,6,5,4 respectivamente

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.

Como funciona o circuito

Os caracteres que devem ser transmitidos são passados ​​do monitor serial do PC. Esses caracteres são lidos pela placa Arduino usando a conexão USB. O caracter lido pelo microcontrolador permanece no buffer. A biblioteca VirtualWire é usada no código do programa para transmitir os caracteres do buffer através do RF. Já a biblioteca permite transmitir apenas um caracter serial por vez. Os caracteres no buffer primeiro precisam ser armazenados em um array e cada elemento do array deve ser eliminado em série, um por um.

No lado do receptor, o buffer de caracteres é detectado pelo receptor RF e passado serialmente para o Arduino Pro Mini do lado do receptor. O Arduino Pro Mini do lado do receptor possui o código de programa incorporado para buscar o buffer de caracteres em um array e converter cada elemento de caractere em uma respectiva representação inteira. A representação inteira dos caracteres é passada para o LCD 16X2 para exibição de mensagens.

Protótipo de Circuito Arduino para comunicação de dados RF com PC

Fig. 3: Protótipo de circuito Arduino para comunicação de dados RF com PC

Guia de programação

No Arduino do lado do transmissor, primeiro, a biblioteca VirtualWire é importada para facilitar a interface com o módulo RF.

#include

Um LED está conectado no pino 13 para indicar a transmissão serial em andamento. Assim, uma variável “ledpin” é declarada e atribuída ao pino 13 do Arduino. A variável “MsgData” é declarada para armazenar a leitura de caracteres e o array “MsgcharAR” é declarado para armazenar vários caracteres antes da transmissão serial. Algumas variáveis ​​globais – “length” para armazenar o comprimento da mensagem, “data_available” para verificar a disponibilidade dos dados e um contador “i” são inicializadas.

Uma função setup é chamada, onde ledpin é definido para o modo de saída usando a função pinMode , a taxa de transmissão do sistema é definida para 9600 bits por segundo usando a função Serial.begin e a função vw_setup é usado para definir a taxa de transmissão da transmissão serial RF para 2.000 bits por segundo.

Uma função loop é chamada, dentro da qual a primeira variável de comprimento é inicializada em 0 e os dados seriais são verificados se disponíveis usando a função Serial.available . Se dados seriais estiverem disponíveis, eles serão lidos usando a função Serial.read e armazenados no array MsgcharAR. O contador de comprimento é incrementado e data_available é definido como 1 para lógica booleana. O bloco de código é repetido em um loop While até que os dados seriais estejam disponíveis.

Se os dados estiverem disponíveis, a variável do sinalizador dat_available é deixada com uma configuração booleana de 1, então a mensagem armazenada na matriz MsgcharAR é serialmente enviada para o buffer usando a função Serial.print .

A mensagem armazenada no buffer deve ser enviada serialmente em RF. O led que indica a transmissão em andamento é ligado enviando uma lógica HIGH para o ledpin. A mensagem é enviada serialmente em RF usando a função vw_send , onde os caracteres da mensagem são primeiro convertidos para o formato de caracteres não assinados. vw_wait_tx é usado para esperar até que toda a mensagem seja transmitida. Quando a transmissão termina, o ledpin recebe uma lógica LOW para desligar o LED da transmissão em andamento.

O data_available é definido como 0 e cada elemento da matriz MsgcharAR é definido como 0 como valor padrão.

dados_disponíveis = 0;

Isso encerra o código Arduino do lado do transmissor

No Arduino do lado do receptor, o código do programa primeiro importa as bibliotecas padrão necessárias. LiquidCrystal.h é importado para fazer interface com o LCD e a biblioteca VirtualWire é importada para ler a entrada serial do receptor RF. Os pinos 2 a 7 são mapeados para o LCD do objeto de cristal líquido.

O pino 13 onde o LED indicador de progresso da transmissão está conectado é atribuído à variável ledpin e duas variáveis ​​– “Sensor1Data” para capturar a mensagem em forma inteira e “Sensor1CharMsg” para armazenar a representação de caracteres da mensagem a ser exibida são declaradas.

Uma função setup é chamada onde a taxa de transmissão do Arduino é definida para 9600 bits por segundo usando a função Serial.begin . O objeto LCD é inicializado no modo 16X2 e as mensagens iniciais são exibidas no LCD. O pino conectado ao led e o pino conectado a RS e RW são definidos para o modo de saída usando a função pinMode .

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 usando vw_rx_start .

Uma função loop é chamada dentro da qual são declaradas a matriz “buf ” para ler o buffer serial e a variável “buflen” para armazenar o comprimento do buffer.

O buffer de caracteres é detectado usando a função vw_get_message , se estiver presente, um contador “i” é inicializado e o LED conectado ao pino 13 é ligado enviando um HIGH no pino 13 para indicar a detecção bem-sucedida do buffer de caracteres.

O buffer de caracteres é armazenado na matriz Sensor1CharMsg usando o loop for com o contador inicializado.

O caractere nulo é detectado no fluxo de buffer para que nenhum valor lixo vá para o display LCD. Os caracteres recebidos do buffer são convertidos para o valor inteiro e armazenados na variável “Sensor1Data”.

O valor da variável junto com as strings relevantes incluídas é passado para o buffer do microcontrolador e passado para o LCD para exibição em um formato apresentável.

Isso encerra a função loop e o código Arduino do lado do receptor.

Código-fonte do projeto

###


 #include 

// LED's

const int ledPin = 13;

int MsgData;

//int Sensor2Data;

char MsgcharAR(40); 

int length,data_available;

int i;
void setup  {

 // PinModes 

 // LED 

 pinMode(ledPin,OUTPUT);

// for debugging

 Serial.begin(9600); 

 // VirtualWire setup

 vw_setup(2000);     // Bits per sec

}
void setup  {

 // PinModes 

 // LED 

 pinMode(ledPin,OUTPUT);

// for debugging

 Serial.begin(9600); 

 // VirtualWire setup

 vw_setup(2000);     // Bits per sec

}
MsgcharAR(length)  = Serial.read ; 

   length++;

   delay(100);

   data_available = 1;

  }
// Convert integer data to Char array directly 

//  itoa(data,Sensor1CharMsg,10);

  if(data_available == 1)

  {

  // DEBUG

  Serial.print(" Sending data :  ");

  Serial.println(MsgcharAR);

  //Serial.println(" ");

  delay(1000);

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

 vw_send((uint8_t *) MsgcharAR, length);

vw_wait_tx ; // Wait until the whole message is gone

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

 delay(200); 

 for(i = 0 ; i < 40 ; i++)

 {

   MsgcharAR (i) = 0;

 }
}

} // END void loop...

#include 

#include 

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

// LED's

int ledPin = 13;

// Sensors 

int Sensor1Data;
// RF Transmission container

char Sensor1CharMsg(4); 

void setup  {

  Serial.begin(9600);

  lcd.begin(16, 2);

  lcd.print("ENGINEERS GARAGE");

  lcd.setCursor(0, 1);

   // sets the digital pin as output

  pinMode(ledPin, OUTPUT);      

    pinMode(9, OUTPUT);

    pinMode(8, 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);

        lcd.setCursor(0, 2);

        lcd.print("Temperature =");

        lcd.print(Sensor1Data); // change the analog out value:

        if(Sensor1Data > 50){

        digitalWrite(9,HIGH);

        delay(2000);  

        }
digitalWrite(9,LOW);

    }        

} 

###

Diagramas de circuito

Diagrama de Circuito-PC-Arduino-RF-Comunicação de Dados

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.