» » » Металлоискатель на 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
15 комментариев
  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
    Причем люди интуитивно быстрей поймут о чем говорю Я.
    Можете и дальше пребывать в этом заблуждении.(( Технически грамотные люди будут в лёгком недоумении.

Добрый день, Гость!


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

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

Войти

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

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

Онлайн чат

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

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

Все комментарии