- Обзор датчика
- Технические характеристики
- Подключение к Arduino
- Пример использования
- FAQ
Обзор датчика
Количество Arduino-проектов растет с каждым днём. Любители этой платформы ежедневно решают различные задачи, применяя всевозможные модули, датчики и шилды. В данной статье будет рассмотрен интересный модуль, который позволяет фиксировать вибрацию и смену положения своего чувствительного элемента в пространстве. Производители выпускают данный девайс под названием SW-520D. Его внешний вид показан на рисунке №1.
Рисунок №1 - внешний вид и распиновка модуля SW-520D
Взглянув на рисунок, можно заметить датчик SW-520D, распаянный на плате с электронной обвязкой, основные элементы которой рассмотрены ниже. Подстроечный резистор, включенный в паре с операционным усилителем LM393, позволяет регулировать чувствительность датчика к механическим воздействиям. Индикатор питания в виде SMD-светодиода загорается при подаче на модуль 5В. Индикатор сработки имеет аналогичное исполнение и помогает визуально отследить момент срабатывания датчика. Модуль имеет три вывода, два из которых предназначены для подачи питания, а третий является сигнальным.
На рисунке №2 приведена электрическая схема модуля SW-520D.
Рисунок №2 - электрическая схема модуля SW-520D
Как видно из вышеприведенного рисунка, микросхема LM393 работает в режиме компаратора, сравнивая два сигнала (опорный и полезный) на своих входах. Опорный сигнал масштабируется подстроечным резистором R3, тем самым меняя чувствительность модуля к показаниям датчика вибрации. В зависимости от результата сравнения на выходе микросхемы будет высокий или низкий логический уровень. Светодиод LED1 является индикатором наличия питания. Светодиод LED2 загориться в случае присутствия логического нуля на выходе D0, тем самым указывая на сработку датчика SW-520D.
Чтобы эффективно использовать датчик вибрации и наклона в своих проектах, следует понимать физику процессов, которые в нём происходят. На первый взгляд неопытному пользователю может показаться, что поведение датчика слегка нелогично. Однако, ознакомившись с внутренним устройством SW-520D, как правило всё становится на свои места. Обращаю внимание, что сейчас речь идет не о модуле в целом, а конкретно о самом датчике, имеющем цилиндрическую форму с двумя медными выводами.
Конструктивно датчик SW-520D представляет собой полый цилиндр в котором свободно перемещаются два металлических шарика, замыкая и размыкая чувствительные электроды. Чтобы понять в какой именно момент происходит замыкание, следует ознакомиться с рисунком №3, на котором есть вся необходимая информация.
Рисунок №3 - схема срабатывания датчика наклона и вибрации SW-520D
Технические характеристики
- Вертикальный угол срабатывания: 45;
- Горизонтальный угол срабатывания 10;
- Максимальный ток электродов: 300 мА;
- Рабочее напряжение: 3.3-5 В;
- Выходной ток компаратора: более 15 мА;
- Тип выхода: цифровой;
- Сопротивление разомкнутых контактов: более 10 Мом;
- Сопротивление замкнутых контактов: менее 30 Ом;
- Размер платы: 32х14мм;
- Размер модуля с датчиком: 45х14мм.
Подключение к Arduino
Для подключения модуля SW-520D к Arduino понадобится всего три провода, два из которых обеспечат питание, а по третьему будет передаваться сигнал на микроконтроллер. На рисунке №4 приведена соответствующая схема.
Рисунок №4 - схема подключения модуля SW-520D к Arduino
Детектировать изменение состояния датчика можно простым чтением логического уровня на входе D2, но в сложных программах микроконтроллер может быть занят другими задачами и как следствие пропустить кратковременную сработку. Поэтому целесообразно использовать внешние прерывания. В плате Arduino Nano и ей подобных для этого есть выводы D2 и D3. Ниже представлен простой пример программного кода, выводящий сообщение в терминал при сработке датчика.
volatile bool flagDetect = false; // Флаг детектирования вибрации // Функция - обработчик прерывания по изменению сигнала на входе D2 void detectFunc() { // Если есть наклон или вибрация, временно запрещаем опрос датчика // чтобы вывести сообщение в терминал if(!flagDetect) flagDetect = true; } void setup() { // Активация внешнего прерывания на входе D2 attachInterrupt(0, detectFunc, CHANGE); Serial.begin(9600); } void loop() { if(flagDetect) { // Если зафиксирован наклон или вибрация // Выводим в терминал сообщение о фиксации наклона/вибрации Serial.println("Vibration or tilt detected"); // Разрешаем опрашивать датчик в прерывании flagDetect = false; } }
Пример использования
Модуль SW-520D может найти применение в любых проектах, где есть хоть какая-нибудь потребность в детектировании вибрации или наклона. Наиболее популярными направлениями являются:
- квест-комнаты;
- детские игрушки;
- охранные и противоугонные системы;
- спортивные тренажеры;
- различные бытовые приборы;
- детекторы детонации и т.д.
Для более тесного знакомства с модулем SW-520D, создадим небольшой проект GSM-сигнализации, в котором данный модуль будет закреплён на окне охраняемого объекта контролируя его целостность. Схема проекта показана на рисунке №5
Рисунок №5 - схема GSM сигнализации с использованием SW-520D
Итак основным элементом схемы является плата Arduino Nano, которая возьмёт на себя всю основную работу. В роли GSM-модема выступит доступный и популярный среди ардуинщиков модуль SIM800L, питание которого обеспечивается DC-DC преобразователем MP2307DN. Резисторы необходимы для согласования логических уровней между микроконтроллером и GSM-модемом. Ну и наконец выход SW-520D заведен на пин обработки внешних прерываний, чтобы гарантировано зафиксировать факт проникновения.
Алгоритм работы сводится к следующему. При подаче питания Arduino запоминает состояние датчика SW-520D и с этого момента начинает фиксировать любые отклонения. Как только на входе D2 произойдёт смена логического уровня, микроконтроллер передаст соответствующую АТ-команду модулю SIM800L. Тот в свою очередь выполнит звонок на номер хозяина охраняемого объекта. Номер дозвона будет прописан в программе и при желании может быть заменен на любой другой.
Задача поставлена - время программировать. Ниже приведен код с подробными комментариями:
// Номер телефона хозяина охраняемого объекта в международном формате String phoneNumber = "+380678068008"; // Библиотека для общения с SIM800L #include <SoftwareSerial.h> // Экземпляр класса для работы с GSM-модулем (RX=10 TX=9) SoftwareSerial SIM800L = SoftwareSerial(10, 9); // Флаг детектирования вибрации volatile bool flagVibration = false; // Текущая фаза или состояние программы uint8_t globalState = 0; // *** ФУНКЦИЯ ПРЕДВАРИТЕЛЬНЫХ УСТАНОВОК *** void setup() { // Инициализация терминала и порта общения с GSM-модулем Serial.begin(9600); SIM800L.begin(9600); // Активация внешнего прерывания на входе D2 по смене лог. уровня attachInterrupt(0, detectFunc, CHANGE); } // *** ОСНОВНОЙ ЦИКЛ *** void loop() { if(globalState == 0) { if(flagVibration) { // Если зафиксирован наклон или вибрация // Вывод в терминал сообщения о проникновении Serial.println("ALARM!!!"); // Звоним абоненту callOut(phoneNumber); } } else if(globalState == 1) { // Разрешаем опрашивать датчик в прерывании flagVibration = true; globalState = 0; } } // --- ОБРАБОТЧИК ПРЕРЫВАНИЯ ПО ИЗМЕНЕНИЮ ЛОГ. УРОВНЯ НА ВХОДЕ D2 --- void detectFunc() { // Если есть наклон или вибрация, временно запрещаем опрос датчика // чтобы оповестить хозяина if(!flagVibration) flagVibration = true; } // --- ФУНКЦИЯ ПОСЫЛКИ КОМАНДЫ GSM-МОДУЛЮ SIM800L С ОЖИДАНИЕМ ОТВЕТА --- String sendATCommand(String cmd) { uint32_t sacTimeout = millis() + 2000; String answer = ""; Serial.print("Arduino->SIM800L: "); Serial.println(cmd); SIM800L.println(cmd); while(!SIM800L.available() && millis() < sacTimeout) {}; if(SIM800L.available()) answer = SIM800L.readString(); else answer = "timeout..."; Serial.println("SIM800L->Arduino: "); Serial.println(answer); return answer; } // --- ФУНКЦИЯ ДОЗВОНА АБОНЕНТУ --- void callOut(String number) { static uint32_t callOutTimeout = 0; static uint8_t callOutState = 0; if(callOutState == 0) { String a = sendATCommand("ATD" + number + ";"); // Набираем абонента a.trim(); if(a.startsWith("OK")) { // Если набор номера прошёл успешно callOutTimeout = millis() + 20000; // Звонить будем в течение 20 секунд callOutState = 1; // Переходим к следующему этапу } else delay(200); // Если набор номера прошёл неуспешно - повторяем процедуру через 200мс } else if(callOutState == 1) { if(millis() > callOutTimeout) { callOutState = 2; } } else if(callOutState == 2) { // В случае недозвона, выводим сообщение в терминал Serial.println("Call out timeout..."); sendATCommand("ATH"); // Ложим трубку callOutState = 0; globalState++; // Переходим к следующей фазе } }
FAQ. Часто задаваемые вопросы
Вопрос: Возможно ли применение “голого” датчика SW-520D вне модуля?
Ответ: Да, вполне возможно. В этом случае подключение к плате Arduino можно выполнить по следующей схеме:
Вопрос: Какое максимальное напряжение могут коммутировать контакты датчика SW-520D?
Ответ: Максимально коммутируемое напряжение составляет 20В.
Вопрос: Какое гарантированное количество срабатываний может обеспечить датчик SW-520D?
Ответ: Коммутация контактов внутри датчика SW-520D имеет механическую природу, поэтому такое понятие как гарантированное количество срабатываний имеет место быть. Для подобных датчиков оно составляет порядка 100000.
Вопрос: Какова герметичность датчика?
Ответ: Сам датчик выполнен в герметичном корпусе и не боится воды и пыли, чего не скажешь о схеме модуля.
Вопрос: Насколько надежен датчик SW-520D в сравнении с аналогичными ртутными датчиками.
Ответ: Согласно заявления производителей, внутренние контакты SW-520D соответствуют стандартам качества и как следствие полностью могут заменить ртутные.