В современном мире существует ряд механизмов (машин), для функционирования которых критически важно отсутствие вибрации. Наличие вибрации может повредить эти машины. Обнаружение и измерение силы вибраций в настоящее время не является технически сложной проблемой – на рынке сейчас можно приобрести датчики вибрации различных типов. Самые лучшие результаты показывают датчики вибрации на основе акселерометров – они обнаруживают вибрацию при помощи измерения ускорения или скорости. Однако подобные датчики достаточно дороги. Но одновременно с этим существуют несколько специализированных и дешевых датчиков, которые предназначены только для обнаружения вибраций. Одним из таких датчиков является SW-420. В статье мы рассмотрим подключение этого датчика вибрации к плате Arduino Uno.
Модуль датчика вибрации SW-420
Внешний вид этого модуля показан на следующем рисунке.
Модуль датчика вибрации (Vibration Sensor Module) SW-420 может работать с напряжением от 3.3V до 5V. В составе этого модуля присутствует компаратор LM393, который позволяет обнаруживать вибрации выше определенной границы и, таким образом, обеспечивать на цифровом выходе модуля датчика сигнал логической 1 или логического 0. При отсутствии вибраций (нормальный режим функционирования) на выходе датчика присутствует сигнал логического 0, а при обнаружении вибраций на выходе датчика формируется сигнал логической 1. В составе модуля датчика есть и светодиоды: один для индикации подаваемого питания на модуль, а другой – для индикации состояния выхода. Также присутствует потенциометр, с помощью которого можно регулировать границу срабатывания, то есть устанавливать чувствительность датчика. В нашем проекте для питания модуля датчика вибрации SW-420 мы будем использовать напряжение 5V.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль датчика вибрации SW-420 (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Соединительные провода.
- USB кабель для загрузки программы.
Работа схемы
Схема подключения датчика вибрации SW-420 к плате Arduino Uno представлена на следующем рисунке.
Светодиод подключен к контакту D13. Модуль датчика вибрации SW-420 запитывается от контакта 5V платы Arduino. Выход модуля датчика вибрации подключен к контакту A5 платы Arduino.
На следующем рисунке представлена та же самая схема нашего проекта, но нарисованная с помощью программы fritzing – может быть для кого-нибудь она покажется более удобной.
Объяснение программы для Arduino
Написание программы для работы с датчиком вибрации не потребует от нас больших усилий – нам всего лишь нужно проверять состояние контакта платы Arduino, к которому подключен датчик, и на основании результата проверки формировать соответствующие управляющие команды. Полный текст программы приведен в конце статьи, здесь же мы кратко рассмотрим ее основные фрагменты.
Первым делом в программе нам необходимо подключить используемые библиотеки. Поскольку мы писали программу в среде Eclipse IDE, то нам необходимо в программе подключить библиотеку <Arduino.h> - при использовании Arduino IDE необходимости в подключении этого заголовочного файла нет.
1 |
#include <Arduino.h> |
Также в программе определим два макроса: ON и OFF.
1 2 |
#define ON 1 #define OFF 0 |
Далее дадим имена используемым в проекте контактам: датчик вибрации подключен к контакту A5, светодиод – к контакту 13 (встроенный светодиод платы также используется в проекте и он тоже подключен к контакту 13).
1 2 3 4 5 |
/* * Pin Description */ int vibration_Sensor = A5; int LED = 13; |
Затем в программе объявим две переменные целого типа – для хранения текущего и предыдущего состояния датчика чтобы обнаруживать были ли вибрации или нет.
1 2 3 4 5 |
/* * Programme flow Description */ int present_condition = 0; int previous_condition = 0; |
Далее в функции void setup() мы задаем режим работы используемых контактов – на ввод и вывод данных.
1 2 3 4 5 6 7 |
/* * Pin mode setup */ void setup() { pinMode(vibration_Sensor, INPUT); pinMode(LED, OUTPUT); } |
Также мы запрограммируем функцию для того, чтобы мигнуть светодиодом 2 раза. Вы можете по своему желанию изменить задержку между миганиями.
1 2 3 4 5 6 7 8 9 10 |
void led_blink(void) { digitalWrite(LED, ON); delay(250); digitalWrite(LED, OFF); delay(250); digitalWrite(LED, ON); delay(250); digitalWrite(LED, OFF); delay(250); } |
В функции void loop() мы будем сравнивать текущее и предыдущее состояние датчика. Если они отличаются, то светодиод начнет мигать до тех пор пока они не станут одинаковыми. В начале работы программы эти две переменные (previous_condition и present_condition) равны нулю, а светодиод выключен. При появлении вибраций переменная present_condition становится равной 1 и светодиод начинает мигать. Когда вибрация останавливается обе переменные снова становятся равными нулю и светодиод перестает мигать.
1 2 3 4 5 6 7 8 9 10 |
void loop() { previous_condition = present_condition; present_condition = digitalRead(A5); // Reading digital data from the A5 Pin of the Arduino. if (previous_condition != present_condition) { led_blink(); } else { digitalWrite(LED, OFF); } } |
Тестирование работы проекта
Для того, чтобы собрать схему проекта, нам не потребуется макетной платы, достаточно будет всего лишь платы Arduino UNO. При отсутствии вибраций светодиод будет в выключенном состоянии, при их появлении светодиод начнет мигать – если этого не происходит, проверьте надежность соединений в схеме.
Исходный код программы (скетча)
Статья переведена с иностранного сайта, поэтому я не стал убирать из программы первые строчки, в которых указан автор программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/*//==============================================================================// * Vibration Sensor interfacing with Arduino * Date: - 15-04-2019 * Author:- Sourav Gupta * For:- circuitdigest.com */ //=============================================================================// #include <Arduino.h> #include <stdio.h> #define ON 1 #define OFF 0 /* * Pin Description */ int vibration_Sensor = A5; int LED = 13; /* * Programme flow Description */ int present_condition = 0; int previous_condition = 0; /* * Pin mode setup */ void setup() { pinMode(vibration_Sensor, INPUT); pinMode(LED, OUTPUT); } /* * Led blink */ void led_blink(void); /* * main_loop */ void loop() { previous_condition = present_condition; present_condition = digitalRead(A5); // считываем значение с контакта A5 платы Arduino if (previous_condition != present_condition) { led_blink(); } else { digitalWrite(LED, OFF); } } void led_blink(void) { digitalWrite(LED, ON); delay(250); digitalWrite(LED, OFF); delay(250); digitalWrite(LED, ON); delay(250); digitalWrite(LED, OFF); delay(250); } |