Наверняка многие из вас в отелях или где-нибудь в других местах уже встречались с электронными замками, которые можно открыть с помощью карты с радиочастотной идентификацией (RFID), без использования привычного механического ключа. Чтобы открыть такую дверь надо просто приложить карту к специальному считывающему устройству на двери – если код на карте разрешенный, то дверь откроется, если нет – дверь останется закрытой. В большинстве случаев механизм электронных замков в таких системах работает от напряжения 12 В, поэтому вы легко можете сконструировать такой замок для своего дома – и эта статья имеет целью научить вас делать это.
В этой статье мы рассмотрим создание электронного замка на основе платы Arduino и модуля считывания радиочастотных меток, который будет открывать дверь только если к нему поднесена правильная карта. Если карта будет неправильная, то замок не откроется и прозвучит предупреждающий сигнал зуммера. Если до этого вы никогда не сталкивались с радиочастотной идентификацией, то советуем вам прочитать статью о подключении к Arduino модуля радиочастотных меток.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль чтения радиочастотных меток EM-18 с картами (с метками) (купить на AliExpress).
- Реле 5v.
- Светодиод (купить на AliExpress).
- Зуммер (Buzzer) (купить на AliExpress).
- Соединительные провода.
- Резисторы (купить на AliExpress).
Схема проекта
Схема электронного замка на основе радиочастотных меток (RFID) и Arduino представлена на следующем рисунке.
Модуль чтения радиочастотных меток EM-18 (RFID Reader)
Аббревиатура RFID означает Radio Frequency Identification и переводится как радиочастотная идентификация. Каждая карта с RFID имеет встроенный в нее уникальный идентификатор (ID), который можно считать с помощью модуля чтения радиочастотных меток. Модуль чтения радиочастотных меток EM-18 работает на частоте 125 кГц и имеет в своем составе встроенную в его чип антенну. Его можно запитать от напряжения 5 В. На своем выходе он обеспечивает последовательную передачу данных со скоростью 9600 бод/с, 8 бит данных и 1 стоповый бит. Диапазон действия модуля – 8-12 см.
На нашем сайте вы можете посмотреть следующие проекты, в которых использовалась радиочастотная идентификация:
- машина для голосования на радиочастотной идентификации и микроконтроллере AVR ATmega32;
- система радиочастотной идентификации (RFID) на микроконтроллере AVR ATmega32.
На выход модуль EM-18 выдает данные в формате ASCII, 12 цифр. Первые 10 из этих 12 цифр представляют собой номер карты, а последние две цифры – результат выполнения операции XOR с номером карты. Они используются для проверки на ошибки.
К примеру, мы считали с карты число 0200107D0D62. Оно расшифровывается следующим образом:
02 – преамбула,
00107D0D – 1080589 в десятичном формате,
62 – результат выполнения операции XOR (02 XOR 00 XOR 10 XOR 7D XOR 0D).
Следовательно, на карте будет написан номер 0001080589.
Объяснение кода программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его наиболее важные фрагменты.
Номер радиочастотной метки (RFID tag number) мы будем сохранять в переменной “char tag”. К примеру, мы в нашем проекте использовали карту с номером метки "180088F889E1". Длина метки – 12 символов, поэтому нам необходимо объявить массив длиной 12 символов - “char input [12]”.
1 2 3 4 |
char tag[] ="180088F889E1"; char input[12]; int count = 0; boolean flag = 0; |
Как определить номер метки на вашей карте можно прочитать в обучающей статье по работе Arduino с RFID.
В следующем фрагменте кода мы устанавливаем режим работы (на вывод данных) используемых нами контактов и инициализируем последовательную связь со скоростью 9600 бод/с. Контакт 2 будет использоваться для управления реле, контакт 3 – для управления светодиодом красного цвета (он используется для индикации режима ожидания), а к контакту 4 подключен зуммер.
1 2 3 4 5 6 7 |
void setup() { pinMode(2,OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); } |
Далее переходим к операциям, осуществляемым в основном теле программы – в функции void loop(). Красный светодиод в этом цикле будет гореть до тех пор, пока не будет выполняться какая-либо другая задача.
Также в функции void loop() мы будем непрерывно проверять поступают ли какие-либо данные по последовательному каналу связи. Если мы считали номер какой-нибудь карты с RFID мы будем сохранять его в массиве input[].
1 2 3 4 5 6 7 8 9 10 11 12 |
void loop( { digitalWrite(3,1); if(Serial.available()) { count = 0; while(Serial.available() && count < 12) { input[count] = Serial.read(); count++; delay(5); } |
Затем мы будем сравнивать принятый номер карты с номером карты, который хранится у нас в массиве char tag[]. Если номера совпадают, то мы устанавливаем флаг в 1, если не совпадают – то в 0.
1 2 3 4 5 6 7 8 9 10 11 |
if(count == 12) { count =0; flag = 1; while(count<12 && flag !=0) { if(tag[count]==input[count]) flag = 1; else flag= 0; } |
Если карта правильная, то флаг будет установлен в 1, в этом случае на контакт 2 будет подано напряжение высокого уровня (HIGH), а на контакт 3 – напряжение низкого уровня (low). Затем через 5 секунд на этих контактах будет восстановлено их исходное состояние. При подаче напряжения высокого уровня на контакт 2 сработает реле, которое откроет электронный замок, а через 5 секунд замок снова закроется.
1 2 3 4 5 6 7 |
if(flag == 1) { digitalWrite(2,HIGH); digitalWrite(3,LOW); delay(5000); digitalWrite(2,LOW); } |
Если вы поднесете к модулю чтения неправильную RFID карту, то флаг установится в 0, в результате чего начнет звучать сигнал зуммера.
1 2 3 4 5 6 7 8 9 10 |
if(flag == 0) { for(int k =0; k<= 10; k++) { digitalWrite(4,HIGH); delay(300); digitalWrite(4,LOW); delay(300); } } |
Работа проекта
Наша система работы с радиочастотными (RFID) метками состоит из двух компонентов – из самих меток и модуля их чтения. Метка состоит из интегрированной в нее схемы и антенна. Схема служит для хранения данных, а антенна – для передачи данных модулю чтения меток. Когда радиочастотная метка оказывается в диапазоне действия модуля чтения меток, радиочастотный сигнал запитывает электронную схему метки и метка начинает последовательно передавать данные. Эти данные принимаются модулем чтения меток и затем в нашем проекте передаются в плату Arduino. В зависимости от номера принятой метки плата Arduino выполняет соответствующие действия.
В нашем проекте правильный номер метки мы уже заранее сохранили внутри программы. Поэтому когда к модулю чтения меток будет подноситься метка с этим номером будет срабатывать реле. В целях демонстрации работы проекта мы к выходу реле подключили светодиод, однако в реальных схемах его достаточно просто заменить на электронный механизм замка, которым и будет управлять реле.
Если к модулю чтения меток подносится карта с неправильным номером будет срабатывать зуммер. Открывающее напряжение на реле подается только на 5 секунд, после чего реле снова закрывается.
Исходный код программы
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 |
char tag[] ="180088F889E1"; char input[12]; int count = 0; boolean flag = 0; void setup() { pinMode(2,OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(3,1); if(Serial.available()) { count = 0; while(Serial.available() && count < 12) { input[count] = Serial.read(); count++; delay(5); } if(count == 12) { count =0; flag = 1; while(count<12 && flag !=0) { if(tag[count]==input[count]) flag = 1; else flag= 0; } if(flag == 1) { digitalWrite(2,HIGH); digitalWrite(3,LOW); delay(5000); digitalWrite(2,LOW); } if(flag == 0) { for(int k =0; k<= 10; k++) { digitalWrite(4,HIGH); } } } } } |