Tabla de contenido:

Brújula digital y buscador de rumbo: 6 pasos
Brújula digital y buscador de rumbo: 6 pasos

Video: Brújula digital y buscador de rumbo: 6 pasos

Video: Brújula digital y buscador de rumbo: 6 pasos
Video: Seguir un rumbo expresado en grados utilizando una brújula 2024, Mes de julio
Anonim
Brújula digital y buscador de rumbo
Brújula digital y buscador de rumbo

Autores:

Cullan Whelan

Andrew Luft

Blake Johnson

Expresiones de gratitud:

Academia Marítima de California

Evan Chang-Siu

Introducción:

La base de este proyecto es una brújula digital con seguimiento de rumbo. Esto permite al usuario seguir un rumbo a través de largas distancias utilizando un aparato digital. Coloquialmente, un rumbo es un ángulo medido en el sentido de las agujas del reloj desde el norte, que se considera cero grados, como lo indica la brújula. El dispositivo tiene dos funciones principales: la primera es mostrar el rumbo actual del dispositivo en una referencia de pantalla digital, y la segunda es la capacidad de ingresar un rumbo solicitado por el usuario, que se mostrará en un anillo de LED en la parte superior del carcasa de brújula. A continuación, el usuario ajustaría la orientación del dispositivo en relación con el LED iluminado. A medida que se cambia la dirección del dispositivo, el LED viajará al LED central, lo que indica que se ha establecido el rumbo correcto.

Suministros:

- Módulo GPS DIYmall 6M

- HiLetgo MPU9250 / 6500 9 ejes 9 DOF 16 bits

- Anillo Adafruit NeoPixel 16

- Batería recargable de litio MakerFocus 4pcs 3.7V

- Tablero ELEGOO MEGA 2560 R3

- Adafruit Mini Lipo con conector USB Mini-B - Cargador USB LiIon / LiPoly - v1

- LCD TFT de 2.8 con placa de conexión de pantalla táctil con conector MicroSD

Paso 1: Diseño de la funcionalidad del proyecto

Diseñar la funcionalidad del proyecto
Diseñar la funcionalidad del proyecto

El primer paso es comprender la lógica y la funcionalidad operativa final. Este diagrama lógico muestra los tres estados del dispositivo y los dos estados del sensor.

Estado 1: Estado de carga

El estado de carga se utiliza para permitir que Arduino Mega recupere los datos de los dos sensores al iniciarse. El dispositivo mostrará la carga en la pantalla, borrará todos los valores numéricos en la pantalla y los LED en el anillo de NeoPixel se iluminarán en un círculo.

Estado 2: modo brújula

En este estado, el dispositivo actuará como una brújula digital. El anillo de NeoPixel se iluminará para indicar la dirección del Norte con respecto a la orientación del dispositivo. El verdadero rumbo del dispositivo también se mostrará en la pantalla LCD junto con la latitud y la longitud del dispositivo. También será dentro de este estado que el usuario podrá ingresar el encabezado de usuario que se mostrará en el Estado 3.

Estado 3: modo de seguimiento de rumbo

En este estado, el dispositivo ahora ayudará al usuario a establecerse en el rumbo deseado. El dispositivo ahora mostrará el rumbo de los dispositivos y el rumbo de los usuarios en la pantalla LCD junto con los datos de latitud y longitud. El anillo NeoPixel ahora se iluminará para indicar el rumbo del usuario con respecto a la orientación de los dispositivos.

Tanto en el estado 2 como en el estado 3 hay dos estados de sensor, estos estados de sensor permiten que el dispositivo extraiga datos del sensor que proporciona los datos más precisos en función de la condición operativa del dispositivo.

Estado del sensor 1: MPU

Si el dispositivo no se está moviendo, los datos de rumbo se extraerán de la MPU, ya que son los datos más precisos cuando el dispositivo no se está moviendo.

Estado del sensor 2: GPS

Si el dispositivo se está moviendo, los datos de rumbo se extraerán del chip GPS, ya que son los datos más precisos en esta condición.

El dispositivo puede cambiar entre estos estados de sensor en cualquier momento para tener en cuenta las condiciones de uso del cambio de unidad. Esto es importante para el funcionamiento del dispositivo, ya que los dos sensores utilizados en el dispositivo tienen condiciones que afectan la precisión de los datos que proporcionan. En el caso de la MPU, el chip puede verse fácilmente influenciado por campos magnéticos locales causados por automóviles y materiales de construcción metálicos en edificios. Por lo tanto, se utiliza un chip GPS que puede proporcionar un rumbo mucho más preciso que no se ve afectado por las mismas influencias. Sin embargo, el GPS solo puede proporcionar datos de rumbo cuando se mueve, ya que calcula el rumbo utilizando el cambio en los datos de latitud y longitud. Por lo tanto, los chips se complementan entre sí y, al utilizar los dos estados de sensor, proporcionan la funcionalidad del dispositivo más precisa y confiable.

Paso 2: Configuración y diagrama de cableado

Configuración y diagrama de cableado
Configuración y diagrama de cableado
Configuración y diagrama de cableado
Configuración y diagrama de cableado
Configuración y diagrama de cableado
Configuración y diagrama de cableado

El proyecto utiliza una placa de clonación Arduino Mega similar a la placa anterior. Todos los componentes del proyecto estarán conectados a esta placa. Arriba hay diagramas detallados de cómo conectar los componentes para este proyecto. Los botones no tienen un circuito detallado, ya que se pueden configurar de muchas formas. En este proyecto, usan una resistencia pull-down de 100K y un botón simple para enviar una señal de 3 voltios a su pin asignado.

Paso 3: Prueba de componentes y código básico

El proyecto extraerá datos tanto del MPU como del chip GPS como se describió anteriormente. Se adjuntan tres códigos que permiten probar los datos del MPU, GPS y MPU con pantalla para verificar la funcionalidad de las piezas. Es importante que los componentes estén operativos en esta etapa, ya que el código es independiente para cada chip y cualquier problema puede resolverse sin temor a causar errores imprevistos en el código final.

Bibliotecas requeridas:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS ++. H

Adafruit_NeoPixel.h

MPU9250.h

Todos estos se pueden encontrar buscando en los títulos anteriores. No publicaré enlaces ya que hay muchas copias de estas bibliotecas de múltiples fuentes y siguiendo el estándar de la comunidad de solo vincular a los originales, le permitiré encontrarlos por sí mismo.

Paso 4: Calibración de MPU

Calibración de MPU
Calibración de MPU

El encabezado encontrado a través de la MPU en el estado 2 y el estado 3 se dividió en cuatro cuadrantes. Esto era necesario porque nuestro método de calibración requería encontrar las magnitudes mínima y máxima del magnetómetro a lo largo de sus ejes xey. Esto se hizo girando el dispositivo aleatoriamente sobre sus tres ejes, sin ningún campo electromagnético significativo que no sea el de la Tierra. Luego tomamos los valores mínimo y máximo a lo largo de los ejes xey y los conectamos en una ecuación de escala para restringir las magnitudes entre los valores negativos uno y uno. En la figura anterior, BigX y BigY son los valores máximos de los datos del magnetómetro a lo largo del eje xey respectivamente, LittleX y LittleY son los valores mínimos de los datos del magnetómetro a lo largo del eje xey respectivamente, IMU.getMagX_uT () e IMU.getMagY_uT () son los valores que se extraen del magnetómetro en cualquier momento a lo largo de los ejes xey, respectivamente, y Mx y My son los nuevos valores escalados que se utilizan para calcular el rumbo.

Paso 5: Código final

Código final
Código final
Código final
Código final
Código final
Código final
Código final
Código final

El paso final es crear el código final. Adjunto copia del código final del proyecto. Dentro de las notas se han hecho para ayudar a navegar por el código. El mayor desafío de esta sección fue lograr que los cuadrantes funcionaran correctamente. La implementación de cuadrantes resultó ser más tediosa y desafiante a la lógica de lo que podríamos haber anticipado. Inicialmente implementamos un arctan básico (My / Mx) y luego lo convertimos de radianes a grados, ya que Arduino genera en radianes por defecto. Sin embargo, el único cuadrante en el que funcionó fue de 90 grados a 180 grados, lo que nos dio una salida negativa y terminó siendo el cuadrante III. La solución a esto fue tomar el valor absoluto, ya que aún se incrementó correctamente. Luego, este valor se restó de 360 para iluminar el LED NeoPixel correcto en el estado 2 y se utilizó una operación matemática similar en el estado 3 en función de si el encabezado era mayor o menor que el encabezado de entrada del usuario, los cuales se pueden ver en el código anterior. En las figuras anteriores, el rumbo corresponde a la luz de NeoPixel que se iluminará en función de la diferencia entre el rumbo del dispositivo y la desviación del norte en el caso del estado 2 y del rumbo del usuario. En este caso, de 90 a 180 grados corresponde al cuadrante III. En ambos casos, tft.print hace que la pantalla lea el dispositivo que se dirige desde el norte.

Para los otros tres cuadrantes, la implementación de arctan (My / Mx) condujo a una inversión del incremento a medida que se giraba el dispositivo, es decir, el ángulo de rumbo contaba hacia atrás cuando se suponía que debía contar hacia arriba y viceversa. La solución a este problema fue cambiar el arco a la forma de arctan (Mx / My). Si bien esto resolvió la inversión de incremento, no dio el rumbo correcto del dispositivo, que es donde entran en juego los cuadrantes. La solución simple a esto fue agregar un cambio basado en el cuadrante correspondiente. Esto se puede ver en las siguientes figuras, que son nuevamente fragmentos de código de los Estados 2 y 3 de cada cuadrante.

La primera instrucción if se lleva a cabo si el rumbo calculado por la ecuación MPU es mayor que el rumbo del usuario. Bajo esta condición, el encabezado de entrada del usuario se agrega al encabezado del dispositivo y el valor correspondiente se resta de 360. Si se lleva a cabo la instrucción else, la ecuación del encabezado de MPU se resta del encabezado de entrada del usuario. Estas condiciones se implementaron para no solo obtener un valor preciso para el NeoPixel, sino para evitar obtener un valor fuera del rango aceptable, que es de 0 a 359 grados.

Recomendado: