How to Make a Magnetic Force Field Change Detector

5,478

50

6

Introduction: How to Make a Magnetic Force Field Change Detector

This is a very sensitive DIY magnetic force field change detector/sensor. Using HMC5883L magnetometer module with arduino nano. It also makes sound signals when the magnetic force field changes around the device.

Watch the video here:

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: You Will Need

  • 6 LEDs: 2 red, 2 green, 2 yellow
  • 1 prototype PCB (circuit board)
  • arduino nano (or micro / UNO)
  • HMC5883L magnetometer <---- $2 on ebay
  • some wire
  • some socket
  • 9V battery adapter (optional since you can power it from USB too)

Optional for sound signal:

  • potentiometer (change the sound signal or turn it off)
  • piezo speaker

Optional: level shifter (5V - 3.3V) I don't use this because it works fine for me without it. But be aware 5V may destroy your HMC5883L module!

Step 2:

Solder up the legs of your arduino and your HMC5883L module.

Step 3: Attach the Leds and the Sockets on to the Board

  • Attach the leds and the sockets on to the board
  • Try to follow my circuit design or use your own layout

My code uses Digital Pin: 5, 7, 8, 10, 11, 12 for signal the magnetic change strength

PIN 5, 7 ---> Red LEDs (Low strength)

PIN 8, 10 ---> Green LEDs (Medium strength)

PIN 11, 12 ---> Yellow LEDs (High strength)

I use digital PIN 6 for the optional sound signal

Step 4: HMC5883L Wiring

Wire the HMC5883L module as above on the image!

SDA ---> A4

SCL ---> A5

VCC ---> 3.3V

GND ---> GND

Step 5: Potentiometer and Piezo Wiring (Optional)

Wire the potentiometer and piezo with D6 pin as on the image above!

You can change the sound signal with the potentiometer or turn it off completely.

Step 6: Source Code and Libraries

You will need Wire.h and HMC5883L.h libraries in arduino IDE

You can find HMC5883L.h here:

https://github.com/jarzebski/Arduino-HMC5883L

Watch the video about the final device:

ARDUINO SOURCE CODE:


#include
#include

HMC5883L compass;

void setup() { Serial.begin(9600);

//LED pins pinMode (12, OUTPUT); pinMode (11, OUTPUT); pinMode (10, OUTPUT); pinMode (8, OUTPUT); pinMode (7, OUTPUT); pinMode (5, OUTPUT);

// sound pin pinMode (6, OUTPUT);

// Initialize HMC5883L Serial.println("Initialize HMC5883L"); while (!compass.begin()) { Serial.println("Could not find a valid HMC5883L sensor, check wiring!"); delay(500); }

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

// Set measurement mode compass.setMeasurementMode(HMC5883L_CONTINOUS); // Set data rate compass.setDataRate(HMC5883L_DATARATE_15HZ);

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

// starting intro

digitalWrite (5, HIGH); delay(50); digitalWrite (5, LOW); digitalWrite (7, HIGH); delay(50); digitalWrite (7, LOW); digitalWrite (8, HIGH); delay(50); digitalWrite (8, LOW); digitalWrite (10, HIGH); delay(50); digitalWrite (10, LOW); digitalWrite (11, HIGH); delay(50); digitalWrite (11, LOW); digitalWrite (12, HIGH); delay(50); digitalWrite (12, LOW); digitalWrite (11, HIGH); delay(50); digitalWrite (11, LOW); digitalWrite (10, HIGH); delay(50); digitalWrite (10, LOW); digitalWrite (8, HIGH); delay(50); digitalWrite (8, LOW); digitalWrite (7, HIGH); delay(50); digitalWrite (7, LOW); digitalWrite (5, HIGH); delay(50); digitalWrite (5, LOW);

analogWrite(6, 10); delay(50); analogWrite(6, 50); delay(50); analogWrite(6, 150); delay(50); analogWrite(6, 0);

}

int Xaxis; int Yaxis; int Zaxis; int sumAxis; int lastSumAxis;

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

Xaxis = norm.XAxis; Yaxis = norm.YAxis; Zaxis = norm.ZAxis;

Xaxis = (Xaxis / 1) * 1; Yaxis = (Yaxis / 1) * 1; Zaxis = (Zaxis / 1) * 1;

sumAxis = Xaxis + Yaxis + Zaxis;

if (lastSumAxis > sumAxis + 5 || lastSumAxis < sumAxis - 5) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (5, HIGH); analogWrite(6, 110); } else { digitalWrite (5, LOW); analogWrite(6, 0); }

if (lastSumAxis > sumAxis + 10 || lastSumAxis < sumAxis - 10) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (7, HIGH); } else { digitalWrite (7, LOW); }

if (lastSumAxis > sumAxis + 20 || lastSumAxis < sumAxis - 20) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (8, HIGH); } else { digitalWrite (8, LOW); }

if (lastSumAxis > sumAxis + 40 || lastSumAxis < sumAxis - 40) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (10, HIGH); } else { digitalWrite (10, LOW); }

if (lastSumAxis > sumAxis + 80 || lastSumAxis < sumAxis - 80) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (11, HIGH); } else { digitalWrite (11, LOW); }

if (lastSumAxis > sumAxis + 160 || lastSumAxis < sumAxis - 160) // when the Hall sensor detects a magnetic field, Arduino LED lights up { digitalWrite (12, HIGH); } else { digitalWrite (12, LOW); }

Serial.print(" Sum Axis = "); Serial.print(sumAxis); Serial.println(); lastSumAxis = sumAxis;

delay(20); }

LED Contest

Participated in the
LED Contest

Be the First to Share

    Recommendations

    • Arduino Contest 2020

      Arduino Contest 2020
    • First Time Author Contest

      First Time Author Contest
    • Space Challenge

      Space Challenge

    6 Discussions

    0
    gauthamdhanish
    gauthamdhanish

    Question 6 months ago

    i am having issues because it says an error in coding
    'vector' was not declared in this scope
    pls help

    0
    gauthamdhanish
    gauthamdhanish

    6 months ago

    i am having issues because it says an error in coding
    'vector' was not declared in this scope
    pls help

    0
    Jedi2016
    Jedi2016

    3 years ago

    Hello, I've tried this tested, but not working leds are on and I already put some wire.h and hmc5883l.h and copy your code. Nothing happened. I have hmc5883L compress tested working fine. Hope you can help me sort it out?

    0
    BoboTheEpic
    BoboTheEpic

    3 years ago

    Very interesting project, looks like it's pretty damn sensitive too!

    0
    seamster
    seamster

    3 years ago

    Very cool, and pretty straightforward too. Nicely done :)