Trena e Nível Digital

Trena e Nível Digital Deixe um comentário

Chegamos na 8ª edição da BlueBox! O projeto que escolhemos para essa edição é uma ferramenta essencial para todo maker: vamos construir uma trena e nível digital usando um Arduino, um sensor ultrassônico HC-SR04 e um acelerômetro e giroscópio MPU-6050.

A trena é capaz de medir distâncias de até 4 metros e o nível mede ângulos nos eixos X e Y.

Trena e Nível Digital

Você pode usar a trena e nível digital como uma ferramenta em seus projetos, para medir o distanciamento social durante a pandemia ou até mesmo para brincar com o seu gato. Gostou do projeto?

Materiais Necessários

Trena e Nível Digital

Para montar sua trena e nível digital você precisar dos seguintes componentes:

Além disso, você vai precisar de algumas ferramentas extras:

Código

Antes de começar a montagem do circuito, vamos carregar o código para o Arduino Nano. Primeiro, copie o código abaixo e cole na Arduino IDE.

//Bibliotecas
#include<Wire.h>
#include <LiquidCrystal.h>

// Pinos
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int MPU = 0x68;
#define trigPin 8
#define echoPin 9
#define selectButton 10
#define laserPin 11

// Variáveis
int16_t AcX, AcY, AcZ;
long duration;
float distance;
int program = 0;
float d = 0;
float d1 = 0;
float d2 = 0;
int axis = 0;
int angle = 0;
int unitSelect = 0;
String unit = "cm";

void setup() {

// Inicialização MPU6050
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);

// Inicialização LCD 16x2
lcd.begin(16, 2);

// Inicialização HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

// Inicialização Push-Button
pinMode(selectButton, INPUT_PULLUP);

// Inicialização Laser
pinMode(laserPin, OUTPUT);

}

void loop() {

switch (program) {

//Programa de seleção da unidade de medida
case 0:
lcd.setCursor(0, 0);
lcd.print("Selecione a ");
lcd.setCursor(0, 1);
lcd.print("unidade: ");
lcd.setCursor(13, 1);
lcd.print(unit);
lcd.print(" ");
delay(10);
if (digitalRead(selectButton) == 0) {
if (unitSelect == 0) {
unit = "cm";
unitSelect = 1;
}
else if (unitSelect == 1) {
unit = "m";
unitSelect = 0;
}
// Se o botão for pressionado por mais de meio segundo - mudar o programa
delay(500);
if (digitalRead(selectButton) == 0) {
program = 1;
lcd.clear();
delay(500);
}
}
break;

//Programa de medição de distância
case 1:
digitalWrite(laserPin, HIGH);
distance = getDistance();
lcd.setCursor(0, 0);
lcd.print("Dist: ");
lcd.print(distance);
lcd.print(" ");
lcd.setCursor(14, 0);
lcd.print(unit);
delay(10);
lcd.setCursor(0, 1);
lcd.print("d:");
lcd.setCursor(8, 1);
lcd.print("d:");
delay(200);

// Salva a distância 1
if (digitalRead(selectButton) == 0) {
if (d == 0) {
lcd.setCursor(0, 1);
lcd.print("d: ");
lcd.setCursor(2, 1);
lcd.print(distance);
d = 1;
delay(100);
}
// Salva a distância 2
else if (d == 1) {
lcd.setCursor(8, 1);
lcd.print("d: ");
lcd.setCursor(10, 1);
lcd.print(distance);
d = 0;
delay(100);
}
// Se o botão for pressionado por mais de meio segundo - mudar o programa
delay(500);
if (digitalRead(selectButton) == 0) {
program = 2;
d = 0;
lcd.clear();
delay(500);
}
}
break;

// Programa de medição de ângulo
case 2:
digitalWrite(laserPin, LOW);
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
AcX = Wire.read() << 8 | Wire.read();
AcY = Wire.read() << 8 | Wire.read();
AcZ = Wire.read() << 8 | Wire.read();

if ( axis == 0) {
// Cálculo do ângulo de inclinação
angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
lcd.setCursor(0, 0);
lcd.print("Inclinacao");
}
else if (axis == 1) {
// Calculo do ângulo de rotação
angle = atan(-1 * AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 / PI;
lcd.setCursor(0, 0);
lcd.print("Rotacao");
}
lcd.setCursor(0, 1);
lcd.print("Angulo: ");
lcd.print(abs(angle));
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(" graus");
delay(200);

if (digitalRead(selectButton) == 0) {
if (axis == 0) {
axis = 1;
delay(100);
}

else if (axis == 1) {
axis = 0;
delay(100);
}
//Se o botão for pressionado por mais de meio segundo - mudar o programa
delay(500);
if (digitalRead(selectButton) == 0) {
program = 0;
lcd.clear();
delay(500);
}
}
break;
}
}

// Função para medição de distância
float getDistance() {
digitalWrite(trigPin, LOW);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; //distância em cm

// Conversão de unidades
if (unitSelect == 0) {
distance = distance; // cm para cm
unit = "cm";
}
else if (unitSelect == 1) {
distance = distance * 0.01; // cm para m
unit = "m";
}
return distance;
}

Conecte o Arduino no computador utilizando o cabo USB. Vá em Ferramentas > Placa e selecione Arduino Nano. Em seguida, vá em Ferramentas > Porta e selecione a porta na qual a placa está conectada. Agora você já pode carregar o código para a placa.

OBS: Se nesse processo ocorrer algum erro, vá mais uma vez em Ferramentas, clique em processador, selecione ATMega 328P (Old Bootloader) e carregue novamente o código para a placa.

Solda dos Componentes

Primeiro, vamos soldar a barra de pinos 90 graus no display LCD. Como o display possui 16 pads, vamos precisar usar apenas 16 pinos da barra. Você pode separar os pinos usando um alicate ou até mesmo com a mão. Encaixe a barra de pinos no display como mostra a imagem abaixo, com os pinos em 90 graus virados para a parte de dentro do display. Depois solde cada um dos pads.

Trena e Nível Digital

O MPU-6050 acompanha duas barras de pinos. Vamos soldar a barra de 180 graus.

Trena e Nível Digital

Para facilitar a montagem, vamos soldar conectores machos nas pontas dos cabos do conector de bateria e no diodo laser. Separe dois jumpers macho-macho e faça um corte de 3 cm acima de cada conector. Corte o termo retrátil em 4 partes e insira cada uma das partes nos conectores machos dos jumpers. Decape os fios e depois solde no conector de bateria e no diodo laser.

Trena e Nível Digital

Corte ao meio um jumper macho-macho, decape as pontas e solde nos conectores da mini chave push-button.

Trena e Nível Digital

Circuito

Agora podemos conectar todos os componentes no Arduino Nano. Você deve seguir o esquemático abaixo:

Trena e Nível Digital

As conexões são as seguintes:

ARDUINODISPLAY LCD 16×2ACELERÔMETRO MPU-6050ULTRASSôNICO HC-SR04DIODO LASERMINI PUSH-BUTTONRESISTOR 1KRESISTOR 1 KRESISTOR 220BATERIA 9V
5VPINO 2, PINO 15VCCVCCTERMINAL 1TERMINAL 1
GNDPINO 1, PINO 5, PINO 16GNDGNDPINO AZULTERMINAL 1TERMINAL 1PINO PRETO
VINPINO VERMELHO
D2PINO 14
D3PINO 13
D4PINO 12
D5PINO 11
D6PINO 6
D7PINO 4
D8PINO TRIG
D9PINO ECHO
D10TERMINAL 2TERMINAL 2
D11PINO VERMELHO
A4SDA
A5SCL
PINO 3TERMINAL 2TERMINAL 2

Montagem

Agora só precisamos montar nossa trena e nível digital. Passe todo o circuito pelo meio da case. Cole a protoboard na tampa inferior, de modo que ela fique posicionada bem abaixo do suporte para o sensor ultrassônico.

Trena e Nível Digital

Com ajuda dos jumpers conectados no sensor ultrassônico, dobre os pinos até que eles fiquem a um ângulo de 90 graus com a placa. Encaixe o sensor ultrassônico na case. Depois encaixe o diodo laser.

Trena e Nível Digital

Insira a bateria de 9 V no suporte e cole o suporte na case de modo que o botão de liga e desliga fique acessível.

Trena e Nível Digital

Encaixe o display LCD na tampa superior e também faça a conexão da mini chave push-button.

Trena e Nível Digital

Com tudo encaixado, é só fechar a case e nossa trena e nível digital está pronta. Talvez você precise apertar um pouco os fios para que a case encaixe com mais facilidade.

Funcionamento

Ao ligar, você terá que escolher a unidade de medida que irá utilizar: centímetros ou metros. O clique rápido permite mudar a unidade e o clique longo faz a seleção. Logo depois, você entra no programa de medida de distância. O clique curto permite gravar duas distâncias e o longo passa para o programa de medida de ângulo, que verifica a angulação dos eixos X e Y.

Trena e Nível Digital

Gostou da trena e nível digital? Conte o que achou da 8ª edição da BlueBox e não esqueça de marcar a gente nas redes sociais!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *