Induction Balance Discriminating Metal detectors with Arduino

An Induction Balance (IB) metal detector has a transmit and a receive coil. The coils are arranged so that, with no metal present, the coupling cancels out to zero in the receive coil.

For conductive objects, eddy current induced in nonferrous metals repel the AC magnetic field, causing the receiver coil to no longer be nulled. Ferrous objects unbalance by pulling magnetic fields into them.

The phase change is in opposite directions between ferrous and nonferrous metals. In addition, the size and conductivity of a nonferrous object will cause a particular phase change, as long as mass and composition are controlled. So a penny will give a different indication than a quarter, or a nickel. But that particular coin will cause the same phase change every time.

Unfortunately, gold and silver rings give a similar indication to an aluminum pull tab. Fortunately, not many pull tabs around any more!

They are also called VLF metal detectors, as they often run at audio frequencies or just above audio.

The coils may have two wired antiserial on the transmit side, and one receive coil arranged so it is at the null location between them. Sometimes one of the transmit coils is called a "bucking coil" or "feedback coil" and it will have a separate level control to null at the receive coil. Or there is only one transmit coil and the nulling feedback is all electronic. This is sometimes called a Concentric Coil head.

Note how small the detecting area is. Good for pinpointing, but it means a lot of sweeping.

Some Heathkit IB metal detectors formed the transmit coil into sort of a loop within a loop. The problem with this is that the detection area is a small cone where the receive and transmit coil overlap.

Or it may have both the transmit and receive coils squashed into ovals and overlapped just enough to cancel. This is called a "double D coil" because the coils are often shaped like two upper case letter "D" to get the best shape on detecting area. It has become the standard coil for IB discriminating metal detectors.

The Double D coil has a long but narrow detecting area, which means less sweeping, and to pinpoint you just turn it 90 degrees and sweep again.

In general, lower frequencies go deeper but won't be as sensitive to smaller objects like coins and rings, and higher frequencies may not go as deep but are more sensitive to smaller objects. Some DD coil metal detectors work up at 70kHz to detect small grains of gold.

Ideally, I think we'd want to program the Arduino to be able to change frequencies. The coil is NOT tuned.

In older detectors, synchronous rectification is used to extract phase information from the received waveform.

Since the Arduino is controlling the frequency going to the transmit coil, it knows the phase of what is being received by comparing either the peaks or the zero crossings. The ADC could be used for peak detection, or the internal comparator for zero cross detection.

Without discrimination, we could start with just a 555 timer and an LM386 audio amplifier. Then build from there.

Something to determine is how using a square wave vs sine wave affects range and discrimination.

Anyone interested?

If a sine wave would work better, there is always either an add-on DAC or the Teensy 3.x with built-in 12 bit DAC.

The Arduino's ADC has a maximum sampling rate of just under 10 kHz (can be increased at a loss of resolution), meaning for your phase shift you're limited to signals of about 1 kHz. That's disregarding processing/memory limitations. A far cry from the 70 kHz you mention.
A teensy would likely be a much better choice for processor for its much greater processing power.

polymorph:
An Induction Balance (IB) metal detector has a transmit and a receive coil. The coils are arranged so that, with no metal present, the coupling cancels out to zero in the receive coil.

I assumed that the receive coil simply is arranged so that it just doesn't receive a signal..... unless the field gets disturbed enough by the presence of the interfering external metal. So no coupling under usual conditions. Coupling is not 'cancelled' as such....... but simply just no coupling under usual conditions?

Good project ideas! Involving arduinos.

Good point, wvmarle, so maybe just timing the zero crossings? However, if a sine wave drive is better, the Teensy would be called for.

In fact, since the higher Teensy 3.x variants have two 12 bit DACs, this could open the door to adjustable cancellation for things like ground mineralization.

Southpark:
I assumed that the receive coil simply is arranged so that it just doesn't receive a signal..... unless the field gets disturbed enough by the presence of the interfering external metal. So no coupling under usual conditions. Coupling is not 'cancelled' as such....... but simply just no coupling under usual conditions?

Incorrect. There is coupling, but the in phase and out of phase coupling are equal so cancels.

If, instead math on ADC samples, you use a a couple comparators to detect the zero crossings, the phase measurement could be handled by an eight bit timer on a 16MHz arduino.

Using timer 2:

pinMode(3, OUTPUT); // OC2B
pinMode(11, OUTPUT); // OC2A
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20); // WGM=111 fast PWM, prescaler=1
OCR2A = 228; // 16000000/1/(228+1)/2 = 34934.5 Hz at 50% on OC2A
OCR2B = 114 // 16000000/1/(228+1) = 69869 Hz PWM at 49.7% duty on OC2B

Then you have about ~70kHz on OC2B, and if you can detect the zero crossing with a comparator, interrupt and read TCNT2, you should get the phase information relative to OCR2B at 360*1/(228+1)=1.57 degree resolution.