A medição de distância tem aplicações importantes em aplicações automotivas e industriais. A medição de distância através de sensores é útil na detecção de obstáculos e na medição de níveis de fluidos em tanques e contêineres automotivos. É o recurso de medição de distância que permitiu imaginar carros e robôs autônomos. Sem uma tecnologia que pudesse ter permitido medir a distância a um objeto ou obstáculo, o conceito de condução autónoma nunca teria sido pensado. O aplicativo de medição de distância também é utilizado nas indústrias para verificar níveis de combustível em aeronaves e veículos de transporte comercial. O aplicativo é utilizado em robótica para equipar robôs autônomos para detectar obstáculos e encontrar um caminho acessível. Este projeto também é uma aplicação de medição de distância utilizando sensores ultrassônicos.
Fig. 1: Protótipo de medidor de distância sem fio baseado em Arduino
Qualquer aplicação de medição de distância possui um circuito sensor e um atuador ou circuito display (para realizar mudança de caminho de acordo com a detecção de obstáculo ou exibir a leitura de distância respectivamente). Freqüentemente, esses circuitos são conectados por meio de uma linha fixa para transmissão de dados entre os dois. Este projeto utilizou um módulo RF 434 para transmitir leitura de distância em vez de usar um barramento com fio. Desta forma, o projeto pode ser facilmente implantado em qualquer ambiente industrial onde a instalação do cabo entre o circuito do sensor e o circuito do atuador/display possa ser arriscada ou mais cara. Um módulo RF tem alcance operacional típico de 50 a 60 metros e pode ser estendido para 300 a 350 metros usando uma antena e maior potência de transmissão. Desta forma, o sistema de medição de distância sem fio pode ser implantado em qualquer local e ter operações de supervisão ou controle ativadas a partir de um local remoto.
O projeto utiliza um sensor ultrassônico para medir distâncias (e o sensor utilizado pode medir distâncias de 2 a 400 cm) e é construído no Arduino Pro Mini. Um LCD 16X2 é usado no circuito de exibição para mostrar as leituras medidas. Um transmissor e receptor RF 434 formam a ponte sem fio entre o circuito do sensor e o circuito do display.
Componentes necessários
Sr. Não. | Componentes necessários | Quantidade Requerida |
---|---|---|
1 | Módulo RF Rx (434 MHz) | 1 |
2 | Módulo RF Tx (434Mhz) | 1 |
3 | Sensor ultrasônico | 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 ensaio | 2 |
10 | Conectando fios |
DIAGRAMA DE BLOCO
Conexões de Circuito
Existem dois circuitos no projeto – Circuito Sensor e Circuito Display. O circuito do sensor é construído em um Arduino Pro Mini. O sensor ultrassônico está conectado aos pinos 2 e 4 do Arduino. O sensor ultrassônico possui quatro pinos – Terra (Pino 1), Eco (Pino 2), Trigger (Pino 3) e Trigger. Os pinos VCC e terra são conectados ao VCC e ao terra, respectivamente. O pino Echo está conectado ao pino 4 da placa Arduino, enquanto o pino Trigger está conectado ao pino 2 da placa Arduino. Um transmissor RF é conectado diretamente ao Arduino Pro Mini com o pino 2 conectado ao pino 12 da placa para saída de dados seriais e possui uma antena conectada ao pino 4 do módulo.
Fig. 2: Imagem mostrando o funcionamento do medidor de distância sem fio baseado em Arduino
O outro circuito é o circuito de exibição. Possui um receptor RF conectado ao Arduino Pro Mini com o pino 2 conectado ao pino 11 da placa para entrada de dados seriais. Uma antena é conectada ao pino 8 do receptor RF. Um LCD é conectado à placa Arduino para mostrar a leitura da distância. 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 |
Como funciona o circuito
O sensor ultrassônico funciona segundo o princípio do eco das ondas sonoras. Quando um pulso ALTO de 10useg é passado para o pino de disparo do sensor, ele transmite oito ondas de 40KHz de disparos de pulso sônico ALTO consecutivamente. Um sinal de pulso alto sai do pino de eco conforme a onda ultrassônica é transmitida. Esta onda ao colidir com um obstáculo é refletida de volta e detectada pelo sensor. Ao detectar a onda novamente, o sinal de pulso alto do pino de eco do sensor é encerrado. O sinal recebido do pino de eco é de natureza analógica. A distância do obstáculo pode ser medida medindo o tempo máximo do pino de eco. Este é o tempo entre a transmissão e a reflexão da onda sonora. A distância é dada pelas fórmulas -:
Distância de teste = (tempo de alto nível × velocidade do som (340M/S)) / 2
O tempo multiplicado pela velocidade é dividido por 2, pois o tempo necessário para a onda sônica atingir o obstáculo e retornar. Portanto a medida da distância em cm pode ser dada pelas fórmulas –:
Distância de teste = (tempo de alto nível × velocidade do som (340M/S)) / 2
= (tempo de alto nível (microssegundo) × velocidade do som (340M/S)) / 2
= tempo de nível alto x 340/2000000 m
= tempo de alto nível x 34.000/2.000.000 cm
= tempo de alto nível x 34.000/2.000.000 cm
O sensor ultrassônico emite o pulso alto do pino 2, que é detectado no pino 12 da placa Arduino. O código do programa mede a duração do pulso e a digitaliza em um valor de distância usando as fórmulas indicadas acima. A medição da distância é transmitida em série usando o transmissor RF na forma de caracteres decimais.
Fig. 3: Diagrama de circuito do medidor de distância sem fio baseado em Arduino
No circuito de exibição, os caracteres decimais correspondentes à medição da distância são recebidos pelo receptor RF e passados em série para o pino 11 do Arduino Pro Mini do lado do receptor. O Arduino do lado do receptor possui o programa incorporado para armazenar os caracteres recebidos serialmente em um buffer de memória e passar os caracteres armazenados em buffer para o LCD 16X2 em um formato apresentável. Confira o código do programa Arduino do lado do transmissor para saber como a largura do pulso do sensor ultrassônico é medida e a medição é convertida em caracteres decimais para apresentação. Em seguida, verifique o código do programa do lado do transmissor para saber como os caracteres recebidos são colocados no buffer e exibidos no LCD.
Guia de programação
No Arduino do lado do transmissor, primeiro as bibliotecas padrão são importadas. A biblioteca VirtualWire é importada para acessar a entrada analógica do Sensor Ultrassônico.
#include
Existem duas constantes definidas “trigpin” mapeadas para o pino 2 onde o pino de disparo do sensor ultrassônico está conectado e “echopin” onde o pino de eco do sensor ultrassônico está conectado.
Uma matriz “Distância” do tipo caractere é criada para armazenar caracteres correspondentes ao valor da distância medida.
Uma função setup é chamada onde a taxa de transmissão da placa Arduino é definida para 9600 bits por segundo usando a função Serial.begin .
A função vw_setup é usada para definir a taxa de dados para transmissão serial para 2.000 bits por segundo.
Uma função loop é chamada, onde são declaradas a variável “duration” para armazenar a duração da largura do pulso, a variável “distance” para armazenar o valor da distância em metros e a variável “cm” para armazenar o valor da distância em cm.
O disparo de pulso de 10uS é gerado no pino de disparo, definindo a variável “trigpin” para saída usando a função pinMode . Um LOW é passado para o pino de disparo como início do disparo de pulso por dois microssegundos seguido por um pulso HIGH de 10 microssegundos, então o pino de disparo é definido como LOW para encerrar o disparo de pulso.
O echopin é definido para entrada usando a função pinMode . A duração do pulso HIGH no pino de eco é medida usando a função pulseIn e armazenada na variável “duração”.
A medição da largura do pulso é convertida em medição de distância usando as fórmulas tempo-velocidade. A medida está em metro que é convertida para centímetro multiplicando por 100.
A medição da distância em cm é armazenada no buffer do microcontrolador usando a função Serial.print junto com a string “cm”. A medição da distância em cm é convertida em valor de caractere e armazenada na matriz Distância usando itoa função de conversão de número inteiro para caractere.
O LED conectado no pino 13 é aceso para indicar transmissão de dados em andamento. O valor da distância é enviado serialmente para o transmissor RF usando a função vw_send onde os caracteres são convertidos em caracteres não assinados como parâmetro. A função vw_wait_tx é usada para o microcontrolador solicitar push to talk até que todos os caracteres sejam transmitidos serialmente. O LED está apagado para indicar que a leitura da distância foi transmitida com sucesso.
Isso encerra a função loop e, portanto, o código do programa do lado do transmissor.
Na placa Arduino do lado do receptor, bibliotecas padrão são importadas. O Liquidcrystal.h é importado para realizar interface LCD e exibição de conteúdo. Um array “lcd” é criado com pinos interligados ao LCD mapeados para o objeto LiquidCrystal. A biblioteca VirtualWire é importada para ler dados seriais do receptor RF.
Variáveis globais adicionais são declaradas – “ledpin” mapeado para o pino 13 onde o LED indicador de recepção está conectado, “Data” para armazenar o valor inteiro da leitura de distância e array de distância para ler um a um caractere do buffer de caracteres recebidos.
Uma função setup é criada para executar o código de inicialização. Dentro da função, a taxa de transmissão do Arduino é definida para 9.600 bits por segundo usando a função Serial.begin . O lcd é configurado para o modo 16X2 usando a função lcd.begin . As mensagens iniciais piscam e o cursor é colocado na primeira linha do display. A função pinMode é usada para definir a saída dos pinos conectados ao LCD.
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 onde o array “buff” do tipo de caractere não assinado está criado para recuperar caracteres de buffer e “buflen” variável é criado para manter verifique o comprimento do buffer de caracteres.Código-fonte do projeto
###
#includeconst int trigPin = 2; const int echoPin = 4; char Distance(4); void setup { Serial.begin(9600); vw_setup(2000); } void loop { int duration, distance, cm; pinMode(trigPin, OUTPUT); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); distance=duration*34/200000; //Convert metre to cm cm = distance*100 Serial.print(cm); Serial.print("cm"); Serial.println ; delay(100); //Convert integer value to character value itoa(cm,Distance,10); digitalWrite(13, true); // Turn on a light to show transmitting vw_send((uint8_t *)Distance, strlen(Distance)); vw_wait_tx ; // Wait until the whole message is gone digitalWrite(13, false); // Turn off a light after transmission delay(200); } #include#include LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // LED's int ledPin = 13; // Sensors int Data; // RF Transmission container char Distance(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 Distance(buflen) = ''; // Convert Sensor1CharMsg Char array to integer Data = atoi(Distance); // DEBUG Serial.print("distance = "); Serial.print(Data); Serial.println(" cm "); lcd.setCursor(0, 2); lcd.print("Distance = "); lcd.print(Data); // change the analog out value: lcd.print("cm "); }}
###
Diagramas de circuito
Medidor de distância sem fio baseado em Arduino |
Vídeo do projeto