Оглавление:

Детектор импульсной индукции на основе Arduino - флип-катушка: 5 шагов (с изображениями)
Детектор импульсной индукции на основе Arduino - флип-катушка: 5 шагов (с изображениями)

Видео: Детектор импульсной индукции на основе Arduino - флип-катушка: 5 шагов (с изображениями)

Видео: Детектор импульсной индукции на основе Arduino - флип-катушка: 5 шагов (с изображениями)
Видео: Arduino metal detector 2024, Июль
Anonim
Детектор импульсной индукции на базе Arduino - перекидная катушка
Детектор импульсной индукции на базе Arduino - перекидная катушка
Детектор импульсной индукции на базе Arduino - перекидная катушка
Детектор импульсной индукции на базе Arduino - перекидная катушка

Идея

Создав в прошлом несколько металлоискателей с разными результатами, я хотел изучить возможности Arduino в этом направлении.

Есть несколько хороших примеров того, как построить металлоискатели с помощью Arduino, некоторые из них приведены в качестве инструкций. Но, глядя на них, обычно требуется либо довольно много внешних компонентов для обработки аналогового сигнала, либо чувствительность довольно низкая.

Когда вы думаете о металлоискателях, главная тема - как уловить небольшие изменения напряжения в сигналах, связанных с поисковой катушкой. Эти изменения обычно очень незначительны. Наиболее очевидный подход - использовать аналоговые входы ATmega328. Но если посмотреть на спецификации, можно заметить две основные проблемы: они (часто) слишком медленные и разрешение (в большинстве случаев) низкое.

С другой стороны, Arduino работает на частоте 16 МГц и имеет некоторые возможности синхронизации. е. разрешение 0,0625 мкс при использовании тактовой частоты. Таким образом, вместо использования аналогового входа для измерения, самый простой способ измерения небольших динамических изменений напряжения - это сравнить изменение падения напряжения с течением времени при фиксированном опорном напряжении.

Для этой цели ATmega328 имеет удобную функцию внутреннего компаратора между D6 и D7. Этот компаратор может запускать прерывание, обеспечивая точную обработку событий. Не считая аккуратно закодированных процедур синхронизации, таких как millis () и micos (), и использования внутреннего таймера ATmega328 с гораздо более высоким разрешением, Arduino является отличной основой для подходов к обнаружению металлов.

Таким образом, с точки зрения исходного кода, хорошим началом было бы запрограммировать внутренний компаратор для «изменения» полярности входов и использовать внутренний счетчик с максимально возможной скоростью для изменения времени изменений.

Общий код в Arduido для этого:

// Определение всех необходимых предварительных переменных и т. Д. И настройка регистров

беззнаковый символ clockSelectBits = _BV (CS10); // без предварительного масштабирования, полный xtal void setup () {pinMode (6, INPUT); // + компаратора - установив их как INPUT, они // устанавливаются на высокий импеданс pinMode (7, INPUT); // - компаратора - установив их как INPUT, они // устанавливаются на высокий импеданс cli (); // остановка прерываний TCCR1A = 0; // установить для всего регистра TCCR1A значение 0 TCCR1B = 0; // то же самое для TCCR1B -> нормальный режим TCNT1 = 0; // инициализировать значение счетчика 0; TCCR1B | = clockSelectBits; // устанавливает предварительный делитель и запускает часы TIMSK1 = _BV (TOIE1); // устанавливает бит разрешения прерывания при переполнении таймера sei (); // разрешить прерывания ACSR = (0 << ACD) | // Аналоговый компаратор: включен (0 << ACBG) | // Выбор ширины запрещенной зоны аналогового компаратора: AIN0 применяется к положительному входу (0 << ACO) | // Выход аналогового компаратора: Выкл. (1 << ACI) | // Флаг прерывания аналогового компаратора: очистить ожидающее прерывание (1 << ACIE) | // Прерывание аналогового компаратора: включено (0 << ACIC) | // Захват входа аналогового компаратора: отключен (0 << ACIS1 | 0 << ACIS0 // прерывание при переключении выхода // (0 << ACIS1 | 1 << ACIS0 // зарезервировано // (1 << ACIS1 | 0 << ACIS0 // прерывание по заднему фронту выхода // (1 << ACIS1 | 1 << ACIS0 // прерывание по переднему фронту входного сигнала;}

// эта процедура вызывается каждый раз, когда компаратор создает прерывание

ISR (ANALOG_COMP_vect) {oldSREG = SREG; cli (); timeStamp = TCNT1; SREG = oldSREG; }

// эта процедура вызывается каждый раз при переполнении внутреннего счетчика

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// эта процедура используется для сброса таймера на 0

void resetTimer (недействительно) {oldSREG = SREG; cli (); // Отключить прерывания TCNT1 = 0; // инициализировать значение счетчика 0 SREG = oldSREG; // Восстановление регистра состояния TCCR1B | = clockSelectBits; // устанавливает предварительный делитель и запускает часы timer1_overflow_count = 0; // сбрасывает счетчик переполнения}

Конечно, эта идея не совсем нова. Основную часть этого кода можно найти в другом месте. Хорошая реализация такого подхода для микроконтроллера, найденная на домашней странице TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (к сожалению, эта страница больше не в сети, в настоящее время есть резервная копия сайта на www.basic4mcu.com, ищите "TPIMD").

Шаг 1: идея импульсной индукции Arduino - перекидная катушка

Идея импульсной индукции Arduino - флип-катушка
Идея импульсной индукции Arduino - флип-катушка
Идея импульсной индукции Arduino - флип-катушка
Идея импульсной индукции Arduino - флип-катушка

Идея состоит в том, чтобы использовать Arduino в качестве детектора импульсной индукции, как в TPIMD, поскольку идея синхронизации кривой затухания, кажется, работает довольно хорошо. Проблема с датчиками импульсной индукции заключается в том, что для работы им обычно требуется другое напряжение. Одно напряжение для питания катушки и отдельное напряжение для работы с кривой затухания. Эти два источника напряжения всегда немного усложняют работу импульсных индукционных детекторов.

Глядя на напряжение катушки в детекторе PI, полученную кривую можно разделить на два разных этапа. Первый этап - это сам импульс, питающий катушку и создающий магнитное поле (1). Второй этап - это кривая спада напряжения, начиная с пика напряжения, а затем быстро регулируется до «обесточенного» напряжения катушки (2). Проблема в том, что катушка меняет полярность после импульса. Если импульс положительный (Var 1. на прилагаемом рисунке), кривая затухания отрицательна. Если импульс отрицательный, кривая затухания будет положительной (Вариант 2 на прилагаемом рисунке).

Чтобы решить эту основную проблему, катушку необходимо «перевернуть» электронным способом после импульса. В этом случае импульс может быть положительным, а кривая затухания также может быть положительной.

Для этого катушка должна быть изолирована от Vcc и GND после импульса. В этот момент через демпфирующий резистор протекает только ток. Эту изолированную систему катушки и демпфирующего резистора можно «ориентировать» на любое опорное напряжение. Теоретически это создаст комбинированную положительную кривую (внизу рисунка).

Затем эту положительную кривую можно использовать через компаратор для определения момента времени, когда напряжение затухания «пересекает» опорное напряжение. Если рядом с катушкой находятся сокровища, кривая затухания меняется, и момент времени, пересекающий опорное напряжение, меняется. Это изменение можно обнаружить.

После некоторых экспериментов оказалось, что следующая схема работает.

Схема состоит из модуля Arduino Nano. Этот модуль управляет двумя MOSFET-транзисторами, питающими катушку (на SV3) через D10. Когда импульс на D10 заканчивается, оба полевых МОП-транзистора изолируют катушку от 12 В и заземления. Сохраненная энергия в катушке уходит через R2 (220 Ом). В то же время R1 (560 Ом) соединяет бывший положительный полюс катушки с GND. Это изменяет отрицательную кривую затухания на R5 (330 Ом) на положительную. Диоды защищают входной вывод Arduino.

R7 - это делитель напряжения около 0,04 В. В тот момент, когда кривая затухания на D7 становится более отрицательной, чем 0,04 на D6, запускается прерывание и сохраняется длительность после окончания импульса.

Если металл находится рядом с катушкой, кривая затухания длится дольше, и время между окончанием импульса и прерыванием увеличивается.

Шаг 2: Сборка детектора (макетная плата)

Сборка детектора (макетная плата)
Сборка детектора (макетная плата)
Сборка детектора (макетная плата)
Сборка детектора (макетная плата)
Сборка детектора (макетная плата)
Сборка детектора (макетная плата)

Построить детектор довольно просто. Это можно сделать либо на макетной плате (придерживаясь оригинальной схемы), либо путем пайки деталей на печатной плате.

Светодиод D13 на плате Arduino Nano используется как индикатор металла.

Самый быстрый путь к работающему детектору - развязать макетную плату. Требуется довольно много проводки, но это можно сделать на небольшой макетной плате. На рисунках это показано в 3 этапа, поскольку Arduino и MOSFET скрывают некоторые провода. При тестировании я почему-то отключил диоды, сначала не заметив. Это не оказало отрицательного влияния на поведение детектора. В версии схемы для печатной платы я их полностью исключил.

На рисунках не показаны подключения к OLED-дисплею 0.96. К этому дисплею подключены:

Vcc - 5В (на выводе Arduino, а не на питающем напряжении !!!)

GND - GND

SCL - A5

ПДД - А4

Этот OLED-дисплей необходим для первоначальной калибровки детектора. Это делается путем установки правильного напряжения на PIN6 Arduino. Это напряжение должно быть около 0,04 В. Дисплей помогает установить правильное напряжение.

Макетная версия работает довольно хорошо, хотя, вероятно, не подходит для выхода в дикую природу.

Шаг 3: Собираем печатную плату

Идет печатная плата
Идет печатная плата
Собирается печатная плата
Собирается печатная плата
Собирается печатная плата
Собирается печатная плата
Идет печатная плата
Идет печатная плата

Что касается пайки, мне не очень нравятся двухсторонние высокотехнологичные печатные платы, поэтому я модифицировал схему, чтобы она соответствовала односторонней печатной плате.

Были внесены следующие изменения:

1. диоды не использовались.

2. на затворах полевых МОП-транзисторов установлен резистор на 10 Ом.

3. Напряжение питания делителя напряжения на D6 задается сигналом ВЫСОКОГО уровня на D8.

4. Был изменен вывод драйвера для полевых МОП-транзисторов.

Таким образом можно создать одностороннюю печатную плату, которую можно паять на универсальные печатные платы. Используя эту схему, у вас будет рабочий PI-детектор только с 8-10 внешними компонентами (в зависимости от того, используется ли OLED-дисплей и / или динамик).

Шаг 4: Настройка и использование детектора

Установка и использование детектора
Установка и использование детектора
Установка и использование детектора
Установка и использование детектора
Установка и использование детектора
Установка и использование детектора

Если детектор построен правильно и программа написана для Arduino, самый простой (если не единственный) способ настройки устройства - использовать OLED-дисплей. Дисплей подключен к 5V, GND, A4, A5. После включения устройства на дисплее должно появиться сообщение «калибровка». Через несколько секунд он должен сказать «калибровка выполнена», и на дисплее должны появиться три числа.

Первое число - это «эталонное значение», определенное во время калибровки. Второе значение - это последнее измеренное значение, а третье значение - среднее значение последних 32 измерений.

Эти три значения должны быть более или менее одинаковыми (в моих тестовых примерах до 1000). Среднее значение должно быть более-менее стабильным.

Для начала первоначальной настройки рядом с катушкой не должно быть металла.

Теперь делитель напряжения (подстроечный потенциометр) должен быть настроен так, чтобы два нижних значения были установлены на максимум, но при этом оставались стабильными. Есть критическая настройка, когда среднее значение начинает давать странные значения. Поверните триммер, чтобы снова получить стабильные значения.

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

Для моей установки (катушка: 18 витков на 20 см) стабильное значение составляет около 630-650. После настройки нажмите кнопку сброса, устройство повторно откалибрует, и все значения дерева снова должны быть в одном диапазоне. Если металл теперь попадает в катушку, светодиод на плате Arduino (D13) должен загореться. Подключенный динамик издает щелчки (там есть место для улучшения программирования).

Чтобы предотвратить завышенные ожидания:

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

Чтобы получить представление о возможностях, он провел несколько контрольных обнаружений с помощью других детекторов. Глядя на результаты, они по-прежнему впечатляют для детектора всего с 8 внешними деталями, но не подходящими для профессиональных детекторов.

Глядя на схему и программу, есть много возможностей для улучшения. Номиналы резисторов определены опытным путем, время импульса 250 мс выбрано случайным образом, параметры катушки тоже. Если у вас есть идеи по улучшению, я буду более чем счастлив их обсудить.

Повеселись!

Шаг 5: Обновление 1: Использование ЖК-дисплея 16x2

Обновление 1: использование ЖК-дисплея 16x2
Обновление 1: использование ЖК-дисплея 16x2
Обновление 1: использование ЖК-дисплея 16x2
Обновление 1: использование ЖК-дисплея 16x2
Обновление 1: использование ЖК-дисплея 16x2
Обновление 1: использование ЖК-дисплея 16x2

Улучшения

Во время дальнейшего тестирования я понял, что библиотека для OLED-дисплея I2C израсходовала значительное время. Поэтому я решил использовать вместо него дисплей 16x2 с преобразователем I2C.

Поэтому я применил программу к ЖК-дисплею, добавив несколько полезных функций. В первой строке дисплея теперь отображается мощность сигнала возможной индикации. Вторая строка теперь показывает два значения. Кулак показал отклонение текущего сигнала от калибровочного значения. Это значение должно быть «0». Если это значение постоянно отрицательное или положительное, детектор следует повторно откалибровать, нажав кнопку сброса. Положительные значения указывают на наличие металла рядом с катушкой.

Второе значение показывает фактическое значение задержки кривой затухания. Это значение обычно не так интересно, но оно необходимо для первоначальной настройки детектора.

Программа теперь позволяет использовать несколько импульсов в последовательности (средство экспериментирования / улучшения характеристик). Никакого прорыва я не добился. Таким образом, по умолчанию установлена длительность одного импульса.

Первоначальная настройка детектора

При настройке детектора актуально второе значение второй строки (первое можно не учитывать). Изначально значение может быть «нестабильным» (см. Рисунок). Поворачивайте подстроечный резистор, пока значение не станет стабильным. Затем поверните его, чтобы увеличить значение до максимально стабильного значения. Нажмите кнопку сброса, чтобы выполнить повторную калибровку, и детектор готов к работе.

У меня сложилось впечатление, что установив максимально стабильное значение, я потерял чувствительность к металлам, не являющимся железом. Так что, возможно, стоит немного поэкспериментировать с настройками, чтобы получить хорошую чувствительность для не-железа.

Катушки

Строю 3 катушки для дальнейшего тестирования

1 -> 18 витков на 200 мм

2 -> 25 витков на 100 мм

3 -> 48 витков на 100 мм

Интересно, что все катушки работали довольно хорошо, с почти одинаковыми характеристиками (20-каратная монета при 40-50 мм в воздухе). Это могло быть довольно субъективным наблюдением.

Рекомендуемые: