Переработанная версия всеми известного импульсного металлоискателя - "Пирата", но на Arduino. Имеет неплохую чувствительность даже на мелкие монеты. Стабилен в не зависимости от температуры и заряда батареи. Схема максимально упрощена.
Из недостатков можно отметить отсутствие возможности определять тип металла. Определять тип могут только металлоискатели с радио излучающим принципом детектирования (сложны в устройстве и требуют точной настройки). Импульсный металлоискатель в свою очередь работает на магнитном детектировании индукционных токов в металле. Индукция при поиске не различима для черный и цветных металлов.
К слову сказать, что есть еще третий тип металлоискателей - частотный. Малоэффективная и очень простая конструкция в основе которой генератор колебаний магнитного контура, который чувствителен к изменению величины индукции катушки. Мы ее рассматривать не будем из-за низкой чувствительности. Личный эксперименты по разработке такой конструкции в лучшем случае позволяли детектировать сковородку на 20 см глубины. На монет реагировал только в "упор". Практически бесполезная штука. По тому от нее сразу отказался.
Наша схема импульсного металлоискателя имеет в себе несколько основных компонентов. Arduino генерирует импульсы, они усиливаются полевым транзистором (силовым ключом) который в свою очередь индуцирует импульсы магнитное поле в катушке. Магнитный импульс проходит до искомого металла и индуцирует в нем ток, а затем обратный сигнал магнитного поля. Этот обратный магнитный поток через небольшую задержку возвращается обратно в катушку металлодетектора и генерирует импульс. Сигнал проходит мимо пары диодов (диоды нужны что бы ограничить напряжение до 1 вольта) и уходит на вход операционного усилителя. Усиленный сигнал попадает в arduino в котором высчитывается "спадающий хвост" после отключения катушки силовым ключем. Т.е. как раз ответ от искомого металлического предмета. В зависимости от времени спада мы можем судить о величине или удаленности объекта. Индикатор показывает эту величину в 8-и уровнях индикаторов.
К слову о катушке. Она должна быть диаметром 20 см с 20-ю витками провода 0,4 - 0,8 мм. Толщина провода так же влияет на индукцию всей катушки. Сильное отклонение от толщины провода приведет к ухудшению чувствительности прибора. Катушка вставлена в водопроводную ПВХ трубу и не имеет никаких дополнительных металлический соединений.
Скетч программы содержит генератор импульсов и алгоритм обработки входящего сигнала с усилителя.
- int ss0 = 0;
int ss1 = 0;
int ss2 = 0;
long c0 = 0;
long c1 = 0;
long c2 = 0;
byte i = 0;
int sss0 = 0;
int sss1 = 0;
int sss2 = 0;
int s0 = 0;
int s1 = 0;
int s2 = 0;
void setup()
{
DDRB = 0xFF; // port B - all out
DDRD = 0xFF; // port D - all out
for (i = 0; i <255; i++) // калибровка
{
PORTB = B11111111;
delayMicroseconds(200);
PORTB = 0;
delayMicroseconds(20);
s0 = analogRead(A0);
s1 = analogRead(A0);
s2 = analogRead(A0);
c0 = c0 + s0;
c1 = c1 + s1;
c2 = c2 + s2;
delay(3);
}
c0 = c0 / 255;
c0 = c0 - 5;
c1 = c1 / 255;
c1 = c1 - 5;
c2 = c2 / 255;
c2 = c2 - 5;
}
void loop()
{
PORTB = B11111111;
delayMicroseconds(200);
PORTB = 0;
delayMicroseconds(20);
s0 = analogRead(A0);
s1 = analogRead(A0);
s2 = analogRead(A0);
ss0 = s0 - c0;
if (ss0 < 0)
{
sss0 = 1;
}
ss0 = ss0 / 16;
PORTD = ss0; // посылаем на индикатор (send to LEDs)
delay(1);
ss1 = s1 - c1;
if (ss1 < 0)
{
sss1 = 1;
}
ss1 = ss1 / 16;
PORTD = ss1; // посылаем на индикатор (send to LEDs)
delay(1);
ss2 = s2 - c2;
if (ss2 < 0)
{
sss2 = 1;
}
ss2 = ss2 / 16;
PORTD = ss2; // посылаем на индикатор (send to LEDs)
delay(1);
if ( sss0+sss1+sss2 > 2)
{
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);
digitalWrite(1,HIGH);
digitalWrite(0,HIGH);
delay(1);
sss0 = 0;
sss1 = 0;
sss2 = 0;
}
}