Simple Arduino Metal Detector

125,345

194

163

Introduction: Simple Arduino Metal Detector

*** A new version has been posted that is even simpler: https://www.instructables.com/Minimal-Arduino-Metal-Detector/ ***

Metal detection is a great past-time that gets you outdoors, discover new places and maybe find something interesting. Check your local regulations on how to act in case of an eventual find, in particular in case of hazardous objects, archeological relics or objects of significant economic or emotional value.

Instructions for DIY metal detectors are plenty, but this recipe is particular in the sense that it requires very few components in addition to an Arduino microcontroller: a common capacitor, resistor and diode form the core, together with a search coil that consist of circa 20 windings of electrically conducting cable. LED’s, a speaker and/or headphone are then added for signalling the presence of metal near the search coil. An additional advantage is that all can be powered from a single 5V power, for which a common 2000mAh USB power is sufficient and will last many hours.

To interpret the signals and to understand what materials and shapes the detector is sensitive to, it really helps to understand the physics. As a rule of thumb, the detector is sensitive to objects at a distance or depth up to the radius of the coil. It is most sensitive to objects in which a current can flow in the plane of the coil, and the response will correspond to the area of the current loop in that object. Thus a metal disc in the plane of the coil will give a much stronger response than the same metal disc perpendicular to the coil. The weight of the object does not matter much. A thin piece of aluminium foil oriented in the plane of a coil will give a much stronger response than a heavy metal bolt.

Step 1: Working Principle

When electricity starts flowing through a coil, it builds up a magnetic field. According to Faraday’s law of induction, a changing magnetic field will result in an electric field that opposes the change in magnetic field. Thus, a voltage will develop across the coil that opposes the increase in current. This effect is called self-inductance, and the unit of inductance is Henry, where a coil of 1 Henry develops a potential difference of 1V when the current changes by 1 Ampere per second. The inductance of a coil with N windings and a radius R is approximately 5µH x N^2 x R, with R in meters.

The presence of a metallic object near a coil will change its inductance. Depending on the type of metal, the inductance can either increase or decrease. Non-magnetic metals such as copper and aluminium near a coil reduce the inductance, because a changing magnetic field will induce eddy currents in the object that reduce the intensity of the local magnetic field. Ferromagnetic materials, such as iron, near a coil increase its inductance because the induced magnetic fields align with the external magnetic field.

The measurement of the inductance of a coil can thus reveal the presence of metals nearby. With an Arduino, a capacitor, a diode and a resistor it is possible to measure the inductance of a coil: making the coil part of a high-pass LR filter and feeding this with a block-wave, short spikes will be created at every transition. The pulse length of these spikes is proportional to the inductance of the coil. In fact, the characteristic time of an LR filter is tau=L/R. For a coil of 20 windings and a diameter of 10 cm, L ~ 5µH x 20^2 x 0.05 = 100µH. To protect the Arduino from overcurrent, the minimum resistance is 200Ohm. We thus expect pulses with a length of about 0.5 microsecond. These are difficult to measure directly with high precision, given that the clock frequency of the Arduino is 16MHz.

Instead, the rising pulse can be used to charge a capacitor, which can then be read out with the Arduino analog to digital converted (ADC). The expected charge from a 0.5 microsecond pulse of 25mA is 12.5nC, which will give 1.25V on a 10nF capacitor. The voltage drop over the diode will reduce this. If the pulse is repeated a few times, the charge on the capacitor rises to ~2V. This can be read out with the Arduino ADC using analogRead(). The capacitor can then be quickly discharged by changing the readout pin to output and setting it to 0V for a few microseconds.The whole measurement takes about 200 microseconds, 100 for the charging and resetting of the capacitor and 100 for the ADC conversion. The precision can be greatly enhanced by repeating the measurement and averaging the result: taking the average of 256 measurements takes 50ms and improves the precision by a factor 16. The 10-bit ADC achieves the precision of a 14-bit ADC this way.

This measurement obtained is highly nonlinear with the inductance of the coil and therefore not suitable to measure the absolute value of the inductance. However, for metal detection we are only interested in tiny relative changes of the coil inductance due to the presence of nearby metals, and for that this method is perfectly suitable.

The calibration of the measurement can be done automatically in software. If one can assume that most of the time there is no metal near the coil, a deviation from the average is a signal that metal has come close to the coil. Using different colours or different tones allows to discriminate between a sudden increase or a sudden decrease in the inductance.

Step 2: Required Components

Electronic core:

Arduino UNO R3 + prototype shield OR Arduino Nano with 5x7cm prototype board

10nF capacitor

Small signal diode, e.g. 1N4148

220-ohm resistor

For power:

USB power bank with cable

For visual output:

2 LEDs of different colour e.g. blue and green

2 220Ohm resistors to limit the currents

For sound output:

Passive buzzer

Microswitch to disable sound

For earphone output:

Earphone connector

1kOhm resistor

Earphones

To easily connect/disconnect the search coil:

2-pin screw terminal

For the search coil:

~5 meters of thin electric cable

Structure to hold the coil. Must be stiff but does not need to be circular.

For the structure:

1meter stick, e.g wood, plastic or selfie stick.

Step 3: The Search Coil

For the search coil, I wound ~4m of stranded wire around a cardboard cylinder with 9 cm diameter, resulting in about 18 windings. The type of cable is irrelevant, as long as the ohmic resistance is at least ten times smaller than the value of R in the RL filter, so make sure to stay below 20 Ohms. I measured 1 Ohm, so that is safe. Just taking a half-finished 10m roll of hookup wire also works!

Step 4: A Prototype Version

Given the small number of external components, it is perfectly possible to fit the circuitry on the small breadboard of a prototype shield. However, the final result is rather bulky and not very robust. Better is to use an Arduino nano and solder it with the extra components on a 5x7cm prototype board, (see next step)

Only 2 Arduino pins are used for the actual metal detection, one for providing the pulses to the LR filter and one for reading out the voltage on the capacitor. Pulsing can be done from any output pin but the readout must be done with one of the analog pins A0-A5. 3 more pins are used for 2 LEDs and for the sound output.

Here's the recipe:

  1. On the breadboard, connect the 220Ohm resistor, the diode and the 10nF capacitor in series, with the negative terminal of the diode (the black line) towards the capacitor.
  2. Connect A0 to resistor (the end not connected to the diode)
  3. Connect A1 to where the cross-point of the diode and the capacitor
  4. Connect the non-connected terminal of the capacitor to ground
  5. Connect one end of the coil to the resistor-diode cross-point
  6. Connect the other end of the coil to ground
  7. Connect one LED with its positive terminal to pin D12 and its negative terminal through a 220Ohm resistor to ground
  8. Connect the other LED with its positive terminal to pin D11 and its negative terminal through a 220Ohm resistor to ground
  9. Optionally, connect a passive buzzer headphone or speaker between pin 10 and ground. A capacitor or resistor can be added in series to reduce the volume

That's all!

Step 5: A Soldered Version

To take the metal detector outside, it will be necessary to solder it. A common 7x5 cm prototype board comfortable fits an Arduino nano and all the required components. Use the same schematics as in the previous step. I found it useful to add a switch in series with the buzzer to turn off the sound when not needed. A screw terminal allows to try out different coils without having to solder. Everything is powered through the 5V supplied to the (mini- or micro-USB) port of the Arduino Nano.

Step 6: ​The Software

The Arduino sketch used is attached here. Upload and run it. I used Arduino 1.6.12 IDE. It is recommended to run it with debug=true in the beginning, in order to tune the number of pulses per measurement. Best is to have an ADC reading between 200 and 300. Increase or decrease the number of pulses in case your coil gives drastically different readings.

The sketch does some sort of self-calibration. It is sufficient to leave the coil quiet away from metals to make it go quiet. Slow drifts in the inductance will be followed, but sudden large changes will not affect the long-term average.

Step 7: Mounting It on a Stick

Since you wouldn't want to do your treasure hunts crawling over the floor, the three board, coil and battery should be mounted on the end of a stick. A selfie-stick is ideal for this, since it is light, collapsible and adjustable. My 5000mAh powerbank happened to fit on the selfie stick. The board can then be attached with cable ties or elastics and the coil can similarly be to either the battery or the stick.

Step 8: How to Use It

To establish the reference, it is sufficient to leave the coil ~5s away from metals. Then, when the coil gets close to a metal, the green or blue LED will start flashing and beeps will be produced in the buzzer and/or headphones. Blue flashes and low-pitch beeps indicate the presence of non-ferromagnetic metals. Green flashes and high-pitch beeps indicate the presence of ferromagnetic metals. Beware that when the coil is kept for more than 5 seconds near the metal, it will take that reading as a reference, and start beeping when the detector is taken away from the metal. After a few seconds of beeping in the air, it will turn quiet again. The frequency of the flashes and the beeps indicate the strength of the signal. Happy hunting!

Sensors Contest 2017

Participated in the
Sensors Contest 2017

Microcontroller Contest 2017

Participated in the
Microcontroller Contest 2017

9 People Made This Project!

Recommendations

  • Microcontroller Contest

    Microcontroller Contest
  • Automation Contest

    Automation Contest
  • Make it Glow Contest

    Make it Glow Contest

163 Comments

0
Einsatz88
Einsatz88

4 weeks ago

is there any circuit ? Cant find it, sorry I am new.

0
tudor.coman133
tudor.coman133

Question 5 weeks ago on Introduction

What means 5muH? Can you write in words? I have trouble distinguish from what came m, u, H i understand that comes from Henri, but the others i do not know.

2
rgco
rgco

Answer 5 weeks ago

muH stands for microHenries. Usually the greek letter 'mu' is used as a prefix indicating 10^-6, mu. Actually I think I can change it, I'll give it a try. By the way, I made an upgraded version, seehttps://www.instructables.com/Minimal-Arduino-Metal-Detector/

0
jumperd1981
jumperd1981

Question 2 months ago

Okay, me again.

We re-vamped our build from a breadboard over to a prototype board. Everything seems solid, getting more consistent behavior now. BUT, while it technically works it almost seems like it is overwhelming the circuit for the coil...or something.

We stepped down to a 4 inch coil and used 26 gauge copper. It has a resistance of 1.0. It will detect metal but if the metal object you detect is bigger or perhaps more "steel/ferrous" the green light flashes strongly along with the beeper and goes almost solid for several seconds before basically acclimating again.

I am not sure this happened or not before the coil/board change because our original coil was crap. Any ideas what would make that happen? We are using green for our "low note" detection and blue for "high note". From what I see we are using the lights in reverse from your design.

0
rgco
rgco

Answer 2 months ago

Always a pleasure! The code is not written well (it was 4 years ago, I did not have much experience with microcontrollers) - there is a drift correction sometimes going beserk. Also, I am not convinced about the ferrous/non-ferrous discrimination. I tried to address all these issues in the new design https://www.instructables.com/Minimal-Arduino-Metal-Detector/ which is also simpler to build.

0
jumperd1981
jumperd1981

Question 2 months ago

Great instructable. A challenge with a cheat sheet. Love it.
We made it, and it seems to work, but is super sensitive. It does not really detect any smaller things like coins or nail clippers but cans and such it easily finds. My coil is made of 26guage solid copper wire and is 6 inches across and consists of about 12 feet of wire and I use 2 feet of shielded aluminum wire to bring it to the arduino. That 2 feet is twisted inside the cable. Again, it seems to work but I am not sure of the math involved so I may be making it out of too thick, too long etc...

Optimum diameter of cable, type, size of coil, feet. Anything you can add to make this little bugger detect a little better?

PS. My 8 year old son and I have been working on this...and while I am well versed in computer technology, the math on circuits and induction escapes me...might as well be talking Japanese.

Thanks very much. Happy holidays!

0
rgco
rgco

Answer 2 months ago

Great you got your kid involved! You can increase the sensitivity by using a coil with a smaller diameter. This detector is sensitive to objects that are at least ~20% of the coil diameter, so a 3 or 4 inch coil can detect coins, a 6 inch coil struggles.
I also recommend to try the latest version https://www.instructables.com/Minimal-Arduino-Meta... which is even simpler, no capacitor or diode, and is more robust, although not more sensitive.
To get significantly higher sensitivity you need to move to pulse-induction, but that requires also a MOSFET an opamp and a handful of other components. I'm making one now, I hope to write it up soon.

0
jumperd1981
jumperd1981

Reply 2 months ago

oh man...you have no idea. My son is 8, but he was apparently born with a technologically inclined brain. From the time he was old enough to talk and understand language(about 18 months or so) he was intrigued by science, specifically the experimental parts. When asked what he wants to be when he grows up, his answer is always science related, namely being a "mad scientist". He digests this stuff like hand over fist. He is already soldering, and learning schematics, he wires stuff up to our arduinos and breadboards then comes to me to have me help him with the code. He can read through the code and understand basically what it does but does not have that down well enough to code...and mostly what I do is copy/paste from other sketches.

He is now reading and watching stuff about Quantum Physics...talking about the structure of the Universe...still loves his circuits and while youtubing ran across someone's metal detector which got us searching for what we have parts to build and that landed us here on your build.

We adjusted the coil's size to a little smaller than 4 inches, and I am using a slightly thinner wire and it is now detecting coins. Seems specifically more able to detect coins when away from any other electronics...and the ambient detection issues are mostly gone.

I thank you good sir for your fast response.

Regards!

0
hamzazouk
hamzazouk

Question 4 months ago

thank you for your quick response but could I have a little more detail on the length of the wire?
0
rgco
rgco

Answer 4 months ago

I'm not sure I understand your question: if your coil is 9 by 24, each turn is 9+24+9+24=66cm. 20 turns would be 20*66cm=13.2m .

0
hamzazouk
hamzazouk

Reply 4 months ago

Thank you for your reply. Now I just need 13 meters of cable:)

0
hamzazouk
hamzazouk

Question 4 months ago

it's a very good project. I have a question, I need to make a modification for a rectangular coil of 9 cm by 24 cm, what should be modified, in the code, the circuit and the length of the cable?
Thank you for your reply.

0
rgco
rgco

Answer 4 months ago

Depends on the number of turns. You can adjust the number of pulses or the value of the capacitor to get a reading in the 200-300 range of the ADC.

0
msdcokro
msdcokro

Question 6 months ago

berapa diameter kawat email yang di rekomendasikan

0
ChristianP55
ChristianP55

Question 6 months ago

Hi, any clue why the detection of ferro vs. not ferro does not work?

0
rgco
rgco

Answer 6 months ago

The inductance change from introducing a metal can go in two directions: electrical conduction lowers the inductance, ferromagnetism increases the inductance. Pure iron does both, and depending on the type of iron and is geometry, either of two mechanisms will dominate. I guess scanning over a range of frequencies might give a better distinction, but that'd be a project by itself!

0
ChristianP55
ChristianP55

Reply 6 months ago

Thanks for the clarification. I think that would be a nice new project.

0
ex3mind
ex3mind

Question 7 months ago on Step 8

Unable to convert download to Arduino sketch

0
naiduaravind
naiduaravind

Question 7 months ago

can i use 100nf capacitor instead of 10nf