» » » Металлоискатель на Arduino Pro Mini. Переработка глубинника Колоколова-Щедрина по принципу «Прием-передача»

Металлоискатель на Arduino Pro Mini. Переработка глубинника Колоколова-Щедрина по принципу «Прием-передача»


Переработка схемы глубинника Колоколова-Щедрина. Отличия от оригинальной схемы:
1. Кварцевого генератора на микросхеме к561.. и кварце на 32 кГц- НЕТ. Сигнал 32 кГц дает Ардуино Про Мини.
2. Схемы звукового оповещения на нескольких микросхемах 561 серии тоже нет-озвучивает цели тоже Ардуино(И должен заметить отлично озвучивает, по сравнению с авторской схемой).
3. Питание от однополярного напряжения 12в(свинцовый акб).
4. Регулировка чувствительности кнопками. При шкале АЦП от 0 до 1023, порог срабатывания регулируется от 1 до 38(значение легко можно изменить в скетче).


Металлоискатель на Arduino Pro Mini. Переработка глубинника Колоколова-Щедрина по принципу «Прием-передача»


Самое главное, что хотелось показать в этой статье, что можно собрать МД на Ардуино не уступающий оригиналу по чувствительности(это получилось-т.к. оригиналов исходной схемы было собрано порядка 10шт, поэтому материал для сравнения есть). Оригинальная схема:


Когда я только начинал работу с Ардуино, я был так воодушевлен, что думал, что могу найти и собрать любую схему МеталлоДетектора из интернета на Ардуино, которую с легкостью найду на просторах большой помойки. В принципе так и оказалось, но схемы были на основе частотомера, что не позволило добиться реально хорошей дальности. Одни детские игрушки и проба пера+ попытки заработать на новичках. Оригинал данного мд является реальной рабочей лошадкой, позволяющей находить крупные предметы на расстоянии 2м (смотрите в гугле книгу Колоколова-Щедрина). Статистики по преображенному мд нет. Надеюсь она появится при поддержке фанатов МД и Ардуино. Схема работала с Ардуино Уно и Ардуино Про Мини.

Далее на ссылке выложен процесс рождения данного МД на сайте Паяльник, который длился не один год и подтолкнул автора к изучению программирования дуин. Возможно кому то скетч покажется убогим - с удовольствием приму ваши ИСПРАВЛЕНИЯ.


Ссылка на паяльник

На данный момент есть скетч позволяет регулировать барьер чуствтельности(вывод 7 дуины +1 к барьеру, вывод 8 -1 к барьеру). .
Ардуино про мини 5в, 16МГц, АТмега168 и дисплей использовал вот такие. Рядом для масштаба переходник Мини СД-


Как уже говорил 1602 стоит 86 рублей, ПроМини - 82 рубля. При желании можно вообще взять голую АТмегу168, разработать под нее плату и залить скетч прямо в нее. А так я например устанавливал при помощи разъема мама-папа на плату МД. На фото видно у Ардуино штекер на 6 пинов-через него и заливались скетчи прямо на плате.

Скетч-MD.Rx-Tx.ProMini.SrednjajaTochkaRegBar.ino

// A3-аналоговый вход для вольтметра
// А4-аналоговый вход для сигнала
// 6- вывод зука
// 9 - вывод частоты 31200 Гц
#include 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
                                       
  byte z1[8] = {                       // значок батарейки
  0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110 };
 
 int countleds = 0;                    // переменная для хранения значения уровня шкалы
 int voltag = 0;                       //переменная для хранения значения напряжения 
 int noll = 0;                         //переменная для хранения значения средней точки
   #define NUM_SAMPLES 10              // 10 аналоговых выборок для чтения за 1сек
   int sum = 0;                        // сумма взятых образцов
   int sun = 0;                        // то же, но деленное на 10
   unsigned char sample_count = 0;     // текущий номер выборки с 
   float voltage = 0.0;                // расчитаное напряжение 
   const int button1 = 7;              // кнопка барьер-плюс
   const int button2 = 8;              // кнопка барьер-минус
   int i =5;                           // барьер 
   
void setup(){
     lcd.begin(16, 2);                 // инициализация дисплея
     lcd.setCursor(1, 0);
     lcd.print("CXEM.NET");
     lcd.setCursor(10, 1);
     lcd.print("Rx-Tx");
     delay(3000);
     lcd.clear();
     
     TCCR1A = TCCR1A & 0xe0 | 2;
     TCCR1B = TCCR1B & 0xe0 | 0x09;
     analogWrite(9 ,126);              // на выводе 10 ШИМ=50% f=31200Гц
     
     lcd.createChar(1, z1);
     }
     
void loop()  {
     int buttonState1 = HIGH;           // Состояние кнопки один
     int buttonState2 = HIGH;           // Состояние кнопки два
   sample_count = 0;                    //сбрасываем контур кол-ва сложений
   sum = 0;                             //сбрасываем сумму 10ти сложений
   while (sample_count < NUM_SAMPLES) {
   sum += analogRead(A4);               // к сумме плюсуется очередное измерение
   sample_count++;                      // к номеру измерения плюсуется единица
   sun = sum/10;}                       // находим среднее значение из 10ти измерений
   
   noll = analogRead (A3)/2;            // средняя точка питания
   float voltage = map(analogRead (A3),0,1023,0,1500)/100.0;
                                        //Вольтметр, построенный на входе А3
   if (sun >= noll + i) {countleds = map(sun, noll+i, noll*2 - 250, 9, 14); 
                                        // если полученный рез-т  на 9-15 сегмент шкалы
    tone(6, countleds*100);}                                 
   if (sun <= noll - i) {countleds = map(sun, 116, noll - i, 0, 7);
                                        // если полученный рез-т  на 0-7 сегмент шкалы
    tone(6, countleds*50); }
     if (sun < noll && sun >=noll - (i-1)) {countleds = 7 ;  
    noTone(6); }                        //островок виртуального НУЛЯ(7 сегмент)
     if (sun > noll && sun <= noll + (i-1)) {countleds = 8 ; 
    noTone(6); }                        //островок виртуального НУЛЯ шкалы(8 сегмент)

   
    {lcd.setCursor(countleds, 0);       // устанавливаем курсор в колонку countleds, строку 0
    lcd.print("\xff");                  // закрашенный значок
    lcd.setCursor(0, 1);                // перемещаем во 2 строку, столбец-0
    lcd.print(char(1));                 // Индикация значка батарейки
    lcd.setCursor(1, 1);                // перемещаем на указание напряжения
    lcd.print(voltage);                 // вольтаж
    lcd.setCursor(7, 0);                // 8й столбец 1я строка
    if (sun < noll ) { lcd.print("{");} // печать 
    lcd.setCursor(8, 0);                // 9й столбец 1я строка
    if (sun > noll ) { lcd.print("}");} // печать
    lcd.setCursor(7, 1);
    lcd.print("B=");
    lcd.setCursor(9, 1);               // 11 столбец 2я строка
    lcd.print(i);                       // барьер
    lcd.setCursor(13, 1);               // 13й столбец 2я строка
    lcd.print(sun);                     // печать усредненного значения значения АЦП
    delay(100);                         // ждём
    
  buttonState1 = digitalRead(button1);  // Чтение состояния кнопки 1
  buttonState2 = digitalRead(button2);  // Чтение состояния кнопки 2
  if (buttonState1 == LOW) { i =i + 1 ; delay(50);}
                                        // При нажатой кнопке барьер вырастает на 1. Задержка 50
  if (buttonState2 == LOW) { i =i - 1 ; delay(50);} 
                                        // При нажатой кнопке барьер снижается на 1. Задержка 50
  if (i < 1) { i = 1;}                  // Нижняя граница барьера
  if (i > 38) {i = 38;}                 // Верхняя граница барьера
 
 lcd.clear();
    }
}

Автоноль не использовал.Последние два элемента ТЛ074 остались без дела. Но на схеме и плате они есть. Может появится желание довести их до рабочего состояния чуть позже. Я считаю, что я своего добился. Блок индикации работает чудесно. Все остальное зависит от МД.

Источник
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Простейший металлоискатель на микросхеме К176ЛА7

Пинпоинтер «Малыш FM2V2» с различием металлов

9.7
Идея
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
10
Описание
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
10
Исполнение
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Итоговая оценка: 9.89 из 10 (голосов: 6 / История оценок)

Добавить комментарий

    • smilesmilesxaxaokdontknowyahoonea
      bossscratchfoolyesyes-yesaggressivesecret
      sorrydancedance2dance3pardonhelpdrinks
      stopfriendsgoodgoodgoodwhistleswoontongue
      smokeclappingcraydeclarederisivedon-t_mentiondownload
      heatirefullaugh1mdameetingmoskingnegative
      not_ipopcornpunishreadscarescaressearch
      tauntthank_youthisto_clueumnikacuteagree
      badbeeeblack_eyeblum3blushboastboredom
      censoredpleasantrysecret2threatenvictoryyusun_bespectacled
      shokrespektlolprevedwelcomekrutoyya_za
      ya_dobryihelperne_huliganne_othodifludbanclose
17 комментариев
  1. puteec_80 Автор
    Тем кто будет смотреть скетч. Знаки >= и <= заменены на странные комбинации &gt и &lt. Почему не знаю. Когда вылаживал было нормально.
  2. puteec_80 Автор
    Новый скетч. Изменен алгоритм обнаружения полезного сигнала. Схема упрощена, нет элементов D3.4 и D3.3 со всей их обвязкой. Если брать родную печатку, то все эти детали можно просто не устанавливать. Больше чуствительность. Нет ложных сработок.
    Скетч:

    //A3-аналоговый вход для вольтметра.Выставляется потенциометром R32.
    // А4-аналоговый вход для сигнала.Выставляется при минимальном сигнале на D3.2
    // резистором R40 для показаний АЦП примерно 510.
    // 6- вывод зука
    // 9 - вывод частоты 31200 Гц
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    byte z1[8] = { // значок батарейки
    0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110 };
    int countleds = 0; // переменная для хранения значения уровня шкалы

    float voltage = 0.0; // расчитаное напряжение
    const int button1 = 7; // кнопка барьер-плюс
    const int button2 = 8; // кнопка барьер-минус
    int i = 5; // барьер
    const float K = 0.1; // фильтр отслеживающий быстрые изменения(коэф. чем меньше тем сильнее)
    const float L = 0.07; // фильтр отслеживающий изменения за длительное время
    float sign = 0; // фильтр
    float noll = 0;

    void setup(){
    lcd.begin(16, 2); // инициализация дисплея
    lcd.createChar(1, z1);
    pinMode(9, OUTPUT);
    pinMode(6, OUTPUT);
    TCCR1A = TCCR1A & 0xe0 | 2;
    TCCR1B = TCCR1B & 0xe0 | 0x09;
    analogWrite(9 , 126); // на выводе 10 ШИМ=50% f=31200Гц
    //на самом деле для ШИМ = 50% нужно ставить заполнение хотя бы 220, согласно осцилографу
    //дуина не справляется. Здесь не критично.
    }
  3. puteec_80 Автор
    void loop() {
    int buttonState1 = HIGH; // Состояние кнопки один
    int buttonState2 = HIGH; // Состояние кнопки два

    int pot = analogRead(A4); // фильтр быстрого изменения сигнала
    sign = sign*(1-K) + pot*K;

    noll = noll*(1-L) + sign*L; // фильтр длительного отслеживания сигнала
    //Вольтметр, построенный на входе А3
    float voltage = map(analogRead (A3),0,1023,0,1500)/100.0;

    if (sign >= noll + i) {countleds = map(sign, noll+i, 1023 , 9, 14);
    // если полученный рез-т на 9-15 сегмент шкалы
    tone(6, countleds*100);}
    if (sign <= noll - i) {countleds = map(sign, 0, noll - i, 0, 7);
    // если полученный рез-т на 0-7 сегмент шкалы
    tone(6, countleds*50); }
    if (sign < noll && sign >= noll - (i-1)) {countleds = 7 ;
    noTone(6); } //островок виртуального НУЛЯ(7 сегмент)
    if (sign > noll && sign <= noll + (i-1)) {countleds = 8 ;
    noTone(6); } //островок виртуального НУЛЯ шкалы(8 сегмент)


    {lcd.setCursor(countleds, 0); // устанавливаем курсор в колонку countleds, строку 0
    lcd.print("\xff"); // закрашенный значок
    lcd.setCursor(0, 1); // перемещаем во 2 строку, столбец-0
    lcd.print(char(1)); // Индикация значка батарейки
    lcd.setCursor(1, 1); // перемещаем на указание напряжения
    lcd.print(voltage); // вольтаж
    lcd.setCursor(7, 0); // 8й столбец 1я строка
    if (sign < noll ) { lcd.print("{");} // печать
    lcd.setCursor(8, 0); // 9й столбец 1я строка
    if (sign > noll ) { lcd.print("}");} // печать
    lcd.setCursor(7, 1);
    lcd.print("B=");
    lcd.setCursor(9, 1); // 11 столбец 2я строка
    lcd.print(i); // барьер
    lcd.setCursor(13, 1); // 13й столбец 2я строка
    lcd.print(sign); // печать усредненного значения значения АЦП
    delay(10); // ждём

    buttonState1 = digitalRead(button1); // Чтение состояния кнопки 1
    buttonState2 = digitalRead(button2); // Чтение состояния кнопки 2
    if (buttonState1 == LOW) { i = i + 1 ; delay(50);}
    // При нажатой кнопке барьер вырастает на 1. Задержка 50
    if (buttonState2 == LOW) { i = i - 1 ; delay(50);}
    // При нажатой кнопке барьер снижается на 1. Задержка 50
    if (i < 1) { i = 1;} // Нижняя граница барьера
    if (i > 38) {i = 38;} // Верхняя граница барьера

    lcd.clear();
    }
    }
  4. puteec_80 Автор
    На схеме не показаны кнопки регулировки барьера. Они подключены к выводам 7 и 8 Ардуино. Подтянуты каждая сопротивлением 10к к плюсу, замыкаются при нажатии на массу.
    1. Иван_Похмельев
      Может быть, не "барьера", а порога? ;)
      1. puteec_80 Автор
        Может. Но не вижу разницы.
        1. Иван_Похмельев
          Разница существенная: порог - технический термин, барьер - "палка поперёк дороги".
        2. puteec_80 Автор
          Ну значит все зарубежные инженеры прыгают через палку на дороге. В зарубежных мд в меню так и написано "Barier".Товарищи Иван, вы падает в моих глазах со столь мелочными придирками! Где Ваши замечания по существу? После которых приходиться хлопать себя ладонью плашмя по лбу? Раньше вы меня часто баловали punish
  5. Иван_Похмельев
    Цитата: puteec_80
    В зарубежных мд в меню так и написано "Barier".

    Я Вас, возможно, удивлю, но многие английские слова, внешне похожие на наши, имеют другой смысл, иногда близкий, иногда - нет. Поищите по словам "ложные друзья переводчика".
    Теперь по сути. В русской технической документации нет такого словосочетания "барьер чувствительности", просто нет - и всё! Есть "порог чувствительности", в некоторых случаях можно сказать "предел чувствительности", но никак не "барьер чувствительности". Возможно, в каких-то других отраслях знания он и применяется, но не в электронике.
    1. puteec_80 Автор
      Я в данном случае все таки склонен все же употребить слово "барьер", т.к. именно барьер выставлен в тексте программы, лишь не попадая в его диапазон сигнал воспринимается микроконтроллером как полезный. Причем именно барьер т.к. имеет два значения -верхняя и нижняя граница сработки т.е. сработка происходит выше "верхней" и ниже "нижней" границы барьера по шкале АЦП. Впрочем вам виднее. Назовите их нижний и верхний порог.
      Может значения переведенных слов и не совпадают или чуть-чуть не совпадают. Зато прекрасно описывают процесс и постепенно входят в сленг.
      Кстати. Чувствительность и барьер совершенно разные вещи.
      Да. Они пересекаются. Но не более.
  6. Иван_Похмельев
    Цитата: puteec_80
    Назовите их нижний и верхний порог.
    Может значения переведенных слов и не совпадают или чуть-чуть не совпадают. Зато прекрасно описывают процесс и постепенно входят в сленг.
    Именно что порог. Порог срабатывания - в Вашем случае. Объясните, пожалуйста, как "барьер" описывает процесс.
    Насчёт вхождения в сленг - сейчас много всяких недоразумений туда входят.((
    1. puteec_80 Автор
      Давайте останемся при своих. Я буду писать "повышение барьера на одну единицу" и "чувствительность приемника составила 5мкВ". А вы пишите " Повышение порога срабатывания на одну единицу" и "порог чувствительности приемника.." Причем люди интуитивно быстрей поймут о чем говорю Я.
      И поясняю в данном примере. Нет порога строго говоря, потому как нет четкой шкалы отсчёта. Есть какая-то вырезаемая плавающая полоса из плавающего сигнала. Так вот к этой "плавающей" полосе, как мне кажется, гораздо больше подходит определение барьер, чем порог.
      Вообще беспредметный и тупой спор. По существу вопросы есть?
  7. Korolev
    БАРЬЕ́Р, -а, муж.
    1. Преграда (род стенки, перекладина), поставленная на пути.
    2. Загородка, ограждение.

    ПОРО́Г, порога, муж.
    1. В науке и технике порогом называют наименьшую величину, степень проявления чего-либо.
    Порог чувствительности прибора. | Порог слышимости. | Порог болевого ощущения. | Датчик срабатывает при превышении установленного порога температуры.
    smile
    1. puteec_80 Автор
      Ну вот! Ни о какой наименьшей величине даже речи не идёт! Спасибо за пояснение.
  8. Иван_Похмельев
    Цитата: puteec_80
    Причем люди интуитивно быстрей поймут о чем говорю Я.
    Можете и дальше пребывать в этом заблуждении.(( Технически грамотные люди будут в лёгком недоумении.
    1. Гость Александр
      Как же теперь быть, ведь бывает еще барьер Шоттки?
  9. Гость Евгений
    Какие пределы обнаружения объектов? Золото, алюминий, медь.

Привет, Гость!


Зарегистрируйтесь

Или войдите на сайт, если уже зарегистрированы...

Войти

Добавьте самоделку

Добавьте тему

Онлайн чат

Опрос
А Вы уже рассказали на сайте о своей самоделке?

Последние комментарии

Все комментарии
Новые самоделки на почту

Введите электронную почту и получайте письма с новыми самоделками. Не более одного письма в день.