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

Нам понадобится
- Плата Arduino Uno
- Макетная плата
- Перемычки
- Сервопривод Tower Pro9g SG90
- Пьезоизлучатель
- 3 светодиода разного цвета
- Резистор с сопротивлением 1 МОм
- 3 резистора с сопротивлением 220 Ом
Требуемые библиотеки
- Servo

Принцип работы
В этом проекте вы соберете цепь, которая при правильной комбинации стука перемещает рычаг сервопривода, чтобы открыть сундук или дверь. До сих пор мы использовали пьезоизлучатель только для воспроизведения звука, но мы также можем использовать его в качестве датчика для обнаружения звуков, в данном случае стука. Когда пьезоизлучатель фиксирует стук, он вместо воспроизведения звука выдает напряжение, значение которого зависит от силы удара. Программа будет фиксировать значения этого напряжения и если они попадают в определенный диапазон, Arduino зарегистрирует их как корректные. Если будут определены три удара с правильным напряжением, код будет взломан, а рычаг сервопривода переместится, чтобы разблокировать коробку или дверь.
Ниже показаны две строки кода, которые мы будем использовать позже в скетче. Они определяют диапазон значений напряжения. Если три последовательных значения напряжения будут находиться в диапазоне от 10 до 100, то стук будет принят как корректный.
const int quietKnock = 10; const int loudKnock = 100;
Если вы постучите слишком слабо или слишком громко, стук не будет принят. Вам нужно сделать три «правильных» удара, чтобы заставить рычаг сервопривода переместился. После определения правильной последовательности и силы стука, рычаг сервопривода повернется на 90 градусов, чтобы «разблокировать» коробку или дверь. Светодиоды, показанные на рис. 9.1, служат индикаторами состояния блокировки: красный светодиод загорается, если стук неверный и рычаг сервопривода не перемещается (то есть коробка или дверь все еще заблокированы); желтый светодиод мигает, когда регистрируется стук и отображается правильный код; а зеленый светодиод загорается и сервопривод перемещается после трех правильных ударов.

Для достижения наилучшего результата выньте пьезоизлучатель из его корпуса и прикрепите пьезоизлучатель непосредственно к внутренней части коробки или снаружи двери, чтобы датчик был более чувствителен к вибрации от стука.
Сборка
1. Установите на макетную плату резистор с сопротивлением 1 МОм и подключите красный провод пьезоизлучателя к одной ножке, а черный — к другой. Подключите черный провод к шине заземления, а красный провод — к контакту АО платы Arduino

2. Подключите желтый провод сигнала управления сервопривода напрямую к контакту 9 платы Arduino, коричневый провод — к контакту GND, а красный провод — к контакту 5V

3. Установите светодиоды на макетную плату. Короткие ножки (катоды) должны быть подключены к контакту GND. Длинные ножки (аноды) следует подключить к контактам Arduino через резисторы с сопротивлением 220 Ом следующим образом: желтый светодиод подключается к контакту 3 платы Arduino, зеленый — к контакту 4, а красный — к контакту 5

4. Подключите шину питания макетной платы к контакту 2 платы Arduino. В нашем проекте питание подается непрерывно, но вы можете добавить переключатель в цепь между контактом 2 платы Arduino и шиной питания, чтобы экономить электричество, когда проект не используется.
5. Проверьте подключение шин макетной платы к контактам GND и 5V платы Arduino.
6. Убедитесь, что ваша цепь соответствует схеме на рис. 9.2, а затем загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Сборка
Вначале вызывается библиотека Servo и настраивается контакт 9 платы Arduino, предназначенный для управления сервоприводом. Светодиоды подключены к контактам 3,4 и 5 платы Arduino и будут загораться в зависимости от правильности стука. Пьезоизлучатель в этом проекте действует как датчик, а не средство воспроизведения звука, и подключен к контакту А0 платы Arduino. Когда раздается стук, он фиксируется пьезоизлучателем, и на аналоговый контакт А0 платы Arduino передается электрический ток, напряжение которого зависит от силы стука — чем он сильнее, тем выше напряжение. Стук, генерирующий напряжение со значением менее 10, рассматривается как слишком слабый, а со значением выше 100 — как слишком громкий, так что в любом из этих случаев стук не будет определен как корректный. Красный светодиод загорается, если стук неправильный, а желтый — если правильный. Допустимо любое значение между 10 и 100, которое рассматривается как «правильный» стук и считается. Если получено три «правильных» стука, сервопривод приходит в движение и загорается зеленый светодиод.
Как было упомянуто, уровень напряжения задается в следующих двух строках кода:
const int quietKnock = 10; const int loudKnock = 100;
Для повышения уровня безопасности можно уменьшить данный диапазон, чтобы усложнить код для взлома. Ниже представлен полный код скетча:
#include <Servo.h>Servo servo9; // Контакт, к которому подключен контакт управления сервопривода const int piezo = A0; // Контакт, к которому подключен пьезоизлучатель const int switchPin = 2; // Контакт, к которому подключен сервопривод const int yellowLed = 3; // Контакт, к которому подключен желтый светодиод const int greenLed = 4; // Контакт, к которому подключен зеленый светодиод const int redLed = 5; // Контакт, к которому подключен красный светодиод int knockVal; // Значение силы стука int switchVal; const int quietKnock = 10; // Установка минимального допустимого значения const int loudKnock = 100; // Установка максимального допустимого значения boolean locked = false; // Логическая переменная int numberOfKnocks = 0; // Значение количества стуков void setup() { servo9.attach(9); pinMode(yellowLed, OUTPUT); // Перевод контактов, к которым подключены светодиоды, в режим вывода pinMode(greenLed, OUTPUT); pinMode(redLed, OUTPUT); pinMode(switchPin, INPUT); // Перевод контакта, к которому подключен сервопривод, в режим ввода Serial.begin(9600); digitalWrite(greenLed, HIGH); // Подается питание на зеленый светодиод, если комбинация стуков корректна servo9.write(0); Serial.println("Крышка открыта"); } void loop() { if (locked == false) { switchVal = digitalRead(switchPin); if (switchVal == HIGH) { locked = true; digitalWrite(greenLed, LOW); digitalWrite(redLed, HIGH); servo9.write(90); Serial.println("Крышка закрыта!"); delay(1000); } } if (locked == true) { knockVal = analogRead(piezo); // Значение стука, считываемое аналоговым контактом if (numberOfKnocks < 3 && knockVal > 0) { if (checkForKnock(knockVal) == true) { // Проверка корректности количества ударов // number of knocks numberOfKnocks++; } Serial.print(3 - numberOfKnocks); Serial.println(" more knocks to go"); } if (numberOfKnocks >= 3) { // Подача питания на сервопривод, если зафиксированы 3 корректных стука locked = false; servo9.write(0); delay(20); digitalWrite(greenLed, HIGH); digitalWrite(redLed, LOW); Serial.println("Крышка открыта!"); } } } boolean checkForKnock(int value) { // Проверка силы стука if (value > quietKnock && value < loudKnock) { // Значение силы стука должно находиться в указанном диапазоне digitalWrite(yellowLed, HIGH); delay(50); digitalWrite(yellowLed, LOW); Serial.print("Допустимое значение стука "); Serial.println(value); return true; } else { // Если значение false, передать текущие данные на монитор порта IDE Serial.print("Неудачное значение стука "); Serial.println(value); return false; } }
Теги: