Замок с радиоуправлением на Arduino.

Наверное, у каждого есть место, где лежат личные вещи, и вы не хотите, чтобы к ним был доступ у других. Как же защитить от несанкционированного доступа к личным вещам? Сделать навесной замок, или, может, установить врезной замок? Но мы не будем искать легких путей, и, в данном Arduino проекте, сделаем замок с радиоуправлением на Arduino. Это достаточно простой проект, и повторить его будет несложно. Но у вас должна быть возможность распечатать несколько деталей на 3D принтере. Блоги о 3Д принтере сегодня очень распространены, и также можно заказать печать в вашем городе, относительно недорого.

Описание работы механизма замка на Arduino.

Механическая часть замка взята из интернета, и называлась она «Door lock with Arduino», скачать исходные материалы можно со страницы автора. Механическая часть замка сделана неплохо, но кода управления нет, поэтому я решил сделать свою версию замка.

Распечатал всё необходимое для проекта. А из подручных материалов собрал вот такой макет двери, чтобы наглядно можно было проверить работу замка.

из подручных материалов собрал вот такой макет двери

Принцип работы замка.

Замок работает достаточно просто, на шпильку диаметром 8 мм надевается напечатанная деталь с зубцами, в виде реечной передачи. Так как у меня не было под рукой нужной шпильки, я использовал строительную шпильку М8 с резьбой, чтобы резьба не мешала скольжению, надел термоусадочную трубку с обоих концов шпильки. Зафиксировал шпильку с помощью винта.

Шпилька устанавливается на основание, которое прикручивается к двери. Также, на основание крепится шаговый двигатель 28BYJ-48. На вал двигателя одевается шестеренка, которая и перемещает нашу шпильку.

Механическая часть замка на радио управлении.

Также напечатал ответную часть, которая устанавливается на дверной косяк, и позволяет закрывать двери. Если у вас есть боковая стенка, в которой можно сделать отверстие, данную деталь можно и не печатать.

Электроника радиозамка на Arduino.

Как вы поняли, приводом замка будет шаговый двигатель 28BYJ-48. Шаговый двигатель продается вместе с драйвером ULN2003, что позволяет без проблем подключить шаговый двигатель к ардуино. Подробнее о подключении шагового двигателя 28BYJ-48 читайте в уроке: «Подключаем к Arduino Шаговый двигатель 28BYJ-48 на драйвере ULN2003».

Для проверки работоспособности собрал всю электронику на столе. И вот что получилось.

Для проверки работоспособности собрал всю электронику на столе

Схема для теста радиоуправляемого замка на Arduino.

Схема для теста радиоуправляемого замка на Arduino.

Для проверки работоспособности использовал, вместо конечного выключателя, обычную тактовую кнопку.

Давайте рассмотрим алгоритм работы замка для того, чтобы можно было написать код.

Алгоритм работы радиоуправляемого замка.

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

  • Когда мы закрываем, дверной замок должен срабатывать на закрытие. Для подачи сигнала установим конечный выключатель, при срабатывании которого подаем сигнал на вращение шагового двигателя для закрытия замка.
  • Дверь закрыта, о чем сигнализирует замкнутый контакт конечного выключателя. Для открытия дверей нужно нажать на кнопку на пульте управления. После чего двигатель начнет отрывать замок.
  • После открытия замка мы открываем дверь. При открытии дверей, если мы случайно нажмем на пульте на кнопку открыть, ничего не должно происходить. Это связано с тем, что дверь открыта и замок находится в открытом состоянии.
  • При закрытии дверей мы должны также запретить повторное закрытие замка. Если вдруг будет ложное срабатывание конечного выключателя, или прочий форс-мажор.

Такой нехитрый алгоритм работы замка должен быть.

Пояснение к коду замка на Arduinoс радиопультом.

Для управления шаговым двигателем будем использовать библиотеку AccelStepper library. Про работу с данной библиотекой рассказывал в уроке про драйвера шаговых двигателей: «Как подключить A4988 (DRV8825) к Arduino? Скетч, библиотека». Но еще раз повторюсь, как её установить.

Установка библиотеки AccelStepper.

Чтобы установить библиотеку, перейдите в «Скетч» -> «Подключить библиотеку» -> «Управление библиотеками». Подождите, пока диспетчер библиотек загрузит индекс библиотек, и обновит список установленных библиотек.

Установка библиотеки AccelStepper.

Отфильтруйте свой поиск, набрав «Accelstepper». Щелкните первую запись и выберите «Установка».

Отфильтруйте свой поиск, набрав «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.

Схема подключения радиоуправления замком на Arduino UNO.

Схема подключения радиоуправления замком на Arduino UNO.

В качестве источника питания использую Powerbank 5В 1А. Пока тестировал, проверял и снимал видео, Powerbank немного разрядился, и шаговый двигатель стал пропускать шаги. Поэтому рекомендую, в качестве источника питания, использовать блок питания на 5В 1А. Можно взять зарядку от старого телефона.

Вывод.

Замок работает отлично и для того, чтобы закрывать полочку с Wi-Fi роутером от детей, или ящик с документами, также, возможно, ящик с лекарствами, будет неплохим решением. Для закрытия межкомнатной, или офисной, двери данное решение не подойдет, так как есть недоработки. А именно, нужно добавить кнопку, чтобы можно было открывать дверь изнутри, без радиопульта. А также добавить звуковую или световую сигнализацию состояния, открыта дверь, или закрыта. Поэтому будет продолжение.

Понравился проект Замок с радиоуправлением на Arduino? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Файлы для печати Файлы для печати.zip407 Kb 776 Скачать
Скетч замка с радиоуправлением на Arduino Скетч замка с радиоуправлением на Arduino .ino2 Kb 703 Скачать
библиотека AccelStepper библиотека AccelStepper.zip86 Kb 734 Скачать

Комментарии

Ваше Имя*


Разработка проектов