Датчик наклона и вибрации SW-520D
Модуль, который позволяет фиксировать вибрацию и смену положения своего чувствительного элемента в пространстве.
- Обзор датчика
- Технические характеристики
- Подключение к 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 соответствуют стандартам качества и как следствие полностью могут заменить ртутные.