Introduction: DIY Projects - My Ultrasonic Tape Measure

About: This is a channel for Homemakers and DIY where you will find useful tutorials about Arduino and IOT systems, some Gardening techniques and Woodworking projects.

Este é um projecto simples que consiste em criar uma fita métrica digital, que utiliza um sensor de ultrasons de forma a determinar a distância entre este equipamento e um qualquer obstáculo, este tipo de sensor é muito versátil sendo muito utilizado em projectos de automação e robótica.

Decidimos desenvolver este equipamento para vos mostrar uma das possíveis funcionalidades deste tipo de sensor, sendo bastante útil para determinar dimensões ou áreas por exemplo das divisões de nossas casas.

Assim começamos por vos explicar o funcionamento do sensor de ultrasons. Este permite medir distâncias em linha recta, quantificando distâncias através da contagem de tempo que demora o som emitido pelo sensor a percorrer o espaço até a um obstáculo.

A frequência desse som emitido encontra-se no intervalo dos ultrasons, cerca de 40 KHz, garantindo uma direcção mais concentrada da onda sonora, pois um onda sonora com uma frequência alta tende em dissipa-se menos no ambiente envolvente. O sensor de ultrasons utilizado nesta montagem é constituído por 2 membranas, uma membrana que emite o som e outra que recebe o seu eco, ou seja é constituído por uma pequena coluna e um microfone.

Durante este processo o sensor funciona também como uma espécie de cronometro de alta precisão, determinando o tempo que o sinal levou desde a sua emissão até o seu retorno (Ver imagem acima).

Para calcular a distância utilizamos a seguinte formula, "D = (Vs x T) / 2" (Ver cálculos acima) sendo :

  • D = Distância;
  • Vs = Velocidade do som;
  • T = Tempo que o som demora a percorrer desde a sua emissão até à sua recepção.

Frequentemente a velocidade do som não é considerada como variável, sendo normalizada a 340m/s, assumindo que a temperatura do ar está a 20ºC e ao nível do mar, mas como esta montagem é de um instrumento de medida, desejá-se que este seja o mais preciso possível. Logo, assumimos que a velocidade do som pode variar consoante alguns factores, sendo um deles a temperatura ambiente (ver cálculos acima).

Para eliminar o possível erro por variação de temperatura utilizamos um sensor temperatura, sendo neste caso utilizada uma resistência NTC (Negative Temperature Coefficient), que diminui a sua resistência eléctrica com o aumento de temperatura, ou então, uma PTC (Positive Temperature Coefficient), que aumenta a sua resistência eléctrica com o aumento de temperatura (Ver gráfico acima).

Para que todos estes sensores possam interagir entre eles e para que sejam realizados todos os cálculos acima mencionados utilizamos um Arduino NANO. Esta é uma placa muito idêntica à placa Arduino UNO, já muito falada nos nosso tutoriais, no entanto muito mais pequena e com menos entradas e saídasdigitais e analógicas, mas com as mesmas funcionalidades, tendo apenas uma ligação USB Mini-B (Ver imagem acima).

Por fim, utilizamos também um LCD 1602 (Liquid Crystal Display), que como a sua referencia indica contem 16colunas e 2linhas, este tem o objectivo de representar a distância que o sensor e o Arduino determinam (Ver imagem acima), sendo que neste caso, pode ser representada em várias unidades de medidas, como m (metros), cm (centímetros) ou in (polegadas).

Caso queiram saber mais sobre o sensor de ultrasons ou o LCD 1602 vejam as suas datasheet (Ver ficheiros abaixo), alem destes vejam também as especificações detalhadas do Arduino NANO, através da página oficial do Arduino em "https://store.arduino.cc/arduino-nano".

Step 1: Montagem Da PCB:

Começamos sempre os projectos desenhando e testando o circuito através de uma pequena Breadboard e os componentes necessários para a sua realização, só depois destes testes terminados e confirmada a sua funcionalidade, partimos para a concretização final.

Material necessário:

  • 1x Arduino NANO;
  • 1x Cabo Mini USB;
  • 1x Breadboard;
  • 1x Sensor de Ultrasons HC-SR04;
  • 1x LCD 1602;
  • 1x Resistência 270Ω;
  • 1x Potenciómetro 10KΩ;
  • 1x Sensor de temperatura NTC 10KΩ;
  • 3x Resistências de 10KΩ;
  • 3x Botões (Push Button);
  • 3x Resistências 1KΩ;
  • 1x Bateria de 9V;
  • 1x Ligação bateria de 9V;
  • 1x Interruptor.

Este circuito utiliza para a sua alimentação uma pilha de 9V, apesar dos componentes utilizados funcionarem a 5V DC, assim de formas a que as alimentações desses componentes seja a mais correcta, ligamos a bateria ao pino de alimentação Vin do Arduino NANO, visto que este pode ser alimentado por uma tensão entre 7 a 12V DC. Depois para alimentar todos os outros componentes do circuito utilizamos o pino de alimentação +5V estando esta tensão regulada e estabilizada (Ver circuito acima).

Instalação do LCD 1602:

Como explicado em tutoriais anteriores, não são utilizados todos os pinos do LCD, pois cada pino tem uma função especifica (Ver legenda acima). Assim para explicar mais facilmente o funcionamento do LCD, agrupamos os seus pinos em 3 grupos, o grupo dos Pinos de Alimentação, o de Pinos de Comunicação e de Pinos de Informação.

Pinos de Alimentação:

  • Gnd;
  • Vcc;
  • V0;
  • LED - ou A (Anodo);
  • LED + ou K (Catodo).

Os pinos Gnd e Vcc do LCD são responsabilizados pela sua alimentação, já o pino V0 tem como função o ajuste do contraste dos caracteres, este deve ser ligado a uma resistência variável de 10KΩ, funcionando como um divisor de tensão (Ver imagem acima), alterando assim a tensão no pino A7 entre 0 e 5V.

Os pinos A e K também são alimentados através dos pinos de Gnd e +5V do Arduino, sendo que é utilizada uma resistência de 270Ω em série, protegendo assim os LED a retro iluminação do LCD.

Pinos de Comunicação:

  • RS (Register Select);
  • R/W (Read / Write);
  • E (Enable).

O pino R/W deve estar ligado a Gnd para que seja permitido escrever no LCD aparecendo assim o caracteres, caso contrario podemos estar a ler os dados guardados na memoria interna ficando o LCD em branco. Os restantes pinos são ligados ao pinos do Arduino D7 e D6 respectivamente.

Pinos de Informação:

  • D0;
  • D1;
  • D2;
  • D3;
  • D4;
  • D5;
  • D6;
  • D7.

Nesta montagem apenas são utilizados 4 dos 8 possíveis pinos de informação, pois apenas são necessários metade dos pinos de dados. Isto é possível através da Biblioteca LiquidCrystal.h que colocamos no código, permitindo ler o Byte (Byte = 8 bits) de informação enviado pelo Arduino dividido em 2 partes, ou seja, 4 bits de cada vez.

Isto porque esta Biblioteca controla os pinos de comunicação de forma a que o LCD saiba qual o tipo são os pinos que recebem a informação (Pinos de D4 a D7).

Instalação do Sensor de Ultrasons HC-SR04:

Passamos agora para o nosso sensor de ultrasons, este tem 4 pinos, sendo 2 de alimentação e 2 de informação. A sua alimentação é fornecida através do Arduino, pois sensor é também alimentado a 5V DC.

Os pinos de informação são ligados aos pinos digitais do Arduino (Pinos D11 e D12), pois os sinais recebidos e emitidos pelo sensor são de sinal digital.

Instalação do sensor de temperatura:

Para melhorar a precisão do nosso equipamento, utilizamos na nossa montagem um sensor resistivo NTC (Negative Temperature Coefficient), ou seja, diminui a sua resistência à medida que a temperatura aumenta.

Este sensor está montado como um circuito divisor de tensão, segundo o fabricante a sua resistência é de 10KΩ, logo este deve ser ligado a uma resistência de 10KΩ (Ver imagem acima). O ponto intermédio deste divisor de tensão é ligado assim a um pino de entrada analógica do Arduino, neste caso A7, assim à medida que a temperatura altera, a tensão neste pino pode variar entre 0 e 5V.

Caso queiram saber mais sobre o LCD 1602 e o sensor de Temperatura, vejam o tutorial "ARDUINO TUTORIAL - LCD - TEMPERATURE SENSOR" - https://www.instructables.com/id/Arduino-Tutorial-LCD-Temperature-Sensor/

Criar a PCB:

Em primeiro lugar desenhamos o circuito preparando-o para a PCB (Printed Circuit Board), para isso é necessário saber quais as medidas finais da placa e depois desenhar as ligações eléctricas entre os respectivos componentes (Ver imagem de PCB acima).

Para realizar esta tarefa utilizámos o programa de PCB Design (EasyEDA), onde é possível imprimir o circuito em acetato, no entanto, deixamos-vos o desenho do PCB pronto a imprimir ou para importar, sendo possível alterar-lo (Ver ficheiros abaixo).

Material necessário:

  • 1x PCB de 32mm x 106mm;
  • 1x Broca de 1mm;
  • 1x Broca de 1,6mm;
  • Luvas de protecção;
  • Óculos de protecção;
  • Lata de Spray de POSITIV 20;
  • Soda Caustica;
  • Percloreto de ferro.

Estando o desenho pronto passamos para o método químico, tendo este 3processos para a sua elaboração,ou seja, o processo de Revelação, que consiste em utilizar uma tinta especial, sensível à luz Ultra-Violeta, e um produto químico revelador, ficando impresso o nosso circuito na PCB (Ver imagem acima), a seguir vem o processo de Corrosão, que utiliza um produto químico para corroer o cobre exposto pelo processo anterior (Ver Imagem acima). Por fim, o vem o processo de Limpeza e acabamento da PCB, sendo criados os orifícios onde os componentes eléctricos são encaixados e soldados (Ver imagem Acima).

Processo de Revelação:

Este processo começa com a pintura da face de cobre da PCB, sendo esta realizada com uma tinta sensível à luz Ultra-Violeta (Ver imagens acima), podendo esta ser em Spray (POSITIV 20) ou em lata (Ver Datasheet abaixo), esta tinta deve ser aplicada uniforme-mente e com uma camada fina, para que a luz Ultra Violeta possa penetrar facilmente.Também existem PCB com esta tinta já aplicada, sendo apenas necessário retirar uma película que a protege.

De seguida, é colocada a PCB com o respectivo acetato exposto a luz Ultra-Violeta cerca de 45 minutos, dependendo da potência das lâmpadas, podendo ser utilizada uma máquina com lâmpadas de radiação UV.

Terminado o tempo de exposição à luz Ultra-Violeta utilizamos o produto revelador, este é composto por Soda Caustica (NaOH) em pó, granulado ou liquido (Ver datasheet abaixo), aconselhamos que esta solução seja rectificada gradualmente, iniciando com esta mais fraca, introduzindo a Soda Caustica progressivamente, até à solução ideal.

Atenção:

Deve-se utilizar sempreluvas de borracha e óculos protectores, pois este tipo de produtos são perigosos e podem causar lesões graves na pele e nos olhos.

Para revelar a impressão do circuito eléctrico, é colocada a PCB dentro dessa solução cerca de 10 minutos, verificando o seu estado de 2 em 2 minutos, até que seja bem visível e bem definido o circuito eléctrico.

Processo de Corrosão:

Neste processo é utilizada uma solução de agua e Percloreto de Ferro (FeCl3), o Percloreto de ferro pode ser encontrado no mercado em estado liquido ou em granulado (Ver Datasheet abaixo), aconselhamos também que esta solução seja rectificada gradualmente, introduzindo o Percloreto de Ferro progressivamente.

Para realizar este processo basta colocar a PCB com o circuito impresso (Ver Imagens acima) dentro da solução por cerca de 45 minutos, esta solução apenas irá corroer o cobre exposto, todavia, deve-se verificar o seu estado de 10 em 10 minutos mexendo a solução para que o processo seja um pouco mais rápido.

Este processo terminal quando todo o cobre exposto ficar totalmente corrido, ficando apenas o cobre das zonas com a protecção da tinta (Ver Imagens acima).

Atenção:

Deve-se utilizar sempreluvas de borracha e óculos protectores, pois este tipo de produtos são perigosos e podem causar lesões graves na pele e nos olhos.

Processo de Limpeza e acabamento:

Após terminado o processo anterior deve-se limpar a PCB com um pano embebido em Álcool retirando assim os restos de tinta que protegem as pista do circuito eléctrico. Depois deve ser feita um verificação visual e caso existam duvidas na integridade das pistas ou que estas estão em contacto indesejado, confirmar com um multímetro em modo de verificação de continuidade.

De seguida, realizamos a furação começando com uma broca pequena de cerca de 1mm, verificando posteriormente se os pinos dos componentes a montar na placa cabem nesses furos, caso contrario utilizar brocas com uma medida um pouco acima.

Para finalizar o acabamento podemos limar ou lixar as arestas da placa retirando aquele aspecto áspero, rectificando a geometria da PCB em relação ao circuito eléctrico desenhado.

Step 2: Montagem Final:

Terminada a PCB teremos criar a caixa do equipamento, para que seja fácil manusear-lo esta caixa tem no seu interior alojados todos os componentes do circuito ficando à vista apenas o LCD 1602, os respectivos botões de pressão e o interruptor de alimentação.

Para desenhar esta caixa utilizamos um programa de desenho técnico AUTODESK Fusion360, sendo muito fácil de utilizar e gratuito. Esta caixa tem um formato idêntico à da PCB para a alojar mais facilmente e com as faces direitas para que seja fácil apoiar o equipamento em paredes ou objectos com superfícies planas. (Ver imagens acima).

No entanto, deixamos-vos os ficheiro editáveis, caso queiram realizar alguma alteração (Ver ficheiros Fusion 3D abaixo).

Para materializar a caixa utilizamos uma Impressora 3D (Ver imagem acima) e um Software de impressão 3D (Simplify 3D), esta impressão foi utilizada com filamento PLA (Ver Ficheiro STL abaixo), neste caso não foi necessário realizar nenhuma pintura, pois a cor do filamento é a cor desejada.Também deixamos-vos os ficheiro STL para que seja mais fácil recriar este equipamento em uma Impressora 3D.

Caso tenham interesse deixamos-vos também aqui a nossa página em Thingiverse onde podem encontrar este e outros projectos em Impressão 3D.

Step 3: Código:

Estando o equipamento montado e pronto ligamos o cabo USB e carregamos o respectivo código na placa do Arduino.

Começamos a explicação do código do nosso projecto com as funções de Menu, pois o equipamento tem várias páginas sendo possível visualizaras no LCD estas têm funcionalidades diferente podendo alterar de página do Menu através dos botões de pressão, sendo estes o nosso interface para navegar nas diferentes páginas do menu.

Assim em primeiro lugar elaboráramos um pequeno esquema de blocos com a estrutura de páginas e funções que o Menu do nosso equipamento terá (Ver esquema acima), sendo mais fácil elaborar depois o nosso código, pois caso seja necessário alterar ou corrigir-lo sabemos sempre onde nos encontramos.

//Correr a função LOOP repetidamente:<br>void loop() {
	//Condição para a leitura da distância:
	 if (Menu == 0) {
		//Correr a função:
		Pagina_0();
	}
	//Condição para a leitura da temperatura:
	else if (Menu == 1) {
		//Correr a função:
		Pagina_1();
	}
	//Condição para a leitura da temperatura:
	else if (Menu == 2) {
		//Correr a função:
		Pagina_2();
	}
}
//Página 0:
void Pagina_0() {
	//Código referente ás função desta página.
}
//Página 1:<br>void Pagina_1() {
	//Código referente ás função desta página.
}
//Página 2:
void Pagina_2() {
	//Código referente ás função desta página.
}

Como nesta montagem é utilizado um Sensor de Temperatura e um LCD 1602, no código começamos por importar as bibliotecas thermistor.h e a LiquidCrystal.h, através do gestor de bibliotecas do software do Arduino.

Estas bibliotecas facilitam muito a programação, pois contêm comandos e funções criadas especificamente para determinados componentes.

Assim a biblioteca thermistor.h permite-nos com apenas função configurar o sensor de temperatura.

#include "thermistor.h"	//Importar a "thermistor" library

//Esta função define:
THERMISTOR SENSOR (Pino_Sensor, 10000, 3950, 10000);

	//Pino de entrada do sensor;
	//Resistência nominal a 25ºC do sensor;
	//Coeficiente beta do sensor;
	//Valor da resistência do sensor.

Para realizar a leitura do sensor de temperatura, utilizamos o comando "sensor.read()", devolvendo o valor relativo à temperatura em ºC, no entanto, esse valor não tem casas decimais o que obriga a um pequeno calculo. Não esquecer que para utilizar variáveis com casas decimais, estas variáveis terão de ser declaradas como "float".

void loop(){
	//Leitura do sensor de temperatura.
	Valor_Temp = sensor.read();
	//Calculo do valor da temperatura com casas decimais.
	Valor_Temp= Valor_Temp/10;
}

A biblioteca LiquidCrystal.h também facilita a configuração do LCD, nesta biblioteca são apenas necessárias 2 funções para que o LCD funcione correctamente.

Assim para escrever no LCD é necessário em primeiro lugar definir o local onde se começará a colocar os caracteres, ou seja, a coluna e a linha, depois imprimimos o texto que queremos, tendo em atenção que este LCD apenas tem 16colunas e 2linhas, caso o texto passe esses limites os caracteres não ficarão visíveis.

//Definir os pinos de comunicação e informação do LCD:
LiquidCrystal lcd ("RS", "E", "D7", "D6", "D5", "D4");

e

void setup(){
	//Inicia a comunicação com LCD 16x2:
	lcd.begin(2, 16);
}
void loop(){

	//Define a coluna (em 16) e a linha (em 2) do LCD onde escrever:
	lcd.setCursor(0, 0);
	//Escreve no LCD:
	lcd.print("Temperatura:");
}

Agora só falta colocar o código para realizar as leituras com o sensor de ultrasons, a informação vinda do sensor é fornecida ao Arduino através dos 2pinos digitais, tendo cada um deles uma função distinta, funcionando um como saída e o outro como entrada.

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup(){

	//Definição do tipo de pino (Saída ou entrada):
	pinMode(Pino_Trig, OUTPUT);
	//Definição do tipo de pino (Saída ou entrada):
	pinMode(Pino_Echo, INPUT);
}

Este sensor em cada leitura contem 2momentos distintos, o momento em que o sensor envia um sinal acústico e outro momento em que recebe o eco desse mesmo sinal. Para isso é necessário activar a leitura, colocando em nível alto o pino de entrada digitalTrigger, que tem de estar nessa condição pelo menos 10µ segundos. É aconselhado que exista uma pequena pausa entre leituras para isso deve ser colocado 5µ segundos em nível baixo (Ver gráfico acima).

De seguida, realiza-se a contagem de tempo e os seus respectivos cálculos, para isso utilizamos a função "PulseIn" que contabiliza o tempo em que um pino Echo está em nível alto. Depois como o tempo contabilizado pela função "PulseIn" é o tempo que o sinal acústico demora no percurso entre o sensor até ao objecto e o seu regresso o tempo será sensivelmente o dobro do desejado, ou seja, apenas nos interessa metade do percurso logo é necessário dividir esse tempo por 2 (Ver cálculos acima).

//Correr a função LOOP repetidamente:
void loop(){

	//Processo de funcionamento do sensor de Ultrasons:

	//Pausa entre leituras.
	digitalWrite(Pino_Trig,LOW);	//Desligar a pulsação ultrasónica;
	delayMicroseconds(5);	//Pausa de 5 microsegundos para estabilização;

	//Início da leitura.
	digitalWrite(Pino_Trig, HIGH);	//Ligar a pulsação ultrasónica;
	delayMicroseconds(10);	//Pausa de 10 microsegundos para estabilização;

	//Contagem em microsegundos do Tempo entre o envio e a recepção do sinal enviado.
	Tempo = pulseIn(Pino_Echo, HIGH);
	//Cálculo da conversão do Tempo de microsegundos para segundos.
	Tempo = Tempo / 1000000;

	//Cálculo do valor da distância medida.
	Valor_Distancia = Velocidade_Som / 2;
	Valor_Distancia = Valor_Distancia * Tempo;
}

Por fim para que possamos verificar a carga da bateria colocamos na página inicial a percentagem referente à tensão que a bateria tem nesse momento. Assim, como a bateria é de 9V e as entradas analógica do Arduino só suportam até 5V, sendo este valor correspondente a 1023, optamos por aplicar um divisor de tensão, sendo o valor máximo aplicado no pino de entrada analógica do Arduino cerca de 4,5V.

No entanto, como 4,5V não seria 1023, foi necessário realizar alguns cálculos para que este 4,5V, ou seja, como a bateria no máximo de sua carga correspondesse a 100% de carga (Ver cálculos acima).

Como este artigo já vai um pouco longo, podem encontrar o ficheiro com o código completo e que estamos a utilizar actualmente (Ver ficheiro abaixo).

Procurem os nossos outros projectos e tutoriais acerca do Arduino, onde explicamos diversas montagens e o funcionamento dos seus componentes, já agora visitem o nosso canal no Youtube, Instagram, Facebook ou Twitter.
Abraço e bons projectos.

Microcontroller Contest

Participated in the
Microcontroller Contest