Proyecto de telémetro Arduino y nivel de burbuja digital

Imagínate tener la capacidad de medir distancias con precisión y nivelar objetos de manera totalmente automatizada. Con el proyecto de telémetro Arduino y nivel de burbuja digital, esto es posible. Acompáñanos para conocer cómo puedes hacer tu propio dispositivo utilizando tecnología accesible y fácil de programar.

En este tutorial aprenderemos cómo hacer un telémetro Arduino y un nivel de burbuja digital. Puede ver el vídeo a continuación o leer el tutorial escrito a continuación.

descripción general

El dispositivo tiene un sensor ultrasónico para medir la distancia al objeto más cercano, un acelerómetro para medir el ángulo con el suelo, una pantalla LCD para mostrar los resultados y una placa de circuito especialmente diseñada en la que están conectados todos los componentes.

Podemos manejar el dispositivo con un solo botón. Una vez que encendamos el dispositivo, debemos seleccionar la unidad de medida.

Proyecto de telémetro Arduino y nivel de burbuja digital

Pulsando>

Proyecto de telémetro Arduino y nivel de burbuja digital

Para>

Proyecto de telémetro Arduino y nivel de burbuja digital

El>

Proyecto de telémetro Arduino y nivel de burbuja digital

Con>

Diagrama del circuito del telémetro Arduino

Aquí está el esquema de este proyecto Arduino.

Proyecto de telémetro Arduino y nivel de burbuja digital

Tenga>

Puede obtener los componentes necesarios para este proyecto a través de los siguientes enlaces:

  • Sensor ultrasónico HC-SR04……………………………… Amazon / Banggood / AliExpress
  • Acelerómetro giroscópico de 3 ejes MPU6050……… Amazon / Banggood / AliExpress
  • LCD de 16×2 caracteres………………………………………… Amazon / Banggood / AliExpress
  • Arduino Nano…………………………………………………… Amazon / Banggood / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

PCB personalizado

Según el esquema, necesitamos diseñar la PCB personalizada y eso es lo que hice con eso. FácilEDA Software gratuito de diseño de circuitos en línea.

Proyecto de telémetro Arduino y nivel de burbuja digital

Una>Archivos de proyecto EasyEDA de este proyecto aquí.

Entonces podemos Solicite nuestra PCB de JLCPCBquien es realmente el patrocinador de este proyecto.

Proyecto de telémetro Arduino y nivel de burbuja digital

Aquí>

Proyecto de telémetro Arduino y nivel de burbuja digital

Montaje del dispositivo

Sin embargo, las tablas llegaron al cabo de unos días. La calidad de las tablas es excelente y todo coincide exactamente con el diseño.

Proyecto de telémetro Arduino y nivel de burbuja digital

Bien,>

Proyecto de telémetro Arduino y nivel de burbuja digital

Luego>

A continuación, me puse a hacer la carcasa del dispositivo. Elegí acrílico transparente porque quería que la belleza de todos los componentes electrónicos fuera visible. Tenía una lámina acrílica de 5 mm de espesor de un proyecto anterior y usé una herramienta circular para cortarla al tamaño adecuado.

Proyecto de telémetro Arduino y nivel de burbuja digital

Luego>

Proyecto de telémetro Arduino y nivel de burbuja digital

Luego>

Proyecto de telémetro Arduino y nivel de burbuja digital

Después>

Proyecto de telémetro Arduino y nivel de burbuja digital

El>

Proyecto de telémetro Arduino y nivel de burbuja digital

Finalmente>

Proyecto de telémetro Arduino y nivel de burbuja digital

En>

Proyecto de telémetro Arduino y nivel de burbuja digital

Y>

Código fuente para telémetro Arduino y nivel de burbuja digital

Dado que el código es un poco más largo, para una mejor comprensión publicaré el código fuente del programa en secciones con una descripción para cada sección. Y al final de este artículo publicaré el código fuente completo.

Por lo tanto, primero debemos incluir la biblioteca Wire.h para la comunicación I2C del acelerómetro, así como la biblioteca LiquidCrystal.h para controlar la pantalla LCD. Luego necesitamos definir la pantalla LCD, la dirección I2C del módulo acelerómetro MPU6050, los pines del sensor ultrasónico y algunas variables necesarias para el siguiente programa.

#include<Wire.h> // I2C communication library
#include <LiquidCrystal.h> // includes the LiquidCrystal Library

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
const int MPU = 0x68; // I2C address of the MPU6050 accelerometer

#define trigPin 8
#define echoPin 9
#define selectButton 10

int16_t AcX, AcY, AcZ;
long duration;
float distance;
int program = 0;
float d = 0;
float d1 = 0;
float d2 = 0;
float area = 0;
int axis = 0;
int angle = 0;
int unitSelect = 0;
String unit = "cm";Code language: Arduino (arduino)

En la sección de configuración, necesitamos inicializar tanto la interfaz I2C del acelerómetro como la pantalla de cristal líquido, así como definir los modos de pin para los pines de gatillo y eco del sensor ultrasónico, así como el pin del botón.

void setup() {
  // Initialize interface to the MPU6050
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);

  lcd.begin(16, 2); // Initializes the interface to the LCD screen
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}Code language: Arduino (arduino)

En la sección del bucle principal tenemos sentencias switch que nos permiten cambiar entre los diferentes programas de nuestro dispositivo. En el primero o caso #0 elegimos la unidad de medida. Usamos la función “lcd.print()” para imprimir el texto en la pantalla LCD y usamos las declaraciones if para cambiar entre las cuatro unidades de medida.

switch (program) {  // Switch between different programs
    case 0:  // Select unit of measurement
      lcd.setCursor(0, 0); // Sets the location at which subsequent text written to the LCD will be displayed
      lcd.print("Select Unit: ");
      lcd.setCursor(13, 0);
      lcd.print(unit);
      lcd.print("  ");
      delay(10);
      // If button is pressed - change unit
      if (digitalRead(selectButton) == 0) {
        if (unitSelect == 0) {
          unit = "in";
          unitSelect = 1;
        }
        else if (unitSelect == 1) {
          unit = "m";
          unitSelect = 2;
        }
        else if (unitSelect == 2) {
          unit = "ft";
          unitSelect = 3;
        }
        else if (unitSelect == 3) {
          unit = "cm";
          unitSelect = 0;
        }
        // If button is held longer then half a second - change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 1;
          lcd.clear();
          delay(500);
        }
      }
      break;Code language: Arduino (arduino)

Debemos tener en cuenta aquí que la variable «unitSelect» se activa en la función «getDistance()» de Cunstom donde en realidad indica a qué unidad debemos convertir la unidad base cm que obtenemos del sensor ultrasónico.

/ Converting the units
  if (unitSelect == 1) {
    distance = distance; // cm to cm
    unit = "cm";
  }
  else if (unitSelect == 2) {
    distance = distance *  0.393701; // cm to in
    unit = "in";
  }
  else if (unitSelect == 3) {
    distance = distance * 0.01; // cm to m
    unit = "m";
  }
  else if (unitSelect == 0) {
    distance = distance * 0.0328; // cm to ft
    unit = "ft";
  }Code language: Arduino (arduino)

Para seleccionar la unidad de medida y además entrar en el primer programa del dispositivo tan solo tendremos que mantener pulsado el pulsador durante más de medio segundo.

// If button is held longer then half a second - change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 1;
          lcd.clear();
          delay(500);
        }
      }
      break;Code language: Arduino (arduino)

En el caso número 1 o en el programa de medición de distancias, primero encontramos la distancia al objeto más cercano usando la función personalizada getDistance().

case 1:   // Distance measuring program
      distance = getDistance(); // Distance to the nearest object
      lcd.setCursor(0, 0);
      lcd.print("Dist: ");
      lcd.print(distance); // Prints the distance value from the sensor
      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);
      // Save distance 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);
        }
        // Save distance 2
        else if (d == 1) {
          lcd.setCursor(8, 1);
          lcd.print("d:     ");
          lcd.setCursor(10, 1);
          lcd.print(distance);
          d = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 2;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;Code language: Arduino (arduino)

Veamos cómo funciona esta característica.

//===== getDistance - Custom Function
float getDistance() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance = duration * 0.034 / 2; // distance in cm
  
  // Converting the units
  if (unitSelect == 1) {
    distance = distance; // cm to cm
    unit = "cm";
  }
  else if (unitSelect == 2) {
    distance = distance *  0.393701; // cm to in
    unit = "in";
  }
  else if (unitSelect == 3) {
    distance = distance * 0.01; // cm to m
    unit = "m";
  }
  else if (unitSelect == 0) {
    distance = distance * 0.0328; // cm to ft
    unit = "ft";
  }
  return distance;
}Code language: Arduino (arduino)

Aquí le indicamos al sensor que genere una onda ultrasónica usando el pasador del gatillo.

Proyecto de telémetro Arduino y nivel de burbuja digital

Luego>

Luego viene el programa de cálculo de áreas, en el que utilizamos métodos similares. Necesitamos tomar dos medidas perpendiculares y simplemente multiplicarlas para obtener el área del cuadrado que forman.

case 2:   // Area measuring program
      distance = getDistance();
      lcd.setCursor(0, 0);
      lcd.print("Area: ");
      lcd.print(area); // Prints the calculated area from the two measurements
      lcd.setCursor(12, 0);
      lcd.print(unit); // Prints the selected unit and the square sign below
      lcd.print("^2");
      delay(200);
      if ( d == 0) {
        lcd.setCursor(0, 1);
        lcd.print("d1:       ");
        lcd.setCursor(3, 1);
        lcd.print(distance);
        delay(200);
      }
      else if (d == 1) {
        lcd.setCursor(9, 1);
        lcd.print("d2:      ");
        lcd.setCursor(12, 1);
        lcd.print(distance);
        delay(200);
      }
      else if (d == 2) {
        lcd.setCursor(6, 0);
        lcd.print(area);
        delay(200);
      }
      // Save distance 1
      if (digitalRead(selectButton) == 0) {
        if (d == 0) {
          lcd.setCursor(0, 1);
          lcd.print("d1:    ");
          lcd.setCursor(3, 1);
          lcd.print(distance);
          d = 1;
          d1 = distance;
          delay(100);
        }
        // Save distance 2
        else if (d == 1) {
          lcd.setCursor(9, 1);
          lcd.print("d2:    ");
          lcd.setCursor(12, 1);
          lcd.print(distance);
          d = 2;
          d2 = distance;
          area = d1 * d2; // Calculate the area
          delay(100);
        }
        else if (d == 2) {
          lcd.clear();
          d = 0;
          area = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 3;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;Code language: Arduino (arduino)

El último caso es el programa de medición de ángulos. Aquí necesitamos leer los datos del acelerómetro, que en realidad representan la fuerza del campo gravitacional de la Tierra en tres ejes diferentes, X, Y y Z. El valor de cada eje se almacena en 2 registros, por lo que necesitamos leer un total de 6 registros y combinarlos para obtener el valor correcto.

case 3:    // Angle measuring program
      // Read the accelerometer data
      Wire.beginTransmission(MPU);
      Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
      AcX = Wire.read() << 8 | Wire.read(); // X-axis value
      AcY = Wire.read() << 8 | Wire.read(); // Y-axis value
      AcZ = Wire.read() << 8 | Wire.read(); // Z-axis value
     
      if ( axis == 0) {
        // Calculating the Pitch angle (rotation around Y-axis)
        angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Pitch");
      }
      else if (axis == 1) {
        // Calculating the Roll angle (rotation around X-axis)
        angle = atan(-1 * AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Roll ");
      }
      lcd.setCursor(0, 1);
      lcd.print("Angle: ");
      lcd.print(abs(angle));
      lcd.print("     ");
      lcd.setCursor(10, 1);
      lcd.print("deg");
      delay(200);

      // Change axis
      if (digitalRead(selectButton) == 0) {
        if (axis == 0) {
          axis = 1;
          delay(100);
        }
        // Save distance 2
        else if (axis == 1) {
          axis = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;Code language: Arduino (arduino)

Una vez que tengamos los valores X, Y y Z del acelerómetro, podemos usar las dos ecuaciones para calcular el ángulo de paso, o rotación alrededor del eje Y, y el ángulo de balanceo, o rotación alrededor del eje X. Para obtener más detalles sobre estas ecuaciones, consulte la nota de aplicación de Freescale Semiconductor. Detección de inclinación mediante un acelerómetro de tres ejes. Después de eso imprimimos los valores junto con algo de texto en la pantalla LCD, y al presionar el botón cambiamos lo que mostramos en la pantalla LCD, ya sea el ángulo de cabeceo o balanceo.

Aquí está el código fuente completo para este proyecto de nivel de burbuja y telémetro Arduino:

/*
  DIY Digital Range Measurer and Spirit Level

  by Dejan Nedelkovski,
  www.HowToMechatronics.com

*/
#include<Wire.h> // I2C communication library
#include <LiquidCrystal.h> // includes the LiquidCrystal Library

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
const int MPU = 0x68; // I2C address of the MPU6050 accelerometer

#define trigPin 8
#define echoPin 9
#define selectButton 10

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

void setup() {
  // Initialize interface to the MPU6050
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);

  lcd.begin(16, 2); // Initializes the interface to the LCD screen
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}
void loop() {
  switch (program) {  // Switch between different programs
    case 0:  // Select unit of measurement
      lcd.setCursor(0, 0); // Sets the location at which subsequent text written to the LCD will be displayed
      lcd.print("Select Unit: ");
      lcd.setCursor(13, 0);
      lcd.print(unit);
      lcd.print("  ");
      delay(10);
      // If button is pressed - change unit
      if (digitalRead(selectButton) == 0) {
        if (unitSelect == 0) {
          unit = "in";
          unitSelect = 1;
        }
        else if (unitSelect == 1) {
          unit = "m";
          unitSelect = 2;
        }
        else if (unitSelect == 2) {
          unit = "ft";
          unitSelect = 3;
        }
        else if (unitSelect == 3) {
          unit = "cm";
          unitSelect = 0;
        }
        // If button is held longer then half a second - change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 1;
          lcd.clear();
          delay(500);
        }
      }
      break;
      
    case 1:   // Distance measuring program
      distance = getDistance(); // Distance to the nearest object
      lcd.setCursor(0, 0);
      lcd.print("Dist: ");
      lcd.print(distance); // Prints the distance value from the sensor
      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);
      // Save distance 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);
        }
        // Save distance 2
        else if (d == 1) {
          lcd.setCursor(8, 1);
          lcd.print("d:     ");
          lcd.setCursor(10, 1);
          lcd.print(distance);
          d = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 2;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;

    case 2:   // Area measuring program
      distance = getDistance();
      lcd.setCursor(0, 0);
      lcd.print("Area: ");
      lcd.print(area); // Prints the calculated area from the two measurements
      lcd.setCursor(12, 0);
      lcd.print(unit); // Prints the selected unit and the square sign below
      lcd.print("^2");
      delay(200);
      if ( d == 0) {
        lcd.setCursor(0, 1);
        lcd.print("d1:       ");
        lcd.setCursor(3, 1);
        lcd.print(distance);
        delay(200);
      }
      else if (d == 1) {
        lcd.setCursor(9, 1);
        lcd.print("d2:      ");
        lcd.setCursor(12, 1);
        lcd.print(distance);
        delay(200);
      }
      else if (d == 2) {
        lcd.setCursor(6, 0);
        lcd.print(area);
        delay(200);
      }
      // Save distance 1
      if (digitalRead(selectButton) == 0) {
        if (d == 0) {
          lcd.setCursor(0, 1);
          lcd.print("d1:    ");
          lcd.setCursor(3, 1);
          lcd.print(distance);
          d = 1;
          d1 = distance;
          delay(100);
        }
        // Save distance 2
        else if (d == 1) {
          lcd.setCursor(9, 1);
          lcd.print("d2:    ");
          lcd.setCursor(12, 1);
          lcd.print(distance);
          d = 2;
          d2 = distance;
          area = d1 * d2; // Calculate the area
          delay(100);
        }
        else if (d == 2) {
          lcd.clear();
          d = 0;
          area = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 3;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;

    case 3:    // Angle measuring program
      // Read the accelerometer data
      Wire.beginTransmission(MPU);
      Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
      AcX = Wire.read() << 8 | Wire.read(); // X-axis value
      AcY = Wire.read() << 8 | Wire.read(); // Y-axis value
      AcZ = Wire.read() << 8 | Wire.read(); // Z-axis value
     
      if ( axis == 0) {
        // Calculating the Pitch angle (rotation around Y-axis)
        angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Pitch");
      }
      else if (axis == 1) {
        // Calculating the Roll angle (rotation around X-axis)
        angle = atan(-1 * AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Roll ");
      }
      lcd.setCursor(0, 1);
      lcd.print("Angle: ");
      lcd.print(abs(angle));
      lcd.print("     ");
      lcd.setCursor(10, 1);
      lcd.print("deg");
      delay(200);

      // Change axis
      if (digitalRead(selectButton) == 0) {
        if (axis == 0) {
          axis = 1;
          delay(100);
        }
        // Save distance 2
        else if (axis == 1) {
          axis = 0;
          delay(100);
        }
        // If button is held longer then half sencond change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
  }
}

//===== getDistance - Custom Function
float getDistance() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance = duration * 0.034 / 2; // distance in cm
  
  // Converting the units
  if (unitSelect == 1) {
    distance = distance; // cm to cm
    unit = "cm";
  }
  else if (unitSelect == 2) {
    distance = distance *  0.393701; // cm to in
    unit = "in";
  }
  else if (unitSelect == 3) {
    distance = distance * 0.01; // cm to m
    unit = "m";
  }
  else if (unitSelect == 0) {
    distance = distance * 0.0328; // cm to ft
    unit = "ft";
  }
  return distance;
}Code language: Arduino (arduino)

Eso es todo. Espero que hayas disfrutado este proyecto Arduino y hayas aprendido algo nuevo. No dude en hacer sus preguntas en la sección de comentarios a continuación.

Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Proyecto de telémetro Arduino y nivel de burbuja digital

En este tutorial aprenderemos cómo hacer un telémetro Arduino y un nivel de burbuja digital. El dispositivo cuenta con un sensor ultrasónico para medir la distancia al objeto más cercano, un acelerómetro para medir el ángulo con respecto al suelo, una pantalla LCD para mostrar los resultados y una PCB diseñada a medida en la que todos los componentes están conectados.

Operamos el dispositivo con solo un botón. Una vez que encendemos el dispositivo, necesitamos seleccionar la unidad de medida. Al presionar el botón, podemos alternar entre las unidades, y si presionamos y mantenemos presionado el botón durante un tiempo, ingresaremos al primer programa. Aquí podemos medir la distancia y también tenemos la capacidad de almacenar las últimas dos mediciones.

Para ingresar al segundo programa, nuevamente debemos presionar y mantener presionado el botón durante un tiempo. En este programa podemos medir un área cuadrada tomando dos mediciones perpendiculares.

El siguiente programa es el nivel de burbuja digital y aquí podemos medir el ángulo con respecto al suelo. Usando el botón, podemos alternar entre los dos ejes o podemos medir tanto el Pitch como el Roll.

Esquemático del circuito del telémetro Arduino

Aquí está el esquemático del circuito de este proyecto de Arduino. Tenga en cuenta que ya tengo tutoriales detallados sobre cómo funcionan cada uno de estos módulos, y puede consultarlos en los siguientes enlaces: tutorial del sensor ultrasónico, tutorial de LCD, tutorial de acelerómetro MEMS.

Puede obtener los componentes necesarios para este proyecto en los siguientes enlaces:
– Sensor ultrasónico HC-SR04 …………………… Amazon / Banggood / AliExpress
– MPU6050 Giroscopio acelerómetro de 3 ejes …… Amazon / Banggood / AliExpress
– LCD de caracteres 16×2 ………………………………… Amazon / Banggood / AliExpress
– Arduino Nano …………………………………………………… Amazon / Banggood / AliExpress

Placa de circuito impreso personalizada

De acuerdo con el esquemático del circuito, necesitamos diseñar la PCB personalizada y lo hice usando el software de diseño de circuitos en línea EasyEDA. Una vez que terminamos el diseño aquí, podemos exportar el archivo Gerber que se utiliza para fabricar la PCB. Puede consultar los archivos de proyecto EasyEDA de este proyecto aquí.

Luego podemos pedir nuestra PCB a JLCPCB, que es el patrocinador de este proyecto. Aquí podemos simplemente arrastrar y soltar el archivo Gerber. Una vez cargado, podemos ver nuestra PCB en el visor de Gerber. Si todo está bien, podemos seleccionar las propiedades que queremos para nuestra PCB y luego podemos pedir nuestra PCB a un precio razonable. Tenga en cuenta que si es tu primer pedido en JLCPCB, puedes obtener hasta 10 PCB por solo $2.

Ensamblaje del dispositivo

Después de varios días, han llegado las PCB. La calidad de las PCB es excelente y todo es exactamente igual que en el diseño.

Ok, ahora podemos comenzar a ensamblar la electrónica para este proyecto. Empecé soldando pines en la PCB. De esta manera podemos conectar y desconectar fácilmente los componentes cuando sea necesario.

Luego inserté y soldé los tres resistores. Dos de ellos son para el divisor de voltaje para el contraste del LCD. El resistor de 1k debe colocarse en R1 y el de 220 ohmios en R2. El tercero es un resistor de pull-up para el botón.

Luego continué haciendo la caja para el dispositivo. Decidí usar acrílico transparente porque quería que la belleza de todos los componentes electrónicos fuera visible. Tenía acrílico de 5 mm de espesor de un proyecto anterior, y utilicé una sierra circular para cortarlo a medida.

Luego hice una abertura para el LCD en la parte superior de la caja, que en realidad es de 4 mm de espesor porque encajará mejor con el LCD. Así que primero hice dos agujeros con un taladro e inserté una sierra de arco a través de ellos. Usando la sierra, hice una apertura aproximada y luego con una lima hice líneas rectas finas para que el LCD pueda encajar perfectamente.

Luego, usando una broca forstner, hice las aberturas para el interruptor de encendido, el botón de control y el sensor ultrasónico.

Una vez que tuve todas las piezas listas, utilicé un epoxy de 5 minutos para ensamblar la caja. En cuanto a la parte superior, inserté y pegué dos pernos a través de los cuales se puede insertar el panel superior y fijarlo utilizando algunas tuercas en la parte superior.

La caja está lista y continué soldando pines al LCD para que pueda conectarlo fácilmente a la PCB. También solté pines o cables puente al interruptor de encendido, el botón y el conector de la batería.

Finalmente, tenía todo listo para ensamblar el dispositivo. Comencé insertando el sensor ultrasónico en la PCB, y luego a través de los agujeros en el panel lateral. Luego fue la placa Arduino, el módulo acelerómetro y el conector de la batería.

En el panel superior, fijé el LCD, el interruptor de encendido y el botón, y luego los conecté a la PCB. Por último, inserté la batería de 9V al conector y fijé el panel superior con las tuercas.

Y eso es todo, el proyecto del telémetro Arduino está terminado, pero lo que queda en este video es explicar cómo funciona el programa, así que vamos a echar un vistazo al código de Arduino.

Código fuente del telémetro Arduino y nivel de burbuja digital

Como el código es un poco más largo, para una mejor comprensión, publicaré el código fuente del programa en secciones con la descripción de cada sección. Y al final de este artículo postearé el código fuente completo.

En el código, necesitamos incluir la librería Wire.h para la comunicación I2C del acelerómetro, así como la librería LiquidCrystal.h para controlar el LCD. Luego necesitamos definir el LCD, la dirección I2C del módulo acelerómetro MPU6050, los pines del sensor ultrasónico, así como algunas variables necesarias para el programa a continuación.

  • Sensores ultrasónicos HC-SR04
  • MPU6050 Giroscopio Acelerómetro de 3 Ejes
  • LCD de Caracteres 16×2
  • Arduino Nano

Configuración del telémetro Arduino

En la sección de configuración, necesitamos inicializar tanto la interfaz I2C del acelerómetro como la pantalla de cristal líquido, así como definir los modos de los pines del sensor ultrasónico y los botones.

La función principal del bucle tiene una declaración switch a través de la cual podemos alternar entre los diferentes programas de nuestro dispositivo. En el primer caso, o en el número de programa 0, seleccionamos la unidad de medida. Mediante la función lcd.print() imprimimos el texto en el LCD y mediante las instrucciones if alternamos entre las cuatro unidades de medida.

En caso de seleccionar la unidad de medida y también al ingresar al primer programa del dispositivo, solo tenemos que mantener presionado el botón más de medio segundo.

En el caso número 1 o en el programa de medición de distancia, primero obtenemos la distancia al objeto más cercano utilizando la función personalizada getDistance(). Mostramos la distancia medida junto con un texto en el LCD y, al presionar el botón, imprimimos o guardamos las dos últimas mediciones.

Código fuente completo

Aquí está el código fuente completo para este proyecto de telémetro y nivel de burbuja digital de Arduino:

«`arduino
// Código fuente del proyecto
«`

¡Espero que hayas disfrutado de este proyecto de Arduino y hayas aprendido algo nuevo! Si tienes alguna pregunta, no dudes en dejar un comentario.

1 comentario en «Proyecto de telémetro Arduino y nivel de burbuja digital»

Deja un comentario