Радиочастотная идентификация (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).
- Модуль реле (купить на 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); } } } |