MAGNETÓMETRO HMC5883L. Leave a comment

Comparte este Post

//

// Código brújula digital con sensor magnetometro HMC5883

// Basado en el código de http://www.ardumania.es/brujula-digital-hmc5883l/

//

// Añadi LEDs para que indiquen la dirección y así no depender

// del monitor Serial.

//

#include

#include //Include a biblioteca HMC5883L.h

#include

// Se definen los LED y el pin correspondiente.

#define led1 2 //Define led1 como pin2

#define led2 3 //Define led2 como pin3

#define led3 4 //Define led3 como pin4

#define led4 5 //Define led4 como pin5

#define led5 6 //Define led5 como pin6

#define led6 7 //Define led6 como pin7

#define led7 8 //Define led7 como pin8

#define led8 9 //Define led8 como pin9

HMC5883L brujula; //Instância a biblioteca para a bússola

int i; //Variable para contar

float grados; //Variable para almacenar el valor evaluado

float preciso; //Variable para o mejorar la precison de valor medido

// Asignacion de una identificacion a la brujula

Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

void displaySensorDetails(void)

{

sensor_t sensor;

mag.getSensor(&sensor);

Serial.println(«————————————«);

Serial.print («Sensor: «); Serial.println(sensor.name);

Serial.print («Driver Ver: «); Serial.println(sensor.version);

Serial.print («ID unica: «); Serial.println(sensor.sensor_id);

Serial.print («Valor Maximo: «); Serial.print(sensor.max_value); Serial.println(» uT»);

Serial.print («Valor Minimo: «); Serial.print(sensor.min_value); Serial.println(» uT»);

Serial.print («Resolucion: «); Serial.print(sensor.resolution); Serial.println(» uT»);

Serial.println(«————————————«);

Serial.println(«»);

delay(500);

}

void setup(void)

{

Serial.begin(9600);

Serial.println(«Magnetometro HMC5883 Test»); Serial.println(«»);

/* Inicializamos el sensor */

if(!mag.begin())

{

// Si hay algun problema con el HMC5883 sale el aviso de que revise las conexiones

Serial.println(«Ooops, no se ha detectado el HMC5883 … revisa las conexiones!»);

while(1);

}

pinMode(led1, OUTPUT); //Define pin 2 como salída

pinMode(led2, OUTPUT); //Define pin 3 como salída

pinMode(led3, OUTPUT); //Define pin 4 como salída

pinMode(led4, OUTPUT); //Define pin 5 como salída

pinMode(led5, OUTPUT); //Define pin 6 como salída

pinMode(led6, OUTPUT); //Define pin 7 como salída

pinMode(led7, OUTPUT); //Define pin 8 como salída

pinMode(led8, OUTPUT); //Define pin 9 como salída

Wire.begin(); //Inicia la comunicacion I2C

//Configura a brújula

brujula = HMC5883L();

brujula.SetScale(1.3);

brujula.SetMeasurementMode(Measurement_Continuous);

//===================

// Muesta la información básica del sensor

displaySensorDetails();

}

void loop(void)

{

// Hacemos que el sensor tome una nueva muestra

sensors_event_t event;

mag.getEvent(&event);

/*

Sostenga el módulo de manera que Z esté señalando arriba y se pueda medir con el título X e Y

Calcular la medida cuando el magnetómetro esté nivelado, y luego corregir los signos de eje

*/

// inicialmente los LED estarán apagados.

digitalWrite(led1, LOW);

digitalWrite(led2, LOW);

digitalWrite(led3, LOW);

digitalWrite(led4, LOW);

digitalWrite(led5, LOW);

digitalWrite(led6, LOW);

digitalWrite(led7, LOW);

digitalWrite(led8, LOW);

float muestra = atan2(event.magnetic.y, event.magnetic.x);

preciso = 0; //A cero, la variable para una nueva lectura

/* Una vez tengamos la muestra tomada, a continuación debemos agregar el «Ángulo de declinación»

el ángulo de declinación es el «error» del campo magnético en su ubicación.

Puede encontrar el suyo aquí: http://www.magnetic-declination.com/

Si no encuentra su ángulo de declinación, comente las dos líneas siguientes, la brújula estará

ligeramente desviada*/

float declinacionAngulo = 0.13; // Valencia, angulo de declinación 0.13

muestra += declinacionAngulo;

// corrige los valores negativos

if(muestra < 0)

muestra += 2*PI;

// Comprueba si hay error debido a la adición de la declinación.

if(muestra > 2*PI)

muestra -= 2*PI;

// Convierte los radianes a grados

float muestraangulo = muestra * 180/M_PI;

/* A continuación vamos a mostrar por pantalla los diferentes valores y puntos

cardinales en función de las muestras tomadas. Al añadir los LEDs se puede ver

la dirección con el LED encendido. */

if (muestraangulo > 350){

Serial.print(«N «); Serial.print(muestraangulo); Serial.println(» LED 1″); // añadido

digitalWrite(led1, HIGH);// añadido

delay(500);

}

if (muestraangulo <= 10){ // <=15

Serial.print(«N «); Serial.print(muestraangulo); Serial.println(» LED 1″); // añadido

digitalWrite(led1, HIGH);// añadido

delay(500);

}

if (muestraangulo > 10 && muestraangulo <= 80){ // >15 <=75

Serial.print(«NE «); Serial.print(muestraangulo); Serial.println(» LED 2″); // añadido

digitalWrite(led2, HIGH); // añadido

delay(500);

}

if (muestraangulo > 80 && muestraangulo <= 100){ // >75 <=105

Serial.print(«E «); Serial.print(muestraangulo); Serial.println(» LED 3″); // añadido

digitalWrite(led3, HIGH); //añadido

delay(500);

}

if (muestraangulo > 100 && muestraangulo <= 170){ // >105 <=165

Serial.print(«SE «); Serial.print(muestraangulo); Serial.println(» LED 4″); // añadido

digitalWrite(led4, HIGH); // añadido

delay(500);

}

if(muestraangulo > 170 && muestraangulo <= 190){ // >165 <=195

Serial.print («S «); Serial.print(muestraangulo); Serial.println(» LED 5″); // añadido

digitalWrite(led5, HIGH); // añadido

delay(500);

}

if(muestraangulo > 190 && muestraangulo <= 260){ // >195 <=255

Serial.print («SW «); Serial.print(muestraangulo); Serial.println(» LED 6″); // añadido

digitalWrite(led6, HIGH); // añadido

delay(500);

}

if(muestraangulo > 260 && muestraangulo <= 290){ // >255 <=285

Serial.print («W «); Serial.print(muestraangulo); Serial.println(» LED 7″); // añadido

digitalWrite(led7, HIGH); // añadido

delay(500);

}

if(muestraangulo > 290 && muestraangulo <= 350){ // >285 <=350

Serial.print («NW «); Serial.print(muestraangulo); Serial.println(» LED 8″); // añadido

digitalWrite(led8, HIGH); // añadido

delay(500);

}

}


Comparte este Post

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Abrir chat
0

Tu carrito