Tabla de contenido:

Proyecto de brújula digital Arduino: 3 pasos
Proyecto de brújula digital Arduino: 3 pasos

Video: Proyecto de brújula digital Arduino: 3 pasos

Video: Proyecto de brújula digital Arduino: 3 pasos
Video: Tutorial Arduino: Brújula digital con HMC6352 2024, Mes de julio
Anonim
Image
Image

¡Hola! En este instructivo, verá cómo puede hacer una brújula digital usando un Arduino y el IDE de procesamiento. Este es un proyecto Arduino bastante simple pero interesante y atractivo.

Puede ver el ejemplo de demostración de este tutorial en el video de arriba. Siempre puedes encontrar videos más interesantes como este en mi canal de YouTube, así como también encontrar muchos proyectos de electrónica y tutoriales en mi sitio web, HowToMechatronics.com.

Paso 1: Piezas necesarias

Para este proyecto, solo necesitará una placa Arduino y un magnetómetro MEMS, para medir el campo magnético terrestre. Usaré la placa de conexión GY-80 que contiene el magnetómetro MC5883L de 3 ejes.

Antes de continuar con el código fuente del proyecto. Si necesita más detalles sobre cómo funciona el magnetómetro MEMS y cómo conectar y utilizar la placa de conexión GY - 80 a través de la comunicación I2C, puede consultar mis tutoriales particulares para ello.

Paso 2: Código fuente de Arduino

Lo que debemos hacer primero es cargar un boceto en la placa Arduino que leerá los datos del magnetómetro y lo enviará al IDE de procesamiento. Aquí está el código fuente de Arduino:

/ * Arduino Compass * * de Dejan Nedelkovski, * www. HowToMechatronics.com * * /

#include // Biblioteca Arduino I2C

#define Magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04 #define Magnetometer_mZ0 0x05 #define Magnetometer_mZ1 0x06 #define Magnetometer_mY0 0x07 #define Magnetometer_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

título flotante, títuloGrados, encabezadoFiltrado, declinación;

flotar Xm, Ym, Zm;

#definir Magnetómetro 0x1E // I2C Dirección de 7 bits de HMC5883

configuración vacía () {

// Inicializar las comunicaciones Serial e I2C Serial.begin (115200); Wire.begin (); retraso (100); Wire.beginTransmission (magnetómetro); Wire.write (0x02); // Seleccionar modo de registro Wire.write (0x00); // Modo de medición continua Wire.endTransmission (); }

bucle vacío () {

// ---- X-Axis Wire.beginTransmission (Magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Eje Y

Wire.beginTransmission (magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Cable del eje Z.beginTransmission (magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetómetro); // transmitir al dispositivo Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (magnetómetro, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- Eje X mX1 = mX1 << 8; mX_out = mX0 + mX1; // Datos brutos // De la hoja de datos: 0.92 mG / dígito Xm = mX_out * 0.00092; // Unidad de Gauss // * El campo magnético de la Tierra varía de 0,25 a 0,65 Gauss, por lo que estos son los valores que necesitamos obtener aproximadamente.

// ---- Eje Y

mY1 = mY1 << 8; mY_out = mY0 + mY1; Ym = mY_out * 0,00092;

//---- Eje Z

mZ1 = mZ1 <0.073 rad declinación = 0.073; rumbo + = declinación; // Corregir cuando los signos son reverenciados if (rumbo <0) rumbo + = 2 * PI;

// Corrección por adición del ángulo de declinación

si (rumbo> 2 * PI) rumbo - = 2 * PI;

headerDegrees = rumbo * 180 / PI; // El encabezado en la unidad de grados

// Suavizar el ángulo de salida / filtro de paso bajo

encabezadoFiltrado = encabezadoFiltrado * 0.85 + encabezadoDegrados * 0.15;

// Envío del valor del encabezado a través del puerto serie al IDE de procesamiento

Serial.println (headerFiltered);

retraso (50); }

Paso 3: procesamiento del código fuente IDE

Después de haber cargado el boceto de Arduino anterior, necesitamos recibir los datos en el IDE de procesamiento y dibujar la brújula digital. La brújula se compone de una imagen de fondo, una imagen fija de la flecha y una imagen giratoria del cuerpo de la brújula. Entonces, los valores para el campo magnético de la tierra calculados con el Arduino se utilizan para rotar la brújula.

Aquí está el código fuente del IDE de procesamiento:

/ * Arduino Compass * * de Dejan Nedelkovski, * www. HowToMechatronics.com * * / import processing.serial. *; import java.awt.event. KeyEvent; import java.io. IOException;

Serial myPort;

PImage imgCompass; PImage imgCompassArrow; Fondo de PImage;

String data = "";

rumbo flotante;

configuración vacía () {

tamaño (1920, 1080, P3D); liso(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Fondo.png"); myPort = new Serial (este, "COM4", 115200); // inicia la comunicación serial myPort.bufferUntil ('\ n'); }

vacío dibujar () {

imagen (fondo, 0, 0); // Carga la imagen de fondo pushMatrix (); traducir (ancho / 2, alto / 2, 0); // Traduce el sistema de coordenadas al centro de la pantalla, de modo que la rotación ocurra justo en el centro rotateZ (radianes (-heading)); // Gira la brújula alrededor de la imagen del eje Z (imgCompass, -960, -540); // Carga la imagen de Compass y, a medida que se reubica el sistema de coordenadas, necesitamos establecer la imagen en -960x, -540y (la mitad del tamaño de la pantalla) popMatrix (); // Hace que el sistema de coordenadas vuelva a la posición original 0, 0, 0 image (imgCompassArrow, 0, 0); // Carga la imagen CompassArrow que no se ve afectada por la función rotateZ () debido a la función popMatrix () textSize (30); texto ("Encabezado:" + encabezado, 40, 40); // Imprime el valor del encabezado en la pantalla

retraso (40);

}

// comienza a leer datos del puerto serie

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // lee los datos del puerto serie y los coloca en la variable String "datos". rumbo = flotante (datos); // Conversión del valor de cadena en valor flotante}

Espero que les guste este proyecto. Si es así, también puedes visitar mi sitio web para ver más proyectos interesantes.

Recomendado: