Металлоискатель на Ардуино
В этой статье разберём схему одного из простейших металлоискателей, собранную с Ардуино. Конечно, по своим характеристикам такой металлоискатель очень далёк от профессиональных моделей, но, как экспериментальная схема для изучения основ Ардуино вполне сгодится.
В основе схемы лежит LC-генератор, собранный на логической микросхеме. Катушка этого генератора является чувствительным элементом: когда вблизи появляется металлический предмет, индуктивность немного меняется, что вызывает изменение частоты генерации. Это изменение и анализируется с помощью «мозгового центра» схемы, собранного на Ардуино.
Некоторые типы металлодетекторов
Есть разные способы детектирования металлов. Например, металлодетектор на принципе срыва генерации разобран здесь. Ну а герой данной статьи родился из другого класса металлодетекторов: на биениях частоты. Принцип их работы основан на том, что сравниваются частоты двух генераторов: опорного и измерительного.
Металлоискатель на биениях
Перед началом работы схема настраивается таким образом, чтобы частоты генераторов совпадали. Когда в поле зрения катушки измерительного генератора появляется металл, его частота «уходит». Из-за этого на нелинейном элементе, на который поступают сигналы обоих генераторов, возникают разностные частоты (биения), которые и сигнализируют о присутствии металла.
По моему опыту, такие металлоискатели довольно капризны. Частоты генераторов могут плавать сами по себе, из-за случайных факторов, что приводит к ложным срабатываниями и необходимости постоянно подстраивать металлоискатель.
Применение Ардуино позволяет запрограммировать более умную и сложную реакцию на изменение частоты.
- Во-первых, становится не нужен опорный генератор.
- Во-вторых, алгоритм обучен не реагировать на плавный уход частоты и самоподстраивается под небольшие изменения.
- В-третьих, можно дифференцировать несколько уровней сигнала.
Таким образом, металлоискатель на принципе биений превратился в металлоискатель на принципе измерения частоты.
Cхема
Измерительный генератор собран на двух элементах 2И-НЕ. Можно использовать микросхему К561ЛА7 или зарубежный аналог CD4011.
Простейший LC-генератор выглядел бы так:
Простейший LC-генератор на логической микросхеме
Но в нашей модели использована чуть более сложная схема, ёмкостная трёхточка. По отзывам, она даёт более стабильную частоту генерации. В итоге наш генератор вырабатывает импульсы с частотой примерно 70-100 кГц, которые поступают на цифровой вход 5 Ардуинки.
К аналоговому входу А0 подцеплен делитель напряжения R2-R3, он будет задавать чувствительность. Для индикации сигнала используются выводы 9 и 10, которые через токоограничивающие резисторы R4 и R5 подключены к светодиодам. Питание для генератора берётся с платы Ардуино.
Металлоискатель на макетной плате
Пара слов про измерительную катушку. Удобно её сделать из провода витой пары, которая повсеместно используется для подключения интернет. Диаметр катушки около 18 см, в ней 6 витков витой пары, это значит 48 витков провода. Главное, аккуратно соединить концы проводочков, чтобы получились последовательные витки и не было короткозамкнутых или оборванных витков.
Для более стабильной работы катушку рекомендуется экранировать, а экран подключить к общему проводу.
Скетч
Теперь обратимся к программе, или, как говорят ардуинщики, к скетчу. Я постарался добавить максимально подробные комментарии, но если останутся вопросы, пожалуйста, задавайте их в комментариях.
// подключаем библиотеку для измерения частоты
#include <FreqCount.h>
// опорное значение частоты, с которым будем сравнивать текущую частоту
unsigned long grnd = 0;
// **** задействованные номера входов-выходов
// FreqCount.h по умолчанию измеряет частоту на выходе #5, его задавать не нужно
// потенциометр установки чувствительности
int sensPin = 0;
// светодиоды уровень 1,2
int sigLed1 = 9;
int sigLed2 = 10;
void setup() {
// устанавливаем светодиодные пины в режим выходов
pinMode(sigLed1, OUTPUT);
pinMode(sigLed2, OUTPUT);
// запускаем измерение частоты: в течение 100мс считаем импульсы
// затем вычисляем частоту
FreqCount.begin(100);
}
void loop() {
// замеряем текущее значение частоты
// FreqCount.available вернёт истину, если прошло 100 мс и значение готово
// иначе просто уходим на следующий цикл, таким образом ждём результата измерения
if (FreqCount.available()) {
// считываем частоту, тем самым освобождаем буфер
// и сразу инициируем следующий 100мс цикл измерения
unsigned long count = FreqCount.read();
// если калибровка отсутствует (только что включили прибор)
// запоминаем опорное значение частоты и уходим на следующее измерение
if(!grnd){
grnd = count;
} else {
//работаем в штатном режиме
// насколько ушла частота от опорной?
int delta = count - grnd;
// автоподстройка калибровки
// добавляем четверть от дельты
// делать это нужно до применения abs()
grnd += delta / 4;
// частота может отклоняться и в плюс, и в минус,
// поэтому берём по модулю
delta = abs(delta);
// какая чувствительность установлена?
// пересчитываем в более удобную шкалу
// на входе sensPin у нас от половины до полного напряжения питания (см. схему)
// значит, в соответствии с нижеследующей формулой
// переменная sens примет значения примерно от 22 до 43
int sens = analogRead(sensPin)/25+2;
// в зависимости от соотношения sens и delta зажигаем или гасим
// наши индикаторные светодиоды
// превысили порог, частота ушла на более чем sens Гц
if(delta > sens){
digitalWrite(sigLed1, HIGH);
} else {
digitalWrite(sigLed1, LOW);
}
// превысили порог в два раза
if(delta > sens*2){
digitalWrite(sigLed2, HIGH);
} else {
digitalWrite(sigLed2, LOW);
}
}
}
}
Видео работы металлоискателя
В заключение, видео работающей схемы. Лучше всего металлоискатель реагирует на металлические предметы большой площади, поэтому для демонстрации я взял кусочек фольгированного текстолита. Хотя это и не совсем честно. На видео хорошо заметно, что схема реагирует именно на резкое изменение частоты генератора, что равно происходит и при приближении металла, и при удалении его из поля действия катушки.
Добавить комментарий