Электрификация

Справочник домашнего мастера

Металлоискатель на ардуино

Поиск артефактов под землей — довольно популярное занятие. Для кого-то, это профессия, кто-то просто увлекается археологией. Существуют многочисленные группы кладоискателей: как романтиков, так и прагматичных добывателей ценностей. Всех этих людей объединяет одна страсть: поиск металлических предметов, спрятанных на различной глубине.

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

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

Важная информация: Применение подобных приборов не запрещено Законом. Однако существуют наказания за последствия такого поиска, касающиеся раскопок, а также извлечения обнаруженных предметов.

Не будем вдаваться в тонкости, это тема другой статьи. Проще говоря: если вы нашли золотое кольцо на пляже, либо горсть советских монет в лесу — проблем, связанных с применением электронных средств поиска не будет.

А вот за извлеченные бронзовые ложки возрастом от 100 лет и старше, можно получить реальный срок или крупный штраф.

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

Содержание

Принцип работы устройства

В отличие от детекторов грунта, работающих с использованием волн различной частоты или ультразвука, металлоискатель (фабричный, или созданный своими руками), работает с индуктивностью.

Катушка излучает электромагнитное поле, которое затем анализируется приемником. Если в зоне действия оказывается любой предмет, который проводит электроток, либо имеет ферромагнитные свойства — формат поля искажается. Точнее сказать, под действием активного поля катушки, объект формирует собственное. Это событие фиксируется приемником, и генерируется оповещение: перемещается стрелка прибора, звучит тональный сигнал, загораются световые индикаторы.

Зная методику работы, можно рассчитать электрическую схему, и создать мощный металлоискатель своими руками. Сложность конструкции зависит только от наличия элементной базы и вашего желания. Рассмотрим несколько популярных вариантов, как собрать самодельный металлоискатель:

Так называемая «бабочка»

Такое прозвище получено из-за характерной формы площадки, на которой расположены катушки индуктивности.

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

Генераторы реализуются на микросхемах NE555. На иллюстрации изображена типовая схема такого прибора.

Катушка для металлоискателя (их две, на схеме: L1 и L2) делается своими руками из провода сечением 0.5–0.7 мм². Идеальный вариант — трансформаторная обмоточная медная жила в лаковой изоляции (извлекается из любого ненужного трансформатора). Характеристики не обязательно выдерживать с ювелирной точностью, при одном условии: катушки должны быть одинаковыми.

Примерные параметры: диаметр 190 мм, в каждой катушке ровно 30 витков. Собранное изделие должно быть монолитным. Для этого витки прихватываются монтажной нитью, и заливаются трансформаторным лаком. Если этого не сделать, вибрация витков будет сбивать схему с настроенного баланса.

Электрическая схема

Есть два варианта изготовления:

  • учитывая малое количество элементов, можно собрать ее на макетной плате, соединив ножки деталей с помощью проводников;
  • для аккуратности и надежности, лучше вытравить плату по предложенному чертежу.

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

Так же, как и металлоискатель на транзисторах, прибор на NE555 нуждается в точной настройке перед использованием. На схеме видно три переменных резистора:

  • R1 предназначен для настройки частоты генератора и достижения того самого баланса;
  • R2 грубо настраивает чувствительность;
  • с помощью резистора R3 можно выставить чувствительность с точностью до 1 см.

Информация: Подобная схема не может дискриминировать металлы. Искатель лишь дает понять, что объект существует. А по тональности сигнала (исходя из вашего опыта) можно определить приблизительный объем и глубину залегания.

Питание достаточно универсальное: 9–12 вольт. Можно подобрать АКБ от источника бесперебойного питания, или собрать блок питания из аккумуляторов формата ААА. Неплохой вариант — батареи 18650 (их еще используют для вейпа).

Настройка «бабочки»

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

Фиксируем кольца, и вращаем резистор R1 до появления устойчивого потрескивания с ровными интервалами.

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

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

Механическая часть

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

Искатель «бабочка» готов к работе.

Пират

Еще одна популярная импульсная модель для начинающих кладоискателей — металлоискатель «Пират» Его также легко сделать своими руками, подробная инструкция в двух вариантах:

  1. На той же микросхеме NE555. Это классический генератор, который начинает работать при появлении металла в зоне действия катушки. Никаких подстроек не требуется, просто в динамике раздастся писк.
  2. Металлоискатель, собранный на транзисторах, работает по такому же принципу. Собственно и схема аналогичная, только NE555 заменена транзисторным генератором на КТ315.

Питание желательно приблизить к 12 вольтам, поскольку качество работы зависит от напряжения. Печатные платы уже опробованы, оба варианта на иллюстрации.

Катушка (в данном случае одна) изготавливается из той же трансформаторной проволоки 0.5 мм. Оптимальный диаметр 20 мм, количество витков 25. Поскольку мы делаем металлоискатель «Пират» своими руками, внешний дизайн отходит на второй план. Подойдут любы материалы, которые вы готовы были выбросить.

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

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

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

Подводный металлоискатель своими руками сделать сложнее, но он даст неоспоримое преимущество перед конкурентами.

Улучшение характеристик

Глубинный металлоискатель своими руками без дополнительных затрат можно сделать из готового «Пирата». Для этого можно пойти двумя способами:

  1. Увеличение диаметра катушки индуктивности. При этом существенно повышается проницаемость вниз, но снижается чувствительность к небольшим предметам.
  2. Снижение числа витков катушки с одновременной подстройкой схемы. Для этого придется пожертвовать одной катушкой для экспериментов. Снимаем (и отрезаем) виток за витком, пока не увидим, что чувствительность начала снижаться. Запоминаем количество витков при максимальных параметрах, и делаем новую катушку для этой схемы. Затем меняем резистор R7 на переменный, с аналогичными параметрами мощности. Проведя несколько экспериментов с чувствительностью, фиксируем сопротивление, меняем переменник на постоянный резистор.

Металлоискатель «Пират» можно собрать на популярном контроллере «Ардуино».

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

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

Металлоискатель Clone PI W своими руками

По сути, это удешевленный вариант профессионального искателя Clone PI-AVR, только вместо ЖК дисплея применяется линейка светодиодов. Это не так удобно, но по-прежнему позволяет контролировать глубину залегания артефактов.

Оптимальный по цене вариант — на микросхеме CD4066 и микроконтроллере ATmega8.

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

Программирование ATmega8 — это тема отдельной статьи, если вы работали с такими контроллерами, никаких сложностей не возникнет.

Мощный металлоискатель Clone PI W, сделанный своими руками, позволяет находить металл не глубине более метра, правда без дискриминации.

Искатель «Шанс»

Похожая схема на контроллере ATmega8 называется «Шанс». Принцип работы аналогичный, только появилась возможность отсеивания (частичной дискриминации) черных металлов.

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

«Терминатор 3» своими руками

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

Особенность «Терминатора» состоит в разнесении приемной и передающей катушек. Для испускания сигнала изготавливается кольцо 200 мм. Для него укладывается 30 витков провода, затем он разрезается, в итоге мы получаем 2 полу-катушки общей емкостью 60 витков (смотреть схему).

Приемная катушка располагается внутри, 48 витков диаметром 100 мм.

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

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

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

Простые детекторы металла из готовых электроприборов

  • Металлоискатель из радиоприемника можно сделать, добавив к нему простой ВЧ передатчик:Поисковая катушка мотается из провода 0.5 мм²: 16 витков 12 см. При попадании в зону действия металлического предмета, приемник, настроенный на СВ/ДВ диапазон, будет менять тональность звука.
  • Самодельный металлоискатель из сотового телефона — это не более, чем миф. Модернизация его электросхемы в домашних условиях не реализуема, а заставить штатный мобильник работать детектором металл технически невозможно.
  • Металлоискатель из магнита, собственно, и делать не нужно. Вы просто подносите мощный неодимовый магнит к месту, где есть металлический предмет, и физически чувствуете силу притяжения. Разумеется, это работает только с металлами, имеющими ферромагнитные свойства (железо, сталь).

Вне зависимости от сложности схемы, изготовление самодельного металлоискателя потребует от вас достаточно времени и сил. Поэтому из любопытства, такие приборы не делают. А вот для профессионального использования — это отличная альтернатива фабричным экземплярам.

Видео по теме

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

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

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

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

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

цифровая электроника вычислительная техника встраиваемые системы

Металлоискатель на Arduino своими руками

Металлоискатель – это устройство, используемое для обнаружения присутствия металла в некоторой близости от этого металлоискателя, не касаясь самого металла. Такие устройства широко используют для поиска металлических предметов в земле, например, мин, кладов с драгоценными металлами, предметы старины и прочие вещи. Процесс бесконтактного обнаружения, используемый в металлоискателе, объясняется с помощью метода индуктивного зондирования. Основная концепция состоит в том, что наличие металла может изменять индуктивность индуктора (катушки). Таким образом, электронная начинка металлоискателя попросту определяет индуктивность катушки, которая зондирует исследуемую поверхность, и благодаря динамику или другому интерфейсному устройству оповещает пользователя о металлическом объекте поблизости.

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

По сути, с помощью Arduino можно создать простой индуктивный измеритель, то есть устройство, которое может использоваться для измерения неизвестной индуктивности катушки. В данном проекте используется обычный резонансный контур, в котором параллельно соединены конденсатор и катушка индуктивности. Естественная резонансная частота LC-контура изменяется в зависимости от присутствия металла поблизости от катушки. Для получения приемлемого для считывания сигнала с резонансного контура используется компаратор LM339. Поскольку колебания от LC-контура всегда будут в форме синусоидальной волны, то в этом проекте и используется детектор пересечения нуля на основе компаратора, чтобы преобразовать синусоидальную волну в прямоугольные частотные импульсы, чтобы плата Arduino могла измерять период этих импульсов, и на основе полученных данных о периоде оповещать о присутствии металла вблизи прибора. Благодаря встроенной в Arduino >

Схема металлоискателя на основе Arduino представлена ниже.

Далее приведен небольшой код (скетч) для Arduino, который позволит сделать простой металлоискатель.

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

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

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

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

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

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

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

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

Arduino pro mini – специализированная электронная платформа в виде микросхемы, предназначение которой состоит в создании электронных устройств. Следовательно, в микроконтроллере отсутствует привычная микросхема, роль которой заключается в поддержании связи с помощью USB-UART. Цена намного дешевле, в отличие от других представителей Arduino. Pro Mini или просто pro – модельный ряд, не оснащенный разъемами USB, которые используются для подключения и прошивания устройства.

Вместо этого существует программатор. Начинающий электронщик может выбрать из двух доступных вариантов изделия: Ардуино с 3,3 В и 8 МГц или Ардуино про мини 5 V, в котором доступна распиновка. Статья ниже познакомит читателя с особенностями модели и покажет, где можно использовать электронную плату.

Характеристика мк Arduino pro mini

Техническая сторона Arduino mini:

  • рабочее напряжение, требуемое для нормальной работоспособности – 3,3 и 5 Вольт;
  • напряжение, используемое при входе – 3-12 или 5-12 Вольт;
  • количество цифровых входов и выходов – 14 штук, 6 из которых эксплуатируются как выходы ШИМ;
  • состояние постоянного тока, требуемого для входа и выхода – 40 мА;
  • flash-память – 16 Кб, но 2 Кб предназначены для загрузчика;
  • оперативная память – 1 Кб;
  • eeprom – 512 байт;
  • частота тактов – в первой модели 8 МГц, а во второй 16 МГц;
  • Arduino pro включает i2c-интерфейс.

Также стоит отдельно сказать про размеры платы — они, на самом деле очень скромные. Многие кто знакомятся с линейкой ардуино в первый раз всегда удивляются размерам, когда достают МК из коробки. Ниже вы можете оценить плату в дюймах и в сантиметрах.

Аппаратная часть мк Arduino pro mini

В таблице ниже описана аппаратная часть Arduino pro mini. На Arduino mini pro особое внимание уделяется входам и выходам.

Аппаратная часть Особенности
Питание На платформе Ардуино мини про расположен разъем для подсоединения кабеля FTDI, с помощью которого устройство получает питание. Также возможно включать ардуинку через вывод Vcc или RAW. Рассмотрим подробнее источники питания на Ардуино мини:

  1. С помощью RAW-вывода. Напряжение в таком случае будет нерегулируемым.
  2. GND – вывод при заземлении.
  3. VCC. Используется в том случае, когда требуется регулировать напряжение.
Состояние памяти Распределение памяти на схеме Ардуино мини про:

  • 16 килобайт выделено для флеш памяти;
  • 2 килобайт для того, чтобы включился загрузчик;
  • на оперативную память выделен 1 килобайт;
  • 512 байт под чтение и запись библиотеки EEPROM.
Количество входов и выходов и их предназначение Для распиновки разработчики Ардуино про выделили 14 контактов, которые пользователь самостоятельно настраивает, как входы или выходы. На вывод потребуется 3,3 Вольта. В настройках по умолчанию нагрузочный резистор, сделанный для вывода, пропускает 40 мА. Особенные функции для Arduino mini pro pinout:

  1. Шина последовательности. Нужна для принятия 0 и передачи информации 1 в виде TTL.
  2. Led 13. Под этим словосочетанием подразумевается светодиод, который подключен к цифровому выводу под номером 13. Если вывод равняется импульсу, передающему 1, светодиод загорится.
  3. Внешнее прерывание, 2-3. Подробно о данной особенности расписано в attachInterrupt().
  4. ШИМ на 3, 5, 6, 9, 10, 11. Для этого используется функция analogWrite(), которая обеспечивает выводы ШИМ, предназначенные для разрешения 8 бит.

Как мы уже заметили ранее — по размерам Arduino mini pro компактна и подойдет для конструирования любого устройства.

Схема и распиновка Pro Mini

Принципиальная схема микроконтроллера выглядит так:

Принципиальная схема платы

Теперь перейдем к распиновке платы:

Распиновка микроконтроллера

Программирование мк Arduino pro mini

Все программы программируются с помощью бесплатной среды разработки для Arduino pro mini. В Arduino mini включен ATmega328, в который предварительно вшивается загрузчик. Поэтому пользователь может свободно загружать программы в память микроконтроллера. Связь обеспечивает протокол STK500.

Распиновка ATmega328

Как прошить Ардуино про мини без загрузчика с помощью внешнего программатора? Легко и просто.

Для начала потребуется отменить требование на нажатие кнопки перезагрузки перед тем, как прошивать код написанной программы. Ардуино mini pro сконструирован так, что перезагрузка посредством программного обеспечения доступна напрямую с любого компьютерного устройства. В 6-контактных выводах есть один, который напрямую связан с линией сброса Arduino 328 pro с помощью конденсатора на 100 нФ.

Через управление вышеописанным выводом возможно преобразовать USB или последовательный порт путем подключения к разъему. Если сделать так, что появится уровень ниже нормы в течение продолжительного времени, платформа автоматически перезагрузится.

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

Arduino IDE

Однако повышается риск неоправданных последствий и поломки платформы. Если на компьютере электронщика установлена операционная система Мак Ос или Линукс, то сбрасывание на микроконтроллере будет происходить каждый раз, когда программное обеспечение с помощью USB-кабеля с платформой.

Спустя половину секунды с момента сброса начинает свою работу загрузчик. В основном, загрузчик устроен так, чтобы не перехватывать другие данные, однако нередко все происходит наоборот: перехватываются первые байты данных программы, которые отправляются на плату при установленном соединении.

Чтобы устранить такой «баг», необходимо в коде программы, которая будет работать на Ардуино, проверить, как осуществляется процесс передачи данных программы с компьютера на платформу. Оптимальное время для отправления кода – секунда с момента установки соединения между устройствами.

Реализация проектов на базе микроконтроллера Arduino pro mini

Сегодня в интернете можно найти любой проект на Ардуино. И это неудивительно, ведь эта платформа популярна среди начинающих разработчиков электронных приспособлений для дома и дачи. Ниже представлено несколько известных и простых проектов, в основе которых используется платформа Ардуино:

  1. Сигнализация, построенная с помощью подключения dfplayer к Ардуино pro.
  2. Управляемая конструкция для квадрокоптера.
  3. Автоматизация аквариума.
  4. Таймер.
  5. Анализатор влажности почвы.
  6. Автополив для комнатных растений.
  7. Датчик, измеряющий осадки и скорость ветра.

Arduino Pro Mini

Обзор Arduino Pro Mini

Arduino – это не только плата Arduino Uno, а целое семейство плат, которые различаются возможностями и функционалом. Arduino Pro Mini (рис. 1) – одна из самых миниатюрных плат. Она может использоваться для установки в готовые изделия.

Рисунок 1.

Размеры платы 33х18 мм, что гораздо меньше размеров остальных плат Arduino (см. рис. 2).

Рисунок 2.

Назначение контактов и количество Arduino Pro Mini идентично плате Arduino Nano, совпадает и расположение контактов (исключение выводы A4-A7).

Миниатиризация платы достигнуты благодаря отсутствию на ней USB-UART конвертера и USB выхода, присутствует самое необходимое – микроконтроллер, кварцевый резонатор, конденсаторы, светодиоды, стабилизатор напряжения. Поэтому для подключения платы к компьютеру, а также для загрузки скетчей из Arduino IDE, надо использовать внешний USB-UART.

На данный момент выпускается несколько вариантов платы Arduino Pro Mini. Платы выпускаются с на контроллере Atmega 168/328, работают от питания 3.3 или 5В на тактовой частоте 8 или 16 МГц.

Технические характеристики Arduino Pro Mini

Подключение к компьютеру

Для подключения платы к компьютеру используют внешний USB-UART конвертер. Подключение по схеме представленной на рис. 3.

Рисунок 3.

Компьютер определяет USB-UART конвертер как COM порт, его и выбираем в настройках Инструменты à Порт. В меню Инструменты → Плата выбираем Arduino Pro Mini, и загружаем необходимый скетч на плату (рис. 4).

У очень многих конвертеров отсутствует вывод DTR. В этом случае при каждой загрузке скетча в Arduino необходим в начале загрузки (сразу после окончания компиляции) нажать на кнопку Reset, это требует определенного навыка и не всегда получается.

Рисунок 4.

Использование USB-UART конвертера – это не единственный способ загрузки скетчей на плату Arduino Pro Mini.

Рисунок 5. Схема в сборе

Загрузка скетчей через SPI интерфейс

Интерфейс SPI присутствует на всех платах Arduino. Используются контакты D10-D13 (D50-D53 на Arduino Mega), которые на многих платах продублированы на шестиконтактной колодке ICSP. Колодка располагается в правой части Arduino (см. рис. 6).

Рисунок 6.

Сначала необходимо на плату Arduino (например Arduino Uno) загрузить скетч Файл → Образцы → ArduinoISP (рис. 7). Ее мы будем использовать в качестве программатора.

Рисунок 7.

Далее соединяем две платы Arduino согласно таблице 1.

Схема соединений показана на рис. 8.

Рисунок 8.

В Arduino IDE открываем необходимый скетч. Выбираем в меню Инструменты à Arduino Pro Or Pro Mini, порта подключения и программатора (Arduino as ISP). И теперь внимание!!! Метод загрузки нажатием на кнопку Загрузить не подходит, потому что при этом скетч будет загружен на первую плату, которая выступает в качестве программатора. Чтобы этого не произошло, загружаем через пункт меню Эскиз → Загрузить через программатор (рис. 9).

Рисунок 9.

Далее рассмотрим еще один способ загрузки скетчей – через плату Arduino Uno.

Загрузка скетчей на Arduino Pro Mini через плату Arduino Uno

Еще один способ загрузки скетчей на Arduino Pro Mini – это использование платы Arduino Uno, в которой используется микроконтроллер ATmega328 в DIP-корпусе. ATmega328 необходимо аккуратно извлечь и на плате останется переходник USB-UART, который подсоединим 5 проводами к плате Arduino Pro Mini согласно таблице 2.

Теперь подключаем Arduino Uno к компьютеру. Выбираем в настройках необходимый порт, плату (Инструменты → Arduino Pro Or Pro Mini) и загружаем скетч.

Часто задаваемые вопросы

1. Ошибка загрузки скетча на плату при подключении через конвертер USB-Serial.

  • Проверьте правильность подключения платы Arduino Pro Mini конвертеру USB-Serial.

  • Если у конвертера отсутствует контакт DTR, после компиляции скетча до загрузки, нажмите кнопку RESET на плате Arduino Pro Mini.

2. Ошибка загрузки скетча на плату при подключении интерфейсу SPI.

  • Проверьте правильность подключения платы Arduino Pro Mini согласно табл. 1.

3. Ошибка загрузки скетча на плату при подключении через Arduino Uno.

  • Проверьте правильность подключения платы Arduino Pro Mini согласно табл. 2.

Данная плата предназначена для использования в готовом устройстве. Поэтому у этого микроконтроллера нет встроенной микросхемы для связи по USB-UART. Так же нет и разъемов USB для подключения и прошивки. Это позволяет сильно уменьшить размеры платы, а также ее стоимость. Для подключения к компьютеру и прошивки используется специальный программатор. Существует две версии данной платы: с питанием 3,3 В и частотой 8 МГц и с питанием от 5 В с частотой 16 МГц. В младшей версии этой ардуинки используется чип ATmega168. Этот чип обладает меньшим объемом flash-памяти, энергонезависимой памяти, а так же пониженной тактовой частотой. Так как цена разных версий Arduino Pro Mini практически не отличается мы поговорим о старшей версии с чипом ATmega328 и тактовой частотой 16 МГц.

Arduino Pro Mini 5 В

Эта версия снабжена микроконтроллером ATmega328. В отличии от своего младшего собрата, он имеет вдвое большие объемы энергонезависимой и flash памяти. И может похвастаться тактовой частотой в 16 МГц. Узнать о способах прошивки этого микроконтроллера вы можете в моей статье: Как прошить Arduino Pro Mini

Характеристики

  • Микроконтроллер: ATmega168 или ATmega328
  • Предельное напряжение питания: 3,3-12 В и 5-12 В
  • Цифровых вводов/выводов: 14
  • ШИМ: 6 цифровых пинов могут быть использованы как выводы ШИМ
  • Аналоговые выводы: 8
  • Максимальная сила тока: 40 mAh с одного вывода и 400 mAh со всех выводов.
  • Flash память: 16 кб
  • SRAM: 1 кб
  • EEPROM: 512 байт
  • Тактовая частота: 8 МГц и 16 МГц

Подключение питания к Arduino Pro Mini

Этот микроконтроллер можно питать тремя способами:

  • Переходником FTDI, подключенному к 6 соответствующим пинам.
  • Подавая стабилизированное напряжение на вывод Vcc. 3,3 В или 5 В в зависимости от версии
  • Подавая напряжение на вывод RAW. 3,3-12 В или 5-12 В в зависимости от версии

Распиновка Arduino Pro Mini

Распиновка Arduino Pro Mini

Как уже было написано выше, плата имеет 14 цифровых пинов. На плате они помечены порядковым номером. Они могут быть как входом так и выходом. Рабочее напряжение этих пинов составляет 3,3 В или 5 В.

Аналоговые пины на плате помечены ведущей «A». Эти пины являются входами и не имеют подтягивающих резисторов. Они измеряют поступающее на них напряжение и возвращают значение от 0 до 1024 при использовании функции analogRead(). Эти пины измеряют напряжение с точностью до 0,005 В.

Широтно-импульсная модуляция (ШИМ) Arduino Pro Mini

ШИМ выходы у этой платы никак не помечены. Нужно просто запомнить номера цифровых выводов, которые подключены к широтно-импульсному генератору. У Arduino Pro Mini есть 6 выводов ШИМ, это пины 3, 5, 6, 9, 10 и 11. Для использования ШИМ у Arduino есть специальная функция analogWrite().

Другие пины:

  • 0(Rx) и 1(Tx) используются для передачи данных по последовательному интерфейсу.
  • Выводы 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) рассчитаны для связи по интерфейсу SPI.
  • Так же на выводе D13 имеется встроенный в плату светодиод.
  • А4 (SDA) и А5 (SCL) могут использоваться для связи с другими устройствами по шине I2C. Подробнее про этот интерфейс вы можете почитать на википедии. В среде разработке Arduino IDE есть встроенная библиотека «wire.h» для более легкой работы с I2C.

Физические характеристики

Arduino Pro Mini имеет следующие размеры: длина 33 мм и ширина 18 мм, а весит всего около 10 грамм. Расстояние между выводами равняется 2,54 мм.

Принципиальная схема Arduino Pro Mini

Принципиальная схема Arduino Pro Mini

Всем здравствуйте!
Итак, представляем Вашему вниманию новый проект — Металлоискатель на Ардуино !
Долго я вынашивал идею создать металлоискатель на Ардуино и вот наконец свершилось
Для создания металлоискателя на Ардуино пришлось начать с изучения принципов работы металлоискателей и ушло у меня на это, не много, не мало, 2 месяца
Ну естественно время от времени и с выходными
Перед тем как решить по какому принципу будет работать металлоискатель на Ардуино были изучены разные принципы, такие как:
1 . Простейший металлоискатель на биениях, работающий по принципу частотомера.
Его работа заключается в сравнении частот между двумя генераторами, один задающий эталонный генератор и другой генератор с LC контуром.
При настройки частоты генераторов уравниваются и при поднесении металлического предмета к катушке другого генератора происходит изменение частоты и соответственно индикация этого изменения.
Плюсы данного металлоискателя в том что он может определять тип металла , цветной и не цветной.
Минусы — малая глубина обнаружения, плохая стабильность частоты, не устойчивый к помехам.
2. Импульсный металлоискатель. схема немного по сложнее, имеет в своем составе мощный транзисторный ключ операционный усилитель.
Принцип его работы заключается в следующем, транзисторный ключ коммутирует ток в катушку, она создает вокруг себя электромагнитное поле, при наличии металлического предмета в области поля катушки в нем наводятся затухающие вихревые токи. В момент спада импульса происходит детектирование этих вихревых токов через подключенный к этой же катушке операционный усилитель.
Далее, сигнал с усилителя обрабатывается и отображается на светодиодном и звуковом индикаторе.
Плюсы — хорошая чувствительность на металлические предметы, стабильная работа, катушка очень простая в изготовлении и не требует экранирования.
Минусы — нет возможности определить тип металла .
3. Металлоискатель балансный. Данный вид металлоискателей более сложный и его изготовление новичкам будет не под силу.
Принцип его работы заключается в сведении баланса электромагнитных полей в двух катушках, приемной и передающей. Без измерительных приборов сделать это очень сложно и не всегда возможно.
В передающей катушке создаются электромагнитные импульсы а приемная катушка фиксирует их изменение при нарушении частотного баланса от появления в поле действия катушек металлического предмета.
Почти все промышленные и профессиональные металлоискатели работают именно по этому принципу.
Плюсы балансного металлоискателя — хорошая чувствительность, определение типа металла.
Минусы — сложный в изготовлении, требуется наличие измерительных приборов.
После изучения различных принципов работы металлоискателей я решил остановиться на изготовлении импульсного металлоискателя.
В качестве базовой схемы была выбрана схема металлоискателя Пират. Из нее я взял часть с транзисторным ключом, немного изменил, переделал схему включения полевого транзистора на составной биполярный транзистор.
Так же взял схему включения приемной части на операционном усилителе , переделал ее на работу с распространенным ОУ TL072CP.
Формирование, генерацию импульсов, обработку сигнала от ОУ и его индикацию я реализовал на контроллере Ардуино УНО .
Схема получилась очень простая и маленькая, и ее легко собрать в домашних условиях без печатной платы.
Я собрал все на макетной плате, стабильность схемы не смотря на навесные провода, очень даже хорошая.
Скетч для металлоискателя Arduimp на Ардуино UNO

arduimp1.zip Скетч металлоискателя ARDUIMP на Arduino UNO (782 байт) Скачиваний: 208
Выкладываю фотографии металлоискателя на Ардуино.

Когда-то, построив своими руками несколько металлоискателей различной степени работоспособности, я захотел изучить как работает схема Ардуино в этом направлении.

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

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

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

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

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

Итоговый вариант кода для Arduino:

// Defining all required pre variables etc. and setting up the registers unsigned char clockSelectBits = _BV(CS10); // no prescale, full xtal void setup() { pinMode(6,INPUT); // + of the comparator — by setting them as INPUT, they are // set to high impedance pinMode(7,INPUT); // — of the comparator — by setting them as INPUT, they are // set to high impedance cli(); // stop interrupts TCCR1A = 0; // set entire TCCR1A register to 0 TCCR1B = 0; // same for TCCR1B TCNT1 = 0; // initialize counter value to 0; TCCR1B |= clockSelectBits; // sets prescaler and starts the clock TIMSK1 = _BV(TOIE1); // sets the timer overflow interrupt enable bit sei(); //allow interrupts ACSR = (0 << ACD) | // Analog Comparator: Enabled (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 is applied to the positive input (0 << ACO) | // Analog Comparator Output: Off (1 << ACI) | // Analog Comparator Interrupt Flag: Clear Pending Interrupt (1 << ACIE) | // Analog Comparator Interrupt: Enabled (0 << ACIC) | // Analog Comparator Input Capture: Disabled (0 << ACIS1 | 0 << ACIS0 // interrupt on output toggle // (0 << ACIS1 | 1 << ACIS0 // reserved // (1 << ACIS1 | 0 << ACIS0 // interrupt on falling output edge // (1 << ACIS1 | 1 << ACIS0 // interrupt on rising input edge ; } // this routine is called every time the comparator creates an interrupt ISR(ANALOG_COMP_vect) { oldSREG=SREG; cli(); timeStamp=TCNT1; SREG = oldSREG; } // this routine is called every time there is an overflow in internal counter ISR(TIMER1_OVF_vect){ timer1_overflow_count++; } // this routine is used to reset the timer to 0 void resetTimer(void){ oldSREG = SREG; cli(); // Disable interrupts TCNT1 = 0; //initialize counter value to 0 SREG = oldSREG; // Restore status register TCCR1B |= clockSelectBits; // sets prescaler and starts the clock timer1_overflow_count=0; // resets overflow counter }

Конечно, эта идея не совсем новая. Основная часть этого кода может быть другой. Попробуйте поискать в других источниках, например TPIMD.

Шаг 1: Идея индукционного детектора на Arduino — флип-катушка

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

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

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

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

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

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

После некоторых экспериментов я остановился на следующей схеме:

Схема состоит из модуля Arduino Nano. Этот модуль управляет двумя МОП-транзисторами, питающими катушку (на SV3) через D10. Когда импульс на конце D10 заканчивается, оба МОП-транзистора изолируют катушку от 12V и GND.

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

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

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

Шаг 2: Строим детектор (макет)

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

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

Использование макета — самый быстрый способ сделать работающий детектор. Нужно провести некоторую проводку, но это может быть сделано на отдельном маленьком макете. На снимках это показано в 3 этапа, так как Arduino и МОП-транзисторы скрывают некоторые из проводов. При тестировании я случайно отключил диоды, не заметив сразу. Это особо не повлияло на поведение детектора. В версии на печатной плате я их оставил.

На рисунках не показаны подключения к OLED-дисплею 0,96. Этот дисплей подключен таким образом:

Vcc — 5В (на выводе Arduino, а не на блоке питания!)
GND — GND
SCL — A5
SDA — A4

Этот 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 мс было выбрано случайным образом, параметры катушки тоже.

Файлы

  • PI_interrupt_flipCoil.ino

Шаг 5: Подключение дисплея 16х2

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

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

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

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

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

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

У меня сложилось впечатление, что, установив максимальную стабильную величину, я потерял чувствительность к цветным металлам. Поэтому, возможно, стоит поэкспериментировать с настройками, чтобы это исправить.

Катушки

Я сделал 3 катушки для дальнейшего тестирования схемы импульсного металлоискателя:

  • 1 -> 18 витков/ 200 мм
  • 2 -> 25 витков/100 мм
  • 3 -> 48 витков/100 мм

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

Файлы

Этот проект на основе Bolt IoT показывает, как сделать металлодетектор с системой оповещения на основе Ардуино.

Введение

Данный проект должен дать общее понимание того, как можно сделать металлоискатель с системой мониторинга и оповещения. Цель проекта в обнаружении посторонних предметов, а также в создании прототипа системы безопасности. Итогом дальнейших процессов может стать проектирование подвижного робота с металлоискателем. Всё это, в целом, может быть выполнено с использованием любого микроконтроллера, но мы будем использовать плату Arduino Uno.

Предлагаемая система содержит схему передатчика (Tx) и приемника (Rx). Эта плата основана на TDA0161, монолитной интегральной схеме, предназначенной для обнаружения металлических тел путем определения вариаций высокочастотных потерь на вихревые токи. Используя внешне настроенную цепь, устройство действует как генератор. Уровень выходного сигнала изменяется при приближении к металлическому объекту.

Выходной сигнал определяется изменениями тока питания. Независимо от напряжения питания, этот ток является высоким или низким, в зависимости от близости металлического предмета. Данное устройство сможет предупредить об обнаружении, например, мины впереди, а также будет полезно для обнаружения металлических объектов, спрятанных под землей или находящихся внутри других объектов. Состоит из портативного устройства с сенсорным датчиком, который может обнаруживать изменение магнитного поля, вызванного металлическим предметом.

Комплектующие

Для нашего металлодетектора/металлоискателя Ардуино понадобится приличный список комплектующих:

  • Датчик на основе TDA0161 × 1
  • Резистор 220 Ом × 1
  • Конденсатор 47 мкФ × 1
  • Резистор 330 Ом × 1
  • Резистор 100 Ом × 1
  • Резистор 1 кОм × 1
  • Зуммер × 1
  • Многооборотный прецизионный потенциометр — 10 кОм (25 витков) × 1
  • Bolt IoT Bolt WiFi модуль × 1
  • Arduino UNO × 1
  • Кабель USB-A — Micro-USB × 1

Из программного обеспечения нам пригодятся:

  • Bolt IoT Bolt Cloud (облако)
  • Bolt IoT Android App (приложение для Андроид)

Принципиальная схема

Сначала мы должны сделать датчик металлоискателя, подключив его, как указано на принципиальной схеме выше. В итоге как только всё будет сделано согласно шагам ниже, вам нужно будет установить систему таким образом, чтобы датчик указывал на пол, включить питание системы и обеспечить постоянный доступ Bolt к Интернету через ваш WiFi.

Настройка модуля Bolt WiFi и подключение через облако

После выполнения всех соединений нам нужно подключить металлодетектор Ардуино через облако Bolt iOT, используя процесс, описанный на этом шаге. Мы узнаем как настроить новый WiFi-модуль Bolt, используя сеть Wi-Fi и мобильный телефон.

Если вы внимательно посмотрели список комплектующих, то увидели, что нам нужны: модуль Bolt IoT Bolt WiFi, кабель Micro-USB — USB (на ваш выбор), облако Bolt IoT Bolt Cloud, приложение Bolt IoT Android App (ссылки выше).

Этот набор поможет нам подключить модуль Bolt к Wi-Fi и привязать его к облачной учетной записи Bolt, чтобы вы могли начать с ним работать. Весь процесс настройки займет не более 10 минут.

Подключаем модуль к питанию

После того как вы взяли в руки модуль WiFi Bolt iOT вам нужно найти зарядное устройство 5В/1A, которое имеет порт micro-usb и обычно используется для зарядки мобильного телефона на Android. Вы также можете использовать свой ноутбук для включения устройства Bolt.

Теперь, когда у вас есть все компоненты, давайте начнем с загрузки мобильного приложения Bolt IoT и установки его на мобильный телефон. Прежде чем начать, проверьте, работает ли сеть WiFi, к которой вы будете подключать Bolt, на частоте 2,4 ГГц. На данный момент Bolt НЕ поддерживает сети WiFi 5 ГГц.

Скачиваем приложение Bolt App

Загрузите приложение «Bolt IoT» для Android или iOS. Вы можете выполнить поиск «Bolt IoT» или отсканировать QR-код ниже.

Примечание. Ниже приведены инструкции для приложения под Android, но то же самое можно выполнить и для приложения под iOS с некоторыми незначительными отличиями.

Создание аккаунта

Вам нужно будет создать учетную запись в облаке Bolt для управления устройством Bolt iOT. Создание учетной записи в облаке Bolt БЕСПЛАТНО.

Откройте приложение Bolt и нажмите «РЕГИСТРАЦИЯ» (англ. — REGISTER), чтобы создать новую учетную запись.

Заполните все необходимые детали и согласитесь с условиями использования (кто-то это вообще читает?). Наконец, нажмите «Создать новую учетную запись» (CREATE A NEW ACCOUNT), чтобы создать бесплатную учетную запись.

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

Следуйте инструкциям в электронном письме, чтобы активировать свою учетную запись Bolt Cloud. Теперь потяните пальцем по экрану, чтобы обновить экран мобильного приложения, который выглядит примерно так, как показано ниже.

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

Добавляем Bolt на ваш аккаунт

Теперь нажмите кнопку «ДОБАВИТЬ УСТРОЙСТВО» (англ. — ADD DEVICE), чтобы настроить устройство Bolt для работы в сети WiFi.

Включите устройство Bolt, вставив кабель Micro USB в порт USB на модуле, а другой конец кабеля подключите к зарядному устройству Android или к ноутбуку.

Примечание. На Bolt iOT нет кнопок включения/выключения. Как только вы подключите питание, можно начинать работу.

Как только вы включите устройство Bolt, синий светодиод на Bolt начнет медленно мигать, а зеленый светодиод выключится.

Если синий светодиод медленно мигает, это означает, что теперь Bolt передает свою собственную сеть точек доступа WiFi и готов к настройке с помощью приложения Bolt IoT на вашем телефоне. Нажмите на символ «>» в приложении, чтобы продолжить.

Только для Android: перед тем как продолжить, отключите мобильные данные, включите службу определения местоположения на своем мобильном телефоне, если это еще не сделано, и нажмите кнопку «ГОТОВ» (англ.- Ready). Это требуется только в приложении Android из-за API Google. Приложение не собирает и не хранит ваши данные о местоположении.

Если приложение обнаружило Bolt, оно отобразит экран, аналогичный показанному ниже. Синий светодиод на устройстве теперь будет быстро мигать. Это означает, что он находится в процессе установки. Чтобы продолжить, нажмите «ПРОДОЛЖИТЬ» (англ. — CONTINUE).

Пароль для точки доступа WiFi, передаваемой модулем WiFi Bolt: bolt1234. При настройке с помощью мобильного приложения Android ваш мобильный телефон автоматически подключится к точке доступа, когда вы нажмете «Далее». На iOS вам нужно будет подключиться к Hotspot, зайдя в Настройки -> WIFi. Теперь нам нужно сообщить Bolt, к какой WiFi-сети он должен подключиться.

Важно. Модуль WiFi от Bolt не может обнаруживать сети WiFi на базе 5 ГГц и не сможет подключиться к ним.

Выберите сеть WiFi к которой должен быть подключен Bolt. Вы можете нажать на имя WiFi, чтобы выбрать сеть WiFi для подключения.

Примечание. Для приложения iOS вам придется вручную ввести SSID или имя WiFi-устройства, к которому вы хотите подключиться.

Введите пароль сети WiFi, которую вы выбрали на предыдущем экране.

Приложение теперь отправит учетные данные WiFi в модуль Bolt WiFi.

Теперь нажмите «Готово» (англ. — Done) и на следующем экране выберите свою страну и нажмите «Сохранить» (англ. — Save), чтобы завершить последний этап настройки.

Если все прошло по плану, устройство Bolt теперь перезапустится автоматически. Сине-зеленый светодиод на устройстве Bolt теперь будет постоянно светиться. Если Bolt смог подключиться к сети WiFi и подключился к облаку, рядом с идентификатором устройства Bolt появится зеленая точка, как показано ниже.

Отладка

Если Bolt не может подключиться к сети Wi-Fi, зеленый светодиод будет выключен, а синий светодиод будет медленно мигать. Обычно это происходит, если вы ввели неправильные учетные данные WiFi (SSID или пароль) во время установки. Пожалуйста, попробуйте процесс установки еще раз с правильными учетными данными WiFi.

Проверьте, работает ли ваш WiFi роутер на частоте 2,4 ГГц. На данный момент Bolt не поддерживает 5 ГГц.

Доступ к облаку Bolt для создания проектов IoT

Посетите Bolt Cloud (cloud.boltiot.com) и войдите в свою зарегистрированную учетную запись, используя тот же идентификатор электронной почты и пароль, которые вы использовали в мобильном приложении Bolt IoT.

Вы увидите свое устройство Bolt со статусом «ONLINE» в своей учетной записи на панели инструментов.

Поздравляем, вам удалось настроить Bolt и привязать его к своей учетной записи менее чем за 10 минут.

Код для проекта

После подключения через модуль Bolt вы должны скачать или скопировать код ниже в формате .json:

{ «name»: «Metal Detection», «flow»: , «expect»: } }, { «name»: «parameters», «spec»: , «type»: «collection», «label»: «Parameters» } ] } }, { «id»: 1, «module»: «app#bolt-iot:executeCommand», «version»: 1, «parameters»: { «__IMTCONN__»: 445281 }, «mapper»: { «command»: «serialWrite», «parameters»: { «data»: «Get detected», «deviceName»: «» } }, «metadata»: { «designer»: { «x»: 300, «y»: 0 }, «restore»: { «command»: { «label»: «Send serial data output» }, «__IMTCONN__»: { «label»: «My Bolt connection» } }, «parameters»: , «expect»: } }, { «name»: «parameters», «spec»: , «type»: «collection», «label»: «Parameters» } ] } }, { «id»: 14, «module»: «app#bolt-iot:executeCommand», «version»: 1, «parameters»: { «__IMTCONN__»: 445281 }, «mapper»: { «command»: «serialRead», «parameters»: { «till»: «10», «deviceName»: «» } }, «metadata»: { «designer»: { «x»: 600, «y»: 0 }, «restore»: { «command»: { «label»: «Read incoming serial data» }, «__IMTCONN__»: { «label»: «My Bolt connection» } }, «parameters»: , «expect»: } }, { «name»: «parameters», «spec»: , «type»: «collection», «label»: «Parameters» } ] } }, { «id»: 18, «module»: «math:EvaluateExpression», «version»: 1, «parameters»: {}, «mapper»: { «expression»: «100-{{parseNumber(14.value)}}» }, «metadata»: { «designer»: { «x»: 869, «y»: -2 }, «expect»: } }, { «id»: 13, «module»: «google-email:ActionSendEmail», «version»: 1, «parameters»: { «account»: 445282 }, «filter»: { «name»: «Check if metal is detected», «conditions»: ] }, «mapper»: { «cc»: , «to»: , «bcc»: , «html»: «metal detection», «subject»: «Warning! metal detected», «attachments»: }, «metadata»: { «designer»: { «x»: 1145, «y»: -3 }, «restore»: { «cc»: { «mode»: «chose», «items»: }, «to»: { «mode»: «chose», «items»: }, «bcc»: { «mode»: «chose», «items»: }, «account»: { «label»: «» }, «attachments»: { «mode»: «chose», «items»: } }, «parameters»: , «expect»: , «type»: «array», «label»: «Attachments», «labels»: { «add»: «Add an attachment», «edit»: «Edit an attachment» } }, { «name»: «cc», «spec»: { «type»: «email», «label»: «Email address» }, «type»: «array», «label»: «Copy recipient», «labels»: { «add»: «Add a copy recipient», «edit»: «Edit a copy recipient» } }, { «name»: «bcc», «spec»: { «type»: «email», «label»: «Email address» }, «type»: «array», «label»: «Blind copy recipient», «labels»: { «add»: «Add a blind copy recipient», «edit»: «Edit a blind copy recipient» } } ] } } ], «metadata»: { «version»: 1, «scenario»: { «roundtrips»: 1, «maxErrors»: 3, «autoCommit»: false, «sequential»: false, «confidential»: false, «dataloss»: false, «dlq»: false }, «designer»: { «orphans»: }, «zone»: «eu1.integromat.com» } }

Код, который мы должны загрузить на плату Ардуино через Arduino IDE ниже:

#define capPin A0 #define buz 9 #define pulsePin A4 #define led 10 long sumExpect=0; //running sum of 64 sums long ignor=0; //number of ignored sums long diff=0; //difference between sum and avgsum long pTime=0; long buzPeriod=0; void setup() { Serial.begin(9600); pinMode(pulsePin, OUTPUT); digitalWrite(pulsePin, LOW); pinMode(capPin, INPUT); pinMode(buz, OUTPUT); digitalWrite(buz, LOW); pinMode(led, OUTPUT); } void loop() { int minval=1023; int maxval=0; long unsigned int sum=0; for (int i=0; i<256; i++) { //reset the capacitor pinMode(capPin,OUTPUT); digitalWrite(capPin,LOW); delayMicroseconds(20); pinMode(capPin,INPUT); applyPulses(); //read the charge of capacitor int val = analogRead(capPin); //takes 13×8=104 microseconds minval = min(val,minval); maxval = max(val,maxval); sum+=val; long unsigned int cTime=millis(); char buzState=0; if (cTime<pTime+10) { if (diff>0) buzState=1; else if(diff<0) buzState=2; } if (cTime>pTime+buzPeriod) { if (diff>0) buzState=1; else if (diff<0) buzState=2; pTime=cTime; } if (buzPeriod>300) buzState=0; if (buzState==0) { digitalWrite(led, LOW); noTone(buz); } else if (buzState==1) { tone(buz,2000); digitalWrite(led, HIGH); } else if (buzState==2) { tone(buz,500); digitalWrite(led, HIGH); } } //subtract minimum and maximum value to remove spikes sum-=minval; sum-=maxval; if (sumExpect==0) sumExpect=sum<<6; //set sumExpect to expected value long int avgsum=(sumExpect+32)>>6; diff=sum-avgsum; if (abs(diff)<avgsum>>10) { sumExpect=sumExpect+sum-avgsum; ignor=0; } else ignor++; if (ignor>64) { sumExpect=sum<<6; ignor=0; } if (diff==0) buzPeriod=1000000; else buzPeriod=avgsum/(2*abs(diff)); } void applyPulses() { for (int i=0;i<3;i++) { digitalWrite(pulsePin,HIGH); //take 3.5 uS delayMicroseconds(3); digitalWrite(pulsePin,LOW); //take 3.5 uS delayMicroseconds(3); } }

Настройка оповещений

Прежде чем перейти к почтовым оповещениям и после того как мы загрузили код в Arduino IDE нам нужно создать идентификатор на ресурсе integromat.com. Если у вас есть уже аккаунт на этом сайте — просто войдите в аккаунт.

  1. Загрузите план сценария, приведенный в этом шаге выше. Не забудьте сохранить файл с именем «MetalDetektor.json».
  2. Создайте сценарий, нажав синюю кнопку «Создать новый сценарий» (Create a new scenario) в верхнем правом углу, и нажмите «Продолжить» (Continue).

  3. Нажмите кнопку «Еще» (More) в нижней части экрана.
  4. Выберите «Импортировать проект» (Import Blueprint) и нажмите «Выбрать файл».

  5. Перейдите в папку, в которую вы скачивали файл «MetalDetektor.json», выберите файл и нажмите «Открыть» (Open). После этого нажмите Сохранить. Сценарий MetalDetektor будет загружен.

  6. Нажмите на название сценария и измените его на «Обнаружение металла».

Используйте следующие шаги для настройки сценария обнаружения металла.

  1. Получите ваш ключ API Bolt Cloud, нажав . На рисунках ниже показано, как включить и скопировать ключ API.
  2. Вернитесь к сценарию Integromat, нажмите на первый кружок BoltIoT, а затем нажмите кнопку «Добавить».
  3. Вставьте ключ API, который вы скопировали ранее, и нажмите кнопку «Продолжить».
  4. Добавьте имя вашего устройства. Вы можете узнать имя устройства вашего WiFi-модуля Bolt, нажав . Затем нажмите ОК.
  5. Для второго и третьего кружка BoltIoT вы можете нажать на выпадающее меню и выбрать «My Bolt Connection». Не забудьте добавить правильное имя устройства для каждого из них.
  6. Нажмите на математический кружок и измените значение 4 на высоту, на которой вы держите свой датчик. Затем нажмите ОК.
  7. Нажмите на красную точку между кружками математики и Gmail, замените 2 металлом, на который вы хотите получать оповещения, и нажмите ОК.
  8. Нажмите на кружок Gmail и нажмите кнопку редактирования.
  9. Добавьте свой адрес электронной почты и нажмите ОК.
  10. Нажмите кнопку «Добавить», затем продолжите и разрешите Integromat получить доступ к вашей учетной записи Gmail.
  11. Вы можете добавить больше получателей (англ. — recipients), нажав кнопку «Добавить получателя», а затем нажмите «ОК».
  12. Убедитесь, что ваша цепь включена, и нажмите кнопку Run. Сценарий будет выполняться и ждать фильтр, обозначенный «1» в кружке, который выглядит как «мысли».

На этом всё. Как только будет собран весь проект, всё, что вам нужно сделать, это установить систему таким образом, чтобы датчик указывал на пол, включить питание системы и обеспечить постоянный доступ Bolt к Интернету через ваш WiFi. Желаем вам найти побольше ценных предметов.

Работа с символьными ЖК дисплеями 1602,2004…

Библиотека:

Для работы с символьными графическими дисплеями предлагаем воспользоваться библиотекой LiquidCrystal которая входит в стандартный набор Arduino IDE и предназначена для работы по 8-битному (4-битному) параллельному интерфейсу. Если Ваш дисплей подключается к Arduino по аппаратной шине I2, то Вам нужно установить библиотеку LiquidCrystal_I2C (большинство функций которой повторяют функции первой библиотеки).

Поддерживаемые дисплеи:

#1 Пример

Выводим надпись на дисплей LCD1602 подключённый по шине I2C. Для работы с дисплеем LCD2004 нужно изменить 3 строку на LiquidCrystal_I2C lcd(0x27,20,4);

#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print(«LCD»); // Выводим текст «LCD», начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print(«www.iarduino.ru»); // Выводим текст «www.iarduino.ru», начиная с установленной позиции курсора } // // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#2 Пример

Выводим надпись на дисплей LCD1602 подключённый по 4-битной параллельной шине. Для работы с дисплеем LCD2004 нужно изменить 5 строку на lcd.begin(20, 4);

#include <LiquidCrystal.h> // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup(){ // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print(«LCD2004»); // Выводим текст «LDC1602», начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print(«www.iarduino.ru»); // Выводим текст «www.iarduino.ru», начиная с установленной позиции курсора } // // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#3 Пример

Выводим надпись «Русский язык» на дисплей LCD1602 подключённый по шине I2C:

#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol = { // Объявляем массив из 6 собственных символов (к и й я з ы), каждый символ состоит из 8 байт { 0, 0,18,20,24,20,18, 0 }, // к { 0, 0,17,19,21,25,17, 0 }, // и {10, 4,17,19,21,25,17, 0 }, // й { 0, 0,15,17,15, 5, 9, 0 }, // я { 0, 0,14,17, 6,17,14, 0 }, // з { 0, 0,17,17,29,19,29, 0 }}; // ы // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1, symbol); // Загружаем 1 символ «к» в ОЗУ дисплея lcd.createChar(2, symbol); // Загружаем 2 символ «и» в ОЗУ дисплея lcd.createChar(3, symbol); // Загружаем 3 символ «й» в ОЗУ дисплея lcd.createChar(4, symbol); // Загружаем 4 символ «я» в ОЗУ дисплея lcd.createChar(5, symbol); // Загружаем 5 символ «з» в ОЗУ дисплея lcd.createChar(6, symbol); // Загружаем 6 символ «ы» в ОЗУ дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print(«Pycc\1\2\3 \4\5\6\1»); // Выводим текст «Pycckий языk», где «Pycc» написано латиницей, а «kий языk» — символами из ОЗУ дисплея } // Если нужно вывести символ из ОЗУ дисплея, то пишем \ и номер символа // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#4 Пример

Выводим время прошедшее после старта на дисплей LCD1602 подключённый по шине I2C:

#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t tim_D, tim_H, tim_M, tim_S; // Объявляем переменные для хранения дней, часов, минут и секунд. uint32_t tim; // Объявляем переменную для хранения общего количества времени прошедшего после старта. // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея } // // void loop(){ // // Получаем время прошедшее после старта: // tim = millis() / 1000; // Получаем общее количество секунд (максимум 4’294’967 сек ≈ 49,7 дней). tim_S = tim % 60; // Получаем секунды: остаток от деления всех секунд на минуту (60 сек). tim = (tim-tim_S) / 60; // Получаем общее количество минут. tim_M = tim % 60; // Получаем минуты: остаток от деления всех минут на час (60 мин). tim = (tim-tim_M) / 60; // Получаем общее количество часов. tim_H = tim % 24; // Получаем часы: остаток от деления всех часов на день (24 час). tim_D = (tim-tim_H) / 24; // Получаем общее количество дней. // Выводим время прошедшее после старта: // if (millis()%1000<100){ // Условие выполняется в течении 100 первых миллисекунд каждой новой секунды. delay(100); lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка). lcd.print(«Days: «); // Выводим текст. if(tim_D<10){lcd.print( 0 );} // Выводим 0 перед количеством дней. lcd.print(tim_D ); // Выводим количество дней. lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print(«Time: «); // Выводим текст. if(tim_H<10){lcd.print( 0 );} // Выводим 0 перед количеством часов. lcd.print(tim_H ); // Выводим количество часов. lcd.print(‘:’ ); // Выводим символ. if(tim_M<10){lcd.print( 0 );} // Выводим 0 перед количеством минут. lcd.print(tim_M ); // Выводим количество минут. lcd.print(‘:’ ); // Выводим символ. if(tim_S<10){lcd.print( 0 );} // Выводим 0 перед количеством секунд. lcd.print(tim_S ); // Выводим количество секунд. } // } //

Функции, общие для библиотек LiquidCrystal и LiquidCrystal_I2C:

  • begin(cols,rows,); – Инициализация дисплея с указанием количества столбцов, строк и размера символа.
  • clear(); – Очистка дисплея с установкой курсора в положение 0,0 (Занимает много времени!).
  • home(); – Установка курсора в положение 0,0 (Занимает много времени!).
  • display(); – Быстрое включение дисплея (без изменения данных в ОЗУ).
  • noDisplay(); – Быстрое выключение дисплея (без изменения данных в ОЗУ).
  • blink(); – Включение мигающего курсора (с частотой около 1 Гц).
  • noBlink(); – Выключение мигающего курсора.
  • cursor(); – Включение подчеркивания курсора.
  • noCursor(); – Выключение подчеркивания курсора.
  • scrollDisplayLeft(); – Прокрутка дисплея влево. Сдвиг координат дисплея на один столбец влево (без изменения ОЗУ).
  • scrollDisplayRight(); – Прокрутка дисплея вправо. Сдвиг координат дисплея на один столбец вправо (без изменения ОЗУ).
  • leftToRight(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец вправо.
  • rightToLeft(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец влево.
  • noAutoscroll(); – Указывает в дальнейшем выравнивать текст по левому краю от позиции курсора (как обычно).
  • autoscroll(); – Указывает в дальнейшем выравнивать текст по правому краю от позиции курсора.
  • createChar(num,array); – Запись пользовательского символа в CGRAM дисплея под указанным номером.
  • setCursor(col,row); – Установка курсора в позицию указанную номером колонки и строки.
  • print(text); – Вывод текста, символов или цифр на экран дисплея. Синтаксис схож с одноимённой функцией класса Serial.

Функции, реализованные только в библиотеке LiquidCrystal_I2C:

  • init(); – Инициализация дисплея. Должна быть первой командой библиотеки LiquidCrystal_I2C после создания объекта. На самом деле данная функция есть и в библиотеке LiquidCrystal, но в той библиотеке она вызывается автоматически (по умолчанию) при создании объекта.
  • backlight(); – Включение подсветки дисплея.
  • noBacklight(); – Выключение подсветки дисплея.
  • setBacklight(flag); – Управление подсветкой (true — включить / false — выключить), используется вместо функций noBacklight и backlight.

Подключение:

/* Для шины I2C: */ #include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x3F,20,4); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x3F, количество столбцов = 20, количество строк = 4) // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея … // Выводим информацию, которая должна отображаться при старте } // // void loop(){} // … // Выводим информацию которая должна меняться по алгоритму Вашего кода } // /* Для 4 проводной параллельной шины: */ #include <LiquidCrystal.h> // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup(){ // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) … // Выводим информацию, которая должна отображаться при старте } // // void loop(){} // … // Выводим информацию которая должна меняться по алгоритму Вашего кода } //

Функции управления дисплеем:

display();
Включает дисплей после того как он был выключен функцией noDisplay.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
noDisplay();
Выключает дисплей.
Данные на дисплее не будут отображаться до вызова функции display, но и не сотрутся из памяти ОЗУ, а после вызова функции display, опять будут отображаться.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
scrollDisplayLeft();
Сдвигает координаты дисплея на один столбец влево.
Постоянный вызов данной функции создаст эффект бегущей строки.
Координаты сдвигаются как для имеющейся на дисплее информации, так и для той, которая будет выведена после.
Примечание: Функция выполняется без изменений ОЗУ дисплея.
Если вызвать функцию 40 раз подряд, то координата вернётся в изначальную точку
scrollDisplayRight();
Сдвигает координаты дисплея на один столбец вправо.
Постоянный вызов данной функции создаст эффект бегущей строки.
Координаты сдвигаются как для имеющейся на дисплее информации, так и для той, которая будет выведена после.
Примечание: Функция выполняется без изменений ОЗУ дисплея.
Если вызвать функцию 40 раз подряд, то координата вернётся в изначальную точку
clear();
Очистка дисплея с установкой курсора в положение 0,0.
Информация имеющаяся на дисплее безвозвратно сотрётся.
Примечание: Занимает много времени.
backlight();
Включение подсветки дисплея.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
noBacklight();
Выключение подсветки дисплея.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
setBacklight( flag );
Управление подсветкой (вместо функций noBacklight и backlight).
Параметр:

  • flag: значение true — включает, а false — выключает подсветку.

Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.

/* Выводим надпись для наблюдения за функциями управления дисплеем: */ lcd.cursor(0,0); // Устанавливаем курсор в крайний верхний угол дисплея (0 столбец, 0 строка) lcd.print(«iarduino.ru»); // Выводим текст «iarduino.ru» (первая буква «i» будет находиться в позиции «0,0», а последняя «u» в позиции «10,0», невидимый курсор в позиции «11,0») // lcd.noDisplay(); // Выключаем дисплей (надпись исчезнет с дисплея) lcd.display(); // Включаем дисплей (надпись появится на дисплее в том же месте) lcd.scrollDisplayLeft(); // Сдвигаем координаты столбцов влево (на дисплее будет отображаться «arduino.ru» без первой буквы «i», которая выйдет за пределы дисплея, но останется в его ОЗУ) lcd.scrollDisplayRight(); // Сдвигаем координаты столбцов вправо (на дисплее будет отображаться «iarduino.ru» на том же месте, где и была выведена изначально) lcd.clear(); // Чистим дисплей (надпись безвозвратно исчезнет с дисплея) lcd.noBacklight(); // Отключаем подсветку дисплея lcd.backlight(); // Включаем подсветку дисплея lcd.setBacklight(0); // Отключаем подсветку дисплея lcd.setBacklight(1); // Включаем подсветку дисплея

Функции управления курсором:

setCursor( col , row );
Установка курсора в указанную позицию.
Параметр:

  • col: номер столбца (начиная с 0).
  • row: номер строки (начиная с 0)
home();
Установка курсора в позицию 0,0. Работает как функция setCursor(0,0);
Примечание: Занимает много времени.
blink();
Включение мигающего курсора.
Примечание: Курсор занимает всё поле символа и мигает с частотой около 1 Гц, в той позиции где он был установлен ранее.
noBlink();
Выключение мигающего курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.
cursor();
Включение подчеркивания курсора.
Примечание: Курсор принимает вид символа подчёркивания и находится в той позиции, где он был установлен ранее.
noCursor();
Выключение подчеркивания курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.

lcd.setCursor( 0, 1); // Устанавливаем курсор на первый символ второй строки (нумерация строк и столбцов начинается с 0) lcd.home(); // Устанавливаем курсор на первый символ первой строки (как при вызове lcd.setCursor(0,0);) lcd.blink(); // Делаем курсор видимым (на месте курсора будет мигать прямоугольник) lcd.noBlink(); // Делаем курсор невидимым (убираем мигающий прямоугольник) lcd.cursor(); // Делаем курсор видимым (на месте курсора появится знак подчёркивания) lcd.noCursor(); // Делаем курсор невидимым (убираем знак подчёркивания) // Если курсор попадает на место где есть символ, то этот символ не исчезает

Функции указывающие направление и выравнивание:

leftToRight();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец вправо.
Примечание: Если вывести текст «abc» на дисплее отобразится «abc» и текст будет находиться правее от изначального положения курсора.
(Как обычно)
rightToLeft();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец влево.
Примечание: Если вывести текст «abc» на дисплее отобразится «cba» и текст будет находиться левее от изначального положения курсора.
(Письменность справа налево)
noAutoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по левому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться первый символ выведенного текста.
(Как обычно)
autoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по правому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться курсор.
(Координаты дисплея будут сдвинуты влево, как будто Вы вызвали функцию scrollDisplayLeft столько раз, сколько букв в выведенном тексте)

lcd.leftToRight(); // Указываем курсору сдвигаться вправо (Как обычно в европейской письменности) lcd.clear(); lcd.setCursor(5,0); lcd.print(«ABC»); // На дисплее увидим: » ABC » (После «A» курсор сдвинулся вправо и вывелась «B», далее курсор сдвинулся вправо и вывелась «C») lcd.rightToLeft(); // Указываем курсору сдвигаться влево (Как в письменности справа налево) lcd.clear(); lcd.setCursor(5,0); lcd.print(«ABC»); // На дисплее увидим: » CBA » (После «A» курсор сдвинулся влево и вывелась «B», далее курсор сдвинулся влево и вывелась «C») lcd.noAutoscroll(); // Устанавливаем выравнивание по левому краю (Как обычно) lcd.clear(); lcd.setCursor(5,0); lcd.print(«ABC»); // На дисплее увидим: » ABC » (Как обычно) lcd.autoscroll(); // Устанавливаем выравнивание по правому краю (Координаты дисплея будут сдвинуты влево на количество выведенных символов) lcd.clear(); lcd.setCursor(5,0); lcd.print(«ABC»); // На дисплее увидим: » ABC » (Координаты дисплея будут сдвинуты на 3 символа влево, так как после каждого символа совершается вызов функции scrollDisplayLeft)

Функции ввода текста и символов:

createChar(num,array);
Запись пользовательского символа в CGRAM дисплея под указанным номером.
Если Вы хотите вывести текст (функцией print) в котором должен находиться установленный Вами символ, укажите слэш и номер под которым был записан этот символ: print(«C\1MBO\2»).
Параметр:

  • num: номер под которым будет записан символ.
  • array: массив представляющий записываемый символ.

Примечание: Массив состоит из нескольких байт, количество которых равно количеству строк в символе. Каждый установленный бит байта соответствует установленному (отображаемому) пикселю символа.

print(text);
Вывод текста, символов или цифр на экран дисплея.
Параметр:

  • text: символ, число или строка для вывода на дисплей.

Примечание: Синтаксис схож с одноимённой функцией класса Serial.

#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol_d = {0b00000, // 1 строка символа «д» 0b00000, // 2 строка символа «д» 0b00110, // 3 строка символа «д» 0b01010, // 4 строка символа «д» 0b01010, // 5 строка символа «д» 0b01010, // 6 строка символа «д» 0b11111, // 7 строка символа «д» 0b10001}; // 8 строка символа «д» Весь массив можно записать одной строкой: uint8_t symbol_d={0,0,6,10,10,10,31,17}; // uint8_t symbol_i = {0b00000, // 1 строка символа «и» 0b00000, // 2 строка символа «и» 0b10001, // 3 строка символа «и» 0b10011, // 4 строка символа «и» 0b10101, // 5 строка символа «и» 0b11001, // 6 строка символа «и» 0b10001, // 7 строка символа «и» 0b00000}; // 8 строка символа «и» Весь массив можно записать одной строкой: uint8_t symbol_i={0,0,17,19,21,25,17,0}; void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1,symbol_d); // Загружаем в память дисплея первый символ lcd.createChar(2,symbol_i); // Загружаем в память дисплея второй символ lcd.clear(); // Чистим экран lcd.setCursor(0,0); // Устанавливаем курсор в крайний верхний угол lcd.print(«Pa\1\2o»); // Выводим текст «Paдиo» при этом символы ‘P’, ‘a’ , ‘o’ пишем латиницей, } // а символы ‘д’, ‘и’ выводим из памяти дисплея, указывая их номера // void loop(){ // lcd.setCursor(0,1); lcd.print(» «); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(«i»); lcd.print(«arduino»); lcd.print(«.ru»); // выводим текст «i» «arduino» «.ru» в нижней строке delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(» «); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12.345); // выводим число 12.34 (выводится 2 знака после запятой) delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(» «); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12, HEX); // выводим число 12 в виде шестнадцатиричного числа delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(» «); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(1); // выводим число 1 delay(2000); // ждём 2 секунды }

9zip.ru Радиотехника, электроника и схемы своими руками PI металлодетектор на микроконтроллере ATMEGA8
Этот проект был найден на словенском сайте
PI (Pulse Induction) металлодетекторы работают по принципу изменения индуктивности катушки, когда рядом с ней находится металл. Импульс, создаваемый генератором, усиливается и подаётся на катушку. В этот момент вокруг неё образуется электромагнитное поле. Когда ток через катушку прерывается, магнитное поле вокруг катушки также исчезает. Из-за явления самоиндукции возникает импульс обратной полярности. Для предотвращения возникновения колебаний, катушка шунтируется резистором. Когда возле катушки находится металл, спад этого импульса происходит длиннее, чем обычно. Изменение этого спада, который обычно короче, вполне достаточно, чтобы его уловить. Для лучшего отслеживания делается несколько последовательных измерений, результат которых подаётся на интегратор, с выхода которого поступает готовым для дальнейшей обработки.
Преимущество подобного типа металлоискателей состоит в простоте изготовления катушки и отсутствии влияния минерализации грунта. Недостатком же является отсутствие возможности различать типы металлов. Сама катушка при этом не должна иметь металлических частей.
Если металлодетектор делать на микроконтроллере, то он (МК) может выполнять сразу несколько функций. Микроконтроллер генерирует точные импульсы и паузы, отмеряя все нужные тайминги. В качестве интегратора можно использовать его АЦП.
Данный металлоискатель построен на микроконтроллере ATMEGA8, имеющем весь необходимый функционал. Он может работать с резонатором на 16 МГц, имеет 6 АЦП выходов, достаточно памяти и выводов для подключения периферии. В качестве устройства отображения используется стандартный дисплей 16*2.
Схема металлодетектора состоит из нескольких блоков:

  • питание
  • микроконтроллер + дисплей + кнопки
  • усилитель импульсов
  • поисковая катушка
  • детектор и усилитель


нажми для увеличения

Напряжение от аккумулятора поступает на схему через дроссель L1, подавляющий помехи от поисковой катушки. После него установлен диод для защиты от отрицательных всплесков той же катушки. Дополнительно он защищает схему от переполюсовки. Конденсатор C2 большой ёмкости играет важную роль: он запасает энергию, необходимую для импульсов. Линейный стабилизатор формирует напряжение для питания микроконтроллера. Так как используемый в схеме операционный усилитель требует двухполярного питания, для его формирования применена распространённая микросхема ICL7660, включенная по схеме т.н. зарядового насоса.

Как понятно из описания принципа работы, тайминги играют важную роль при измерении ответа от поисковой катушки; они зависят от самой катушки и ширины импульсов, подаваемых на неё. Чем шире импульс, тем больше энергии запасается в катушке, и тем медленнее будет спадать импульс. Для управления временными параметрами используются кнопки.
PORTC.0 сконфигурирован, как выход. Микроконтроллер формирует на этом выводе короткий импульс (100-450 мкс). Этот импульс используется для создания магнитного поля в поисковой катушке. Ширина этого импульса определяет мощность металлодетектора: широкие импульсы дают мощное магнитное поле, увеличивая диапазон поисков. Ширина их регулируется с шагом 50 мкс. С вывода микроконтроллера импульсы поступают на драйвер полевого транзистора.
Возможно, кому-то покажется странным использование P-канального транзистора. Но если вместо него применить N-канальный, интересующее нас напряжение будет колебаться в районе +/- 12 вольт. По этой причине напряжение питания операционного усилителя должно быть таким же. P-канальный транзистор применён потому, что форма затухающего сигнала катушки проще всего измеряется относительно массы.
Транзистор является силовым ключом. IRF9630 может работать с импульсами до -200 вольт. Значительно лучше — MPT2P50E, с максимальным напряжением -400 вольт, но его сложнее найти. Транзистор должен быть установлен на радиатор, особенно если поисковая катушка выполнена не очень качественно. Параллельно ей подключен двунаправленный супрессор PKE6KE400CA, который защищает транзистор от пробоя импульсом отрицательного напряжения с катушки. Резистор R2 и супрессор P6KE5VCA ограничивают сигнал, подаваемый затем на отрицательный вход операционного усилителя.
Предусилитель выполнен на LF356 (он значительно лучше, чем LF357 или LM318, хотя их тоже можно использовать). Потенциометр, подключённый к балансным входам ОУ, смещает сигнал в положительную или отрицательную сторону. Им устанавливается «точка нуля» прибора.
АЦП микроконтроллера может обрабатывать напряжение только положительной полярности, поэтому после выхода ОУ установлен диод. Рекомендуется использовать диод Шоттки из-за малого падения напряжения.
Сигнал поступает на вход ADC2, в качестве опорного напряжения используется +5В. Импульс измеряется с через установленное временем задержки. Это время нужно подобрать под конкретную катушку и мощность импульса. Задержка может быть выставлена в диапазоне 40-58 мкс с шагом 5 мкс. Мощность импульса регулируется от 100 до 450 мкс.
Вход ADC5 отслеживает напряжение аккумулятора через делитель напряжения на резисторах. Если оно опускается ниже 9 вольт, прибор выдаёт соответствующее сообщение и прекращает работу.
Для ускорения работы с дисплеем используется пин R/W, подключённый к PORTD.1, а не к массе, как обычно. Дисплей отображает всю необходимую информацию: напряжение аккумулятора, длительность импульса, величину задержки. Также графически и в числовом виде выводится полученный от катушки ответный сигнал. Пьезодинамик подключен к PORTB.0. Он позволяет не смотреть на экран в процессе поиска. Динамик генерирует звук с частотой, зависящей от наличия металла под поисковой катушкой. При отсутствии такового, должны быть слышны одиночные пощёлкивания.
В начале программы происходит конфигурирование портов микроконтроллера. После сброса порты находятся в высокоимпедансном состоянии, что может повредить полевой транзистор. Поэтому первым делом PORTC.0 конфигурируется, как выход и в него выводится низкий логический уровень. Затем конфигурируются АЦП, таймер для генерации звука и ЖК-дисплей.
В начале программы измеряется напряжение питания, и если оно меньше 9 вольт, осуществляется переход на подпрограмму, которая выводит предупреждение на дисплей и больше ничего не делает, запрещая дальнейшую работу.
Если напряжение в пределах нормы, то программа выполняет цикл в течение 40 раз. В процессе этого генерируется импульс, ожидается время, а затем производится замер напряжения. Результат всех 40 замеров усредняется. Это значение выводится на дисплей. Это же значение определяет частоту генерируемого тона, который излучает динамик. Программа также опрашивает кнопки, чтобы изменять тайминги.
Изготовление поисковой катушки достаточно сложное. Самый простой способ — начертить на фанере круг диаметром 20 см, разделить окружность на 16 частей и забить туда маленькие гвоздики с надетыми кембриками. На эту заготовку следует намотать 30 витков проволоки диаметром 0,6 мм. Получившуюся катушку следует скрепить изолентой. Соединять катушку с прибором следует коаксиальным кабелем длиной не более 2 метров. В законченной конструкции катушка крепится к штанге металлоискателя.
Маленькие катушки предпочтительны для поиска мелких предметов, но они имеют и меньшую глубину поиска. Также можно экспериментировать с формой катушек. Следует ориентироваться на реакцию прибора на монету с расстояния 20 см. Индуктивность катушки должна быть в районе 400 мкГн.
Экспериментируя с другими катушками, следует подключить прибор к источнику питания через амперметр и посмотреть потребление. Маловитковые катушки будут давать большее потребление и более сильный нагрев транзистора.
Пайку деталей следует начинать с установки SMD-компонентов, перемычек, панелек для микросхем, а затем припаивать остальные детали. Дроссель L1 можно намотать на ферритовом колечке — 10…15 витков диаметром 0,6 мм. Конденсатор C1 следует располагать лёжа для экономии места.

Потребление прибора в момент включения без поисковой катушки должно быть в районе 40…50 мА. Отключи питание, подключи катушку, расположив её вдали от металла минимум на 1 метр, и включи снова. Потенциометром установи частоту звука в районе 1 Гц. Если это не удаётся, кнопками измени длительность импульса. На экране в этот момент должно быть значение в районе 5…8. Поднеси к поисковой катушке металлический предмет; звук и показания на дисплее в этот момент должны измениться. Здесь также можно отрегулировать длительность импульса и величину задержки для оптимальной чувствительности. Не настраивай прибор вблизи включенных ЭЛТ-экранов (телевизор, монитор), т.к. катушка будет улавливать их магнитное поле.
Чем же хорош этот проект? Прежде всего, своей простотой. Конечно, схему следует улучшить и усовершенствовать прошивку, тогда можно получить действительно хороший металлодетектор с простой настройкой.

admin

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх