brujula

Una brújula de anillo leds RGB

Que haremos?:

Sobre la plataforma de Arduino, montaremos un sensor HMC5883L que detecta los campos magnetico de la tierra, y visualizaremos así la direccion Norte en un anillo de 16 leds RGB.

Un buen proyecto para familiarizarnos con el sensor magnetometro y con la programación de leds Neopixels.

 

Coneccionado:

El Sensor Hmc5883L lo conectaremos al Arduino Uno al pin de 3.3v, GND, y los pines A4 y A5 (para la comunicación I2C SDA a A4 y SCL a A5)

El Anillo Neopixel lo conectaremos a 5V a Gnd y el pin de DIN del anillo lo conectaremos al Pin digital 3

(Para evitar falsas lecturas haremos que el sensor se encuentre lo mas lejos posible de metales, imanes o cables de alimentación.)

Librerias:

Nos valdremos de librerias Wire.h, FastLed.h y HMC5883L.h para comunicarnos con el sensor y con el anillo.

La libreria Wire ya es parte del IDE de Arduino, las otras 2 deberemos instalarlas manualmente a travez del IDE.

Podemos buscarlas en el buscador de Librerías con Ctrl+Shift+I es importante fijarse bien las versiones.

FastLed Built-In by Daniel Garcia
Adafruit HMC5883 Unified Buil-In by Adafruit (si esta librería no te funciona es posible que tengás un magnetometro de las mismas caracteristicas pero que usa esta Librería.

El código:

/* Start of Code */

#include <Wire.h>
#include "FastLED.h"
#include <HMC5883L.h>

#define NUM_LEDS 16 // Number of LEDs on Ring
#define DATA_PIN_RING 3 // Pin 3 connected to RGB Ring

CRGB leds_RING[NUM_LEDS];

HMC5883L compass;
int fixedHeadingDegrees; // Used to store Heading value

void setup()
{
Serial.begin(9600);
Wire.begin();
FastLED.addLeds<NEOPIXEL,DATA_PIN_RING>(leds_RING, NUM_LEDS);

// Set measurement range
compass.setRange(HMC5883L_RANGE_1_3GA);

// Set measurement mode
compass.setMeasurementMode(HMC5883L_CONTINOUS);

// Set data rate
compass.setDataRate(HMC5883L_DATARATE_30HZ);

// Set number of samples averaged
compass.setSamples(HMC5883L_SAMPLES_8);

// Set calibration offset. See HMC5883L_calibration.ino
compass.setOffset(41, -196);
}

void loop()
{
Vector norm = compass.readNormalize();

// Calculate heading
float heading = atan2(norm.YAxis, norm.XAxis);

// Set declination angle on your location and fix heading
// You can find your declination on: http://magnetic-declination.com/
// (+) Positive or (-) for negative
// For Montreal,QC declination angle is -14'35W (negative)
// Formula: (deg + (min / 60.0)) / (180 / M_PI);
float declinationAngle = (14.0 - (35.0 / 60.0)) / (180 / M_PI);
heading -= declinationAngle;

// Correct for heading < 0deg and heading > 360deg
if (heading < 0)
{
heading += 2 * PI;
}

if (heading > 2 * PI)
{
heading -= 2 * PI;
}

// Convert to degrees
float headingDegrees = heading * 180/M_PI; 

// To Fix rotation speed of HMC5883L Compass module
if (headingDegrees >= 1 &amp;&amp; headingDegrees < 240)
{
fixedHeadingDegrees = map (headingDegrees * 100, 0, 239 * 100, 0, 179 * 100) /100.00;
}
else {
if (headingDegrees >= 240)
{
fixedHeadingDegrees = map (headingDegrees * 100, 240 * 100, 360 * 100, 180 * 100, 360 * 100) /100.00;
}
}

int headvalue = fixedHeadingDegrees/18;
int ledtoheading = map(headvalue, 0, 15, 15, 0);

FastLED.clear();

if (ledtoheading == 0){
leds_RING[15] = CRGB::Red; 
leds_RING[0] = CRGB::Green; 
leds_RING[14] = CRGB::Green;
}
else {
if (ledtoheading == 15){
leds_RING[0] = CRGB::Red; 
leds_RING[15] = CRGB::Green; 
leds_RING[1] = CRGB::Green;
}
else {
leds_RING[ledtoheading] = CRGB::Red;
leds_RING[ledtoheading+1] = CRGB::Green;
leds_RING[ledtoheading-1] = CRGB::Green;
}
}

FastLED.setBrightness(50);
FastLED.show();
delay(100);
}

/* End of Code */

Ahora ya podemos visualizar el norte en nuestro anillo RGB !!

Esperamos te sirva y hallas aprendido algo, cualquier duda o comentario no dudes en ponerte en contacto con nosotros.


Saludos!!