СКУД, малина и чайник

от автора

imageОсновные действующие лица перечислены в заголовке, а в результате мы получим прототип простой системы контроля доступа на основе точно такого RFID модуля RC522, которую можно использовать не только для открывания двери, но и выполнения любого аналогичного действия путем подачи и прекращения подачи управляющего сигнала.

В виде наличия множество разнообразной информации в интернете с не совсем рабочими примерами, постараюсь описать все пошагово и подробно. Данный модуль работает с RFID картами на частоте 13,56 МГц и легко понимает кроме карт и чипов с такой частотой, ещё и единые проездные билеты Москвы (я использовал использованный одноразовый единый билет), а также NFC-метки.

Hardware

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

Схема подключения модуля

image

Для проверки работы модуля я использовал несколько диодов и пьезодинамик. Красный и зеленый диоды — для индикации состояния работы условного замка (красный — замок закрыт, зеленый — замок открыт), желтый диод — для индикации управляющего сигнала (в реальных условиях будет заменен на замок), пьезодинамик — подает звуковой сигнал во время открытия замка и сигнализирует об ошибке. В реальной схеме с замком целесообразно использовать реле для управления цепью питания замка.

Схема подключения диодов и динамика

image

Software

Для начала необходимо включить SPI на Raspberry, если не включен. Как это сделать, написано здесь.
Теперь можно скачать библиотеку для работы с нашим модулем и проверить чтение и запись карт. Для нас важно чтение, в частности чтение UID карты, для этого вводим в консоли:

git clone https://github.com/mxgxw/MFRC522-python 

Для корректной работы скачанного кода необходимо также скачать и установить SPI-py:

git clone https://github.com/lthiery/SPI-Py sudo python /SPI-Py/setup.py install 

Теперь можно считывать UID карты и записанную в неё информацию. Для этого запускаем их загруженных нами файлов пример:

cd MFRC522-python sudo python Read.py 

На экране должно появиться:

Welcome to the MFRC522 data read example Press Ctrl-C to stop. 

После этого можно поднести к считывателю карточку или метку и мы увидим её UID

Card detected Card read UID: 60,56,197,101 Size: 8 Sector 8 [12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

В данном случае нас интересует эта часть: UID: 60,56,197,101.
А эту часть мы можем изменять

Заголовок спойлера

, заменяя нули нужными нам значениями: Sector 8 [12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], но это нас сейчас не интересует.

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

Скрипт с моими комментариями

#!/usr/bin/env python  import RPi.GPIO as GPIO import MFRC522 import signal import time  red = 11 green = 18 speaker = 16 doorlock = 12  # Список UID карт (UID карты узнаем с помощью sudo python /MFRC522-python/Read.py card_01 = '6056197101' #white card_02 = '148167101184' #fob card_03 = '13652116101' #единый  #Настройка портов вывода GPIO.setmode(GPIO.BOARD) # Это значит, что считаем пины по порядку с левого верхнего (3v3 - первый) GPIO.setup(red, GPIO.OUT, initial=1) # Устанавливаем пин 18 на вывод GPIO.setup(green, GPIO.OUT, initial=0) # тоже самое с пином 11 GPIO.setup(speaker, GPIO.OUT, initial=0) # пин 16 GPIO.setup(doorlock, GPIO.OUT, initial=0) # пин 12  continue_reading = True  def end_read(signal,frame): # что делать, если программу прервать и как её прервать     global continue_reading     print "Ctrl+C captured, ending read."     continue_reading = False     GPIO.cleanup()  # Create an object of the class MFRC522 (??) MIFAREReader = MFRC522.MFRC522()  while continue_reading:  # Сканируем карты - считываем их UID     (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)      # Если карту удалось считать, пишем "карта найдена"     if status == MIFAREReader.MI_OK:         print "Card detected"      # Считываем UID карты     (status,uid) = MIFAREReader.MFRC522_Anticoll()      # Если считали UID, то идем дальше     if status == MIFAREReader.MI_OK:         # выводим UID карты на экран         UIDcode = str(uid[0])+str(uid[1])+str(uid[2])+str(uid[3])         print UIDcode          # Если карта есть в списке         if UIDcode == card_01 or UIDcode == card_03 or UIDcode == card_02:         # то дверь открывается         # предполагается, что замок открывается при подаче на         # него (на реле, управляющее замком), напряжения         # т.е. им управляет переключаемое реле         # т.е. замок открывается при высоком значении пина doorlock         # при этом, горит зеленая, тухнет красная и пищит динамик                  GPIO.output((red, green, speaker, doorlock), (0,1,1,1))                 print "Door open"                  # успеть дернуть за 1 секунду                 time.sleep(1)                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                  # потом дверь закрывается, о чем нас извещают                 print "Door closed"          # А если карты в списке нет, то моргаем и пищим         else:                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                 time.sleep(0.05)  		GPIO.output((red, green, speaker, doorlock), (1,0,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,0,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (0,1,1,0))                 time.sleep(0.05)                 GPIO.output((red, green, speaker, doorlock), (1,0,0,0))                 print "Unrecognised Card" 

Создаем файл и копируем в него код:

nano rf.py 

сохраняем файл (CTRL+x, y).
Запускаем скрипт командой

sudo python rf.py 

После будет происходить следующее:
красный диод загорится, отображая, что наш «замок» закрыт.
Если к считывателю поднесена карта, номер которой (без запятых) внесен в список, то красный диод потухнет, зеленый диод загорится, сигнализируя, что «замок» открыт, желтый диод загорится — он в данном случае «контрольный», показывая, что на «замок» идет управляющий сигнал, пьезодинамик запищит. Через заданное время (в нашем случае 1 секунду) диоды и динамик вернутся к исходному состоянию, считыватель будет ожидать считывания карты.
Если к считывателю поднесена карта не из списка, то красный и зеленый диод будут мигать, пьезодинамик будет прерывисто пищать, сигнализируя ошибку, желтый диод не загорится (т.е. сигнал на открытие «замка» не идет). Чуть меньше чем через секунду все вернется к исходному состоянию.

Короткое видео, иллюстрирующее работу:

ссылка на оригинал статьи https://geektimes.ru/post/271498/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *