Наверное, у каждого есть место, где лежат личные вещи, и вы не хотите, чтобы к ним был доступ у других. Как же защитить от несанкционированного доступа к личным вещам? Сделать навесной замок, или, может, установить врезной замок? Но мы не будем искать легких путей, и, в данном Arduino проекте, сделаем замок с радиоуправлением на Arduino. Это достаточно простой проект, и повторить его будет несложно. Но у вас должна быть возможность распечатать несколько деталей на 3D принтере. Блоги о 3Д принтере сегодня очень распространены, и также можно заказать печать в вашем городе, относительно недорого.
Механическая часть замка взята из интернета, и называлась она «Door lock with Arduino», скачать исходные материалы можно со страницы автора. Механическая часть замка сделана неплохо, но кода управления нет, поэтому я решил сделать свою версию замка.
Распечатал всё необходимое для проекта. А из подручных материалов собрал вот такой макет двери, чтобы наглядно можно было проверить работу замка.
Замок работает достаточно просто, на шпильку диаметром 8 мм надевается напечатанная деталь с зубцами, в виде реечной передачи. Так как у меня не было под рукой нужной шпильки, я использовал строительную шпильку М8 с резьбой, чтобы резьба не мешала скольжению, надел термоусадочную трубку с обоих концов шпильки. Зафиксировал шпильку с помощью винта.
Шпилька устанавливается на основание, которое прикручивается к двери. Также, на основание крепится шаговый двигатель 28BYJ-48. На вал двигателя одевается шестеренка, которая и перемещает нашу шпильку.
Также напечатал ответную часть, которая устанавливается на дверной косяк, и позволяет закрывать двери. Если у вас есть боковая стенка, в которой можно сделать отверстие, данную деталь можно и не печатать.
Как вы поняли, приводом замка будет шаговый двигатель 28BYJ-48. Шаговый двигатель продается вместе с драйвером ULN2003, что позволяет без проблем подключить шаговый двигатель к ардуино. Подробнее о подключении шагового двигателя 28BYJ-48 читайте в уроке: «Подключаем к Arduino Шаговый двигатель 28BYJ-48 на драйвере ULN2003».
Для проверки работоспособности собрал всю электронику на столе. И вот что получилось.
Для проверки работоспособности использовал, вместо конечного выключателя, обычную тактовую кнопку.
Давайте рассмотрим алгоритм работы замка для того, чтобы можно было написать код.
Замок должен работать стабильно, и перемещать шпильку в нужном направлении, при определённых условиях. При внештатной ситуации не должно происходить перемещения, чтобы ничего не повредить, и при дальнейшем использовании дверей, без проблем ее открывать и закрывать.
Такой нехитрый алгоритм работы замка должен быть.
Для управления шаговым двигателем будем использовать библиотеку AccelStepper library. Про работу с данной библиотекой рассказывал в уроке про драйвера шаговых двигателей: «Как подключить A4988 (DRV8825) к Arduino? Скетч, библиотека». Но еще раз повторюсь, как её установить.
Чтобы установить библиотеку, перейдите в «Скетч» -> «Подключить библиотеку» -> «Управление библиотеками». Подождите, пока диспетчер библиотек загрузит индекс библиотек, и обновит список установленных библиотек.
Отфильтруйте свой поиск, набрав «Accelstepper». Щелкните первую запись и выберите «Установка».
Библиотека поддерживает все основные функции для разных типов шаговых двигателей. Достаточно только в коде указать тип вашего шагового двигателя, который вы используйте, и правильно его подключить, и инициализировать работу с ним. В связи с тем, что мы используем в проекте униполярный двигатель, а в уроке, про который я говорил, используются биполярные двигатели, то подключение будет отличаться.
// Замок с радиоуправлением на Arduino // https://arduino-tex.ru/ #include<AccelStepper.h> #define HALFSTEP 8 #define buttonPin 6 #define RADIO_PIN 7 // Определение пинов для управления двигателем #define motorPin1 8 // IN1 на 1-м драйвере ULN2003 #define motorPin2 9 // IN2 на 1-м драйвере ULN2003 #define motorPin3 10 // IN3 на 1-м драйвере ULN2003 #define motorPin4 11 // IN4 на 1-м драйвере ULN2003 boolean lastBt = HIGH; boolean currentBt = false; boolean debvence (boolean last) { boolean current = digitalRead(buttonPin); if ( last != current) { delay(5); current = digitalRead(buttonPin); return current; } } // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper myStepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup() { // Задаём максимальную скорость двигателя myStepper.setMaxSpeed(2000.0); // Задаём ускорение двигателя myStepper.setAcceleration(200.0); // Установим скорость в шагах за секунду myStepper.setSpeed(1200); pinMode(buttonPin, INPUT_PULLUP); pinMode(RADIO_PIN, INPUT); Serial.begin(9600); Serial.println("Ok!"); } void loop() { // Получаем состояние кнопки currentBt = debvence(lastBt); // Если кнопка нажата if (lastBt == HIGH && currentBt == LOW) { myStepper.moveTo(2000); myStepper.runToPosition(); // Ждем пока двигатель не встанет в заданную позицию Serial.println("On"); delay(300); // Ждем } // Изменяем направление шаговика if ( digitalRead(RADIO_PIN) == HIGH && currentBt == LOW) { myStepper.moveTo(0); myStepper.runToPosition(); // Ждем пока двигатель не встанет в заданную позицию Serial.println("Off"); delay(300); // Ждем } lastBt = currentBt; }
Подключаем библиотеку AccelStepper, и указываем тип шагового двигателя, в нашем случае это «8».
#include<AccelStepper.h> #define HALFSTEP 8
Указываем пины подключения конечного выключателя и радиомодуля HY-DJM-5V. Подробное описание радиопульта и радиоприемника HY-DJM-5V читайте в уроке: «Радиопульт с приемником HY-DJM-5V. Подключаем к Arduino».
#define buttonPin 6 #define RADIO_PIN 7
Определим пины подключения драйвера ULN2003.
// Определение пинов для управления двигателем #define motorPin1 8 // IN1 на 1-м драйвере ULN2003 #define motorPin2 9 // IN2 на 1-м драйвере ULN2003 #define motorPin3 10 // IN3 на 1-м драйвере ULN2003 #define motorPin4 11 // IN4 на 1-м драйвере ULN2003
Создадим переменные и функцию для устранения дребезга кнопки. Она будет устранять дребезг контактов конечного выключателя.
boolean lastBt = HIGH; boolean currentBt = false; boolean debvence (boolean last) { boolean current = digitalRead(buttonPin); if ( last != current) { delay(5); current = digitalRead(buttonPin); return current; } }
Инициализируем с последовательностью выводы IN1-IN3-IN2-IN4, для использования AccelStepper с шаговым двигателем 28BYJ-48.
// Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper myStepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
В блоке setup() устанавливаем параметры для работы с шаговым двигателем.
// Задаём максимальную скорость двигателя myStepper.setMaxSpeed(2000.0); // Задаём ускорение двигателя myStepper.setAcceleration(200.0); // Установим скорость в шагах за секунду myStepper.setSpeed(1200);
Инициализируем пин входа конечного выключателя, и пин подключения от радиомодуля.
pinMode(buttonPin, INPUT_PULLUP); pinMode(RADIO_PIN, INPUT);
Инициализируем работу с монитором порта, и выводим "Ok!". Работу с монитором порта можно закомментировать. Я использовал вывод информации в монитор порта для отладки программы.
Serial.begin(9600); Serial.println("Ok!");
В основном цикле loop() получаем состояние кнопки из функции устранения дребезга. Что такое дребезг кнопки, и как с ним бороться, читайте в уроке: «Arduino: Дребезг — программное устранение. Нажатие кнопки без ложных срабатываний».
// Получаем состояние кнопки currentBt = debvence(lastBt);
Дальше проверяем, сработал конечный выключатель, или нет.
// Если кнопка нажата if (lastBt == HIGH && currentBt == LOW) {
Если конечный выключатель нажали, то перемещаем шаговый двигатель на 2000 шагов.
myStepper.moveTo(2000); myStepper.runToPosition(); // Ждем пока двигатель не встанет в заданную позицию
После чего отправляем в монитор порта информацию "On".
Serial.println("On");
Если была нажата кнопка на пульте, и при этом конечный выключатель в нажатом состоянии.
// Если была нажата кнопка на пульте, и при этом конечный выключатель в нажатом состоянии. if ( digitalRead(RADIO_PIN) == HIGH && currentBt == LOW) {
То отправляем команду переместить шаговый двигатель в нулевую точку.
myStepper.moveTo(0); myStepper.runToPosition(); // Ждем пока двигатель не встанет в заданную позицию
Отправляем в монитор порта значение "Off".
Serial.println("Off");
В конце цикла loop() переприсваиваем прошлому состоянию кнопки текущее состояние.
lastBt = currentBt;
Пришло время протестировать электронику замка с радиоуправлением. Для этого собираем все по схеме, которая расположена выше, и загружаем код. Тест проходит отлично. Все работает как надо. Пришло время все установить на стенд, и проверить на работоспособность, при работе в реальных условиях.
На стенде решил использовать Arduino UNO, и схема подключения будет выглядеть немного по-другому. Но пины подключения будут такие же, что и в примере с использованием Arduino NANO.
В качестве источника питания использую Powerbank 5В 1А. Пока тестировал, проверял и снимал видео, Powerbank немного разрядился, и шаговый двигатель стал пропускать шаги. Поэтому рекомендую, в качестве источника питания, использовать блок питания на 5В 1А. Можно взять зарядку от старого телефона.
Вывод.
Замок работает отлично и для того, чтобы закрывать полочку с Wi-Fi роутером от детей, или ящик с документами, также, возможно, ящик с лекарствами, будет неплохим решением. Для закрытия межкомнатной, или офисной, двери данное решение не подойдет, так как есть недоработки. А именно, нужно добавить кнопку, чтобы можно было открывать дверь изнутри, без радиопульта. А также добавить звуковую или световую сигнализацию состояния, открыта дверь, или закрыта. Поэтому будет продолжение.
Понравился проект Замок с радиоуправлением на Arduino? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
![]() |
Файлы для печати.zip | 407 Kb | 848 | Скачать |
![]() |
Скетч замка с радиоуправлением на Arduino .ino | 2 Kb | 765 | Скачать |
![]() |
библиотека AccelStepper.zip | 86 Kb | 809 | Скачать |
Arduino проекты
16 декабря , 2020
Комментариев:0
Файлов для скачивания:3
Фото:4
Понравилась статья? Нажми
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии