Радиочастотная идентификация (RFID - Radio Frequency Identification) в настоящее время является недорогой технологией, удобной для применения во многих приложениях: контроля доступа, безопасности, определения местоположения людей и транспортных средств и т.д. Вы могли видеть дверные замки с системой радиочастотной идентификации (RFID) во многих отелях, офисах и других учреждениях. Для того чтобы открыть дверь, оборудованную подобной системой, достаточно прислонить карту с RFID меткой к считывателю подобных карт, и после этого дверь откроется. На нашем сайте вы также можете посмотреть и другие проекты, в которых была использована радиочастотная идентификация.
В этой статье мы рассмотрим дверной замок (Solenoid Door Lock), который будет открываться с помощью соленоида (электромагнитной катушки), а управляться с помощью платы Arduino и радиочастотной идентификации (RFID). Для обнаружения движений двери в нашем проекте будет использоваться датчик Холла и магнит. Датчик Холла будет размещен на раме двери, а магнит будет размещен на самой двери. Когда магнит и датчик Холла будут близко друг к другу, на выходе датчика Холла будет напряжение низкого уровня (low state) и дверь будет оставаться закрытой, а когда дверь будет открытой, то датчик Холла и магнит будут далеко друг от друга, и на выходе датчика Холла будет напряжение высокого уровня (high state). Мы будем использовать эффект Холла для открытия и закрытия двери автоматически. Более подробно о подключении датчика Холла к плате Arduino можно прочитать в этой статье.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- RFID-RC522 Module (модуль радиочастотной идентификации) (купить на AliExpress).
- Замок с электромагнитным управлением, работающий от 12 В (12v Solenoid Lock).
- Модуль реле (купить на AliExpress).
- Датчик Холла (Hall Effect Sensor) (купить на AliExpress).
- Резистор 10 кОм (купить на AliExpress).
- Зуммер (Buzzer) (купить на AliExpress).
Замок с электромагнитным управлением
Замок с электромагнитным управлением (solenoid lock) использует электромеханический блокирующий механизм. Он содержит в своем составе личинку со скошенным концом и монтажный кронштейн. Когда на данный замок подается питание, электрический ток создает магнитное поле, под действием которого личинка втягивается внутрь замка и, таким образом, дверь открывается. Личинка будет оставаться внутри замка до тех пор, пока на замок будет подаваться питание. Когда питание на замок перестает подаваться, личинка выдвигается наружу замка и закрывает дверь. В закрытом состоянии замок не потребляет питания. Внешний вид замка с электромагнитным управлением показан на рисунке ниже. Для управления подобным замком необходим источник питания, который будет выдавать 12V @ 500mA.
Схема проекта
Схема замка с электромагнитным управлением на основе Arduino и радиочастотной идентификации представлена на следующем рисунке.
Соединения между платой Arduino и модулем RFID приведены в таблице ниже. Положительный контакт зуммера подключен к цифровому контакту 4 платы Arduino, а его контакт GND подключен к контакту земли (ground pin) платы Arduino. Резистор 10 кОм подключен между контактами VCC и OUT датчика Холла. Замок с электромагнитным управлением подключен к плате Arduino с помощью модуля реле.
Модуль RFID | Плата Arduino |
SDA | Digital 10 |
SCK | Digital 13 |
MOSI | Digital 11 |
MISO | Digital 12 |
IRQ | не соединен |
GND | GND |
RST | Digital 9 |
3.3V | 3.3V |
Датчик Холла | Плата Arduino |
5V | 5V |
GND | GND |
OUT | 3 |
После пайки компонентов проекта на перфорированной плате у нас получилась конструкция следующего вида:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В начале программы нам будет необходимо подключить все используемые библиотеки, в нашем случае их всего две – одна для связи по интерфейсу SPI между платой Arduino и модулем RFID, и вторая – непосредственно для работы с модулем RFID. Обе эти библиотеки можно скачать по следующим ссылкам:
Также в начальной части программы необходимо определить контакты, к которым подключаются зуммер, замок с электромагнитным управлением (Solenoid Lock) и модуль RFID.
1 2 3 4 |
int Buzzer = 4; const int LockPin = 2; #define SS_PIN 10 #define RST_PIN 9 |
Затем необходимо задать режимы работы для используемых контактов (на ввод или вывод данных), инициализировать связь по протоколу SPI и модуль RFID.
1 2 3 4 5 |
pinMode(LockPin, OUTPUT); pinMode(Buzzer, OUTPUT); pinMode(hall_sensor, INPUT); SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 |
Внутри цикла void loop мы будем считывать значения с датчика Холла и когда у него на выходе будет напряжение низкого уровня (low), мы будем закрывать дверь.
1 2 3 4 5 6 7 8 9 |
state = digitalRead(hall_sensor); Serial.print(state); delay(3000); if(state==LOW){ digitalWrite(LockPin, LOW); Serial.print("Door Closed"); digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW);} |
Также внутри цикла void loop мы будем проверять присутствует ли рядом с модулем RFID новая RFID карта. И если такая карта присутствует рядом с модулем, мы будем проверять ее UID (уникальный идентификатор). Если карта действующая, то мы будем открывать замок, в противном случае мы будем выдавать в окно монитора последовательной связи сообщение ‘You are not authorized’.
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 |
if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Message : "); content.toUpperCase(); if (content.substring(1) == "60 4E 07 1E" ) //change here the UID of the card/cards that you want to give access { digitalWrite(LockPin, HIGH); Serial.print("Door Unlocked"); digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW); } else { Serial.println("You are not Authorised"); digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW); } } |
Тестирование работы замка с электромагнитным управлением и RFID
После того как аппаратная часть проекта у вас будет готова и программа будет загружена в плату Arduino, вы можете приступать к тестированию работы замка.
Также закрепите конструкцию нашего проекта (мы ее выполнили на перфорированной плате) и датчик Холла на раме двери, а магнит – на самой двери как показано на рисунке ниже. При таком расположении датчика Холла и магнита мы сможем обнаруживать движения двери.
Теперь прислоните к считывателю RFID авторизованную карту чтобы открыть замок. Замок будет оставаться в открытом состоянии до тех пор, пока на выходе датчика Холла будет напряжение высокого уровня. После этого, когда мы снова будем закрывать дверь (то есть мы вошли в комнату и закрываем дверь за собой) и магнит окажется рядом с датчиком Холла, то на выходе датчика Холла будет напряжение низкого уровня (Low) вследствие магнитного поля, созданного магнитом, и произойдет закрытие замка.
Вместо датчика Холла можно использовать задержку, по истечении которой производить автоматическое запирание двери (но если человек открыл и потом держал дверь некоторое время чтобы она не закрывалась, то можно поломать механизм замка при закрытии замка если он неудачно спроектирован).
Более подробно работу рассмотренного нами замка с электромагнитным управлением можно посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <SPI.h> #include <MFRC522.h> int hall_sensor = 3; int state,lockread; int Buzzer = 4; const int LockPin = 2; #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. void setup() { Serial.begin(9600); // инициализируем последовательную связь pinMode(LockPin, OUTPUT); pinMode(Buzzer, OUTPUT); pinMode(hall_sensor, INPUT); SPI.begin(); // инициализируем связь по протоколу SPI mfrc522.PCD_Init(); // Initiate MFRC522 (инициализируем RFID модуль) //Serial.println("Approximate your card to the reader..."); // Serial.println(); digitalWrite(LockPin, LOW); } void readsensor() { lockread = digitalRead(LockPin); state = digitalRead(hall_sensor); //Serial.print(lockread); //Serial.print(state); // delay(2000); } void loop() { readsensor(); sensor(); // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) // если новая карта { return; } // выберем одну из карт if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //показываем UID карты в окне монитора последовательной связи String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } //Serial.println(); //Serial.print("Message : "); content.toUpperCase(); if (content.substring(1) == "60 4E 07 1E" ) // измените этот номер на UID вашей карты, которой вы хотите дать доступ { digitalWrite(LockPin, HIGH); Serial.print("Door Unlocked"); digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW); sensor(); } else { Serial.println("You are not Authorised"); // карта не авторизована digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW); } } void sensor() { readsensor(); if (lockread == HIGH){ readsensor(); if(state==LOW){ digitalWrite(LockPin, LOW); Serial.print("Door Closed"); digitalWrite(Buzzer, HIGH); delay(2000); digitalWrite(Buzzer, LOW); } } } |
Есть люди которые смогут помочь с некоторыми дополнениями в коде например с базой данных ключей с последующей отдачей на сервер кто и во сколько вошёл?
Если на сервер данные нужно передавать, то тогда плату Ардуино нужно подключать к интернету, а это усложнение и схемы, и программы. В этом случае я рекомендовал бы делать такой проект на основе модулей ESP8266 или ESP32 - программируются так же как и Ардуино (даже команды те же самые), и к тому же сами через WiFi могут в интернет выходить. Вот похожий пример на нашем сайте - система учета посетителей на NodeMCU ESP8266 и RFID метках, в ней только модуль чтения RFID меток использован другой, но эту часть програмы переделать то несложно.
Вместо реле можно по тавить mosfet. Сам замок по виду хлипковат.
Согласен, можно поставить и mosfet, только зачем - здесь же нам какие то высокие частоты не нужны. Ну вы саму модель замка на алиэкспрессе подороже и помассивнее купите, тогда будет не хлипковат ))
все разобрался )
Хорошо, мы рады что у вас получилось ))
где почитать как добавить карты/брелки?
замок работает неодноразово, если его не подключать в сеть через блок питания.
А как вы тогда подаете питание на схему проекта?
Здравствуйте, собрала по вашей схеме, проблема в том, что он одноразовый, чтобы замок работал заново, нужно либо перепрошивать ардуино, либо отключать и заново подключать питание. Как решить эту проблему?
Добрый вечер, Мария. А почему он одноразовый? Разве у вас замок не сбрасывается в исходное состояние после того как вы закроете дверь и на выходе датчика Холла появится напряжение низкого уровня (Low)?
возможна ли проблема в низкоуровневом реле, я перебросила провода с NO на NC?
Проблемы возможны с любым радиоэлектронным элементом, ничего абсолютно совершенного в этом мире нет. Да, реле может быть причиной того, что у вас замок не сбрасывается в исходное состояние. А переброска проводов с NO на NC в реле решила вашу проблему?
после переброски проводов замок стал одноразовым
Мария, вы же в первом своем комментарии (то есть до переброски проводов) писали о том, что у вас замок одноразовый. Так что изменилось то после переброски проводов?