Найти в Дзене
Amperkot.ru

Металлоискатель "Пират" на Arduino

Переработанная версия всеми известного импульсного металлоискателя - "Пирата", но на Arduino. Имеет неплохую чувствительность даже на мелкие монеты. Стабилен в не зависимости от температуры и заряда батареи. Схема максимально упрощена.

Из недостатков можно отметить отсутствие возможности определять тип металла. Определять тип могут только металлоискатели с радио излучающим принципом детектирования (сложны в устройстве и требуют точной настройки). Импульсный металлоискатель в свою очередь работает на магнитном детектировании индукционных токов в металле. Индукция при поиске не различима для черный и цветных металлов.

К слову сказать, что есть еще третий тип металлоискателей - частотный. Малоэффективная и очень простая конструкция в основе которой генератор колебаний магнитного контура, который чувствителен к изменению величины индукции катушки. Мы ее рассматривать не будем из-за низкой чувствительности. Личный эксперименты по разработке такой конструкции в лучшем случае позволяли детектировать сковородку на 20 см глубины. На монет реагировал только в "упор". Практически бесполезная штука. По тому от нее сразу отказался.

-2

Наша схема импульсного металлоискателя имеет в себе несколько основных компонентов. Arduino генерирует импульсы, они усиливаются полевым транзистором (силовым ключом) который в свою очередь индуцирует импульсы магнитное поле в катушке. Магнитный импульс проходит до искомого металла и индуцирует в нем ток, а затем обратный сигнал магнитного поля. Этот обратный магнитный поток через небольшую задержку возвращается обратно в катушку металлодетектора и генерирует импульс. Сигнал проходит мимо пары диодов (диоды нужны что бы ограничить напряжение до 1 вольта) и уходит на вход операционного усилителя. Усиленный сигнал попадает в arduino в котором высчитывается "спадающий хвост" после отключения катушки силовым ключем. Т.е. как раз ответ от искомого металлического предмета. В зависимости от времени спада мы можем судить о величине или удаленности объекта. Индикатор показывает эту величину в 8-и уровнях индикаторов.

К слову о катушке. Она должна быть диаметром 20 см с 20-ю витками провода 0,4 - 0,8 мм. Толщина провода так же влияет на индукцию всей катушки. Сильное отклонение от толщины провода приведет к ухудшению чувствительности прибора. Катушка вставлена в водопроводную ПВХ трубу и не имеет никаких дополнительных металлический соединений.

-3

Скетч программы содержит генератор импульсов и алгоритм обработки входящего сигнала с усилителя.

  • 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;
    }
    }
-4