Все статьиHardware

RFID-замок на Arduino: система контроля доступа своими руками

БА
Бексултан Айтен
CTO, Alashed
15 мая 2025 г.
10 мин чтения
RFID-замок на Arduino: система контроля доступа своими руками

Собираем электронный дверной замок на Arduino с RFID-считывателем RC522, сервоприводом, светодиодами и зуммером. Полный код, схема и пояснения для школьных проектов.

Введение

Технология RFID (радиочастотная идентификация) окружает нас повсюду: транспортные карты, пропуска в офис, банковские карточки с бесконтактной оплатой. Принцип прост -- маленький чип внутри карты хранит уникальный номер, а считыватель распознаёт его на расстоянии нескольких сантиметров без физического контакта.

В этом проекте мы соберём систему контроля доступа с RFID-замком. Подносите авторизованную карту -- загорается зелёный светодиод, звучит приятный сигнал, сервопривод поворачивается и открывает замок. Подносите неизвестную карту -- красный свет, тревожный звук, замок остаётся закрытым. Через 5 секунд замок автоматически запирается. Проект рассчитан на учеников 7-10 классов и занимает 2-3 часа.

Чему вы научитесь:

  • Работать с RFID-модулем RC522 по протоколу SPI
  • Управлять сервоприводом для имитации замка
  • Создавать систему авторизации с белым списком карт
  • Организовывать обратную связь через звук и свет

Необходимые компоненты

КомпонентКоличествоНазначение
Arduino Uno1Управляющий контроллер
RFID-модуль RC5221Считывание карт и брелоков
RFID-карта или брелок1-2Ключи доступа (идут в комплекте с RC522)
Сервопривод SG901Механизм замка
Пьезозуммер (активный)1Звуковые сигналы
Светодиод зелёный1Индикатор разрешённого доступа
Светодиод красный1Индикатор отказа
Резисторы 220 Ом2Ограничение тока светодиодов
Макетная плата1Сборка без пайки
Провода-перемычки15 шт.Соединение компонентов
Собранный RFID-замок на Arduino с модулем RC522 и сервоприводом
Собранный RFID-замок на Arduino с модулем RC522 и сервоприводом

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

RFID-модуль RC522 (интерфейс SPI)

RC522 общается с Arduino по шине SPI. Четыре линии SPI на Arduino Uno закреплены за конкретными пинами:

  • SDA (SS) -- пин D10
  • SCK -- пин D13
  • MOSI -- пин D11
  • MISO -- пин D12
  • RST -- пин D9
  • 3.3V -- к выводу 3.3V на Arduino
  • GND -- к шине GND
Схема подключения RFID-модуля RC522 к Arduino
Схема подключения RFID-модуля RC522 к Arduino

Важно: RC522 работает от 3.3 В. Подключение к 5 В может повредить модуль. На Arduino Uno есть отдельный вывод 3.3V -- используйте именно его.

Сервопривод SG90

  • Оранжевый провод (сигнал) -- пин D6
  • Красный провод (питание) -- шина 5V
  • Коричневый провод (земля) -- шина GND

Светодиоды и зуммер

  • Зелёный светодиод -- анод через резистор 220 Ом к пину D3, катод к GND
  • Красный светодиод -- анод через резистор 220 Ом к пину D4, катод к GND
  • Пьезозуммер -- плюсовой вывод к пину D5, минусовой к GND

Код программы

Установите библиотеку MFRC522 через менеджер библиотек Arduino IDE (автор: GithubCommunity). Библиотеки SPI и Servo уже встроены.

```cpp

// RFID-замок на Arduino

// Компоненты: RC522 + SG90 + зуммер + светодиоды

#include <SPI.h>

#include <MFRC522.h>

#include <Servo.h>

// Пины RFID-модуля RC522

#define SS_PIN 10

#define RST_PIN 9

// Пины периферии

#define SERVO_PIN 6

#define GREEN_LED 3

#define RED_LED 4

#define BUZZER_PIN 5

// Создаём объекты модуля и сервопривода

MFRC522 rfid(SS_PIN, RST_PIN);

Servo lockServo;

// UID авторизованной карты (замените на свой!)

// Чтобы узнать UID вашей карты, загрузите этот скетч

// и откройте Serial Monitor -- UID отобразится при поднесении

byte authorizedUID[] = {0xAB, 0xCD, 0x12, 0x34};

byte uidLength = 4;

// Текущее состояние замка

bool isLocked = true;

void setup() {

// Настраиваем пины на выход

pinMode(GREEN_LED, OUTPUT);

pinMode(RED_LED, OUTPUT);

pinMode(BUZZER_PIN, OUTPUT);

// Начальное состояние: замок закрыт, горит красный

digitalWrite(GREEN_LED, LOW);

digitalWrite(RED_LED, HIGH);

// Инициализация сервопривода в закрытом положении

lockServo.attach(SERVO_PIN);

lockServo.write(0); // 0 градусов = замок заперт

// Запуск SPI и RFID-считывателя

Serial.begin(9600);

SPI.begin();

rfid.PCD_Init();

Serial.println("=== RFID-замок готов ===");

Serial.println("Поднесите карту к считывателю...");

// Короткий звук готовности

tone(BUZZER_PIN, 1000, 200);

}

void loop() {

// Проверяем, поднесена ли новая карта

if (!rfid.PICC_IsNewCardPresent()) {

return;

}

// Пытаемся прочитать серийный номер карты

if (!rfid.PICC_ReadCardSerial()) {

return;

}

// Выводим UID карты в Serial Monitor

Serial.print("UID карты: ");

printUID(rfid.uid.uidByte, rfid.uid.size);

Serial.println();

// Сравниваем UID с авторизованным

if (checkAccess(rfid.uid.uidByte, rfid.uid.size)) {

grantAccess(); // Доступ разрешён

} else {

denyAccess(); // Доступ запрещён

}

// Завершаем работу с текущей картой

rfid.PICC_HaltA();

rfid.PCD_StopCrypto1();

}

// Проверка: совпадает ли UID с разрешённым

bool checkAccess(byte *uid, byte size) {

if (size != uidLength) {

return false;

}

for (byte i = 0; i < size; i++) {

if (uid[i] != authorizedUID[i]) {

return false;

}

}

return true;

}

// Доступ разрешён: открываем замок

void grantAccess() {

Serial.println(">> Доступ РАЗРЕШЁН!");

// Включаем зелёный, выключаем красный

digitalWrite(RED_LED, LOW);

digitalWrite(GREEN_LED, HIGH);

// Мелодия успеха: два коротких высоких сигнала

tone(BUZZER_PIN, 1500, 150);

delay(200);

tone(BUZZER_PIN, 2000, 150);

delay(200);

// Поворачиваем сервопривод -- открываем замок

lockServo.write(90); // 90 градусов = открыто

isLocked = false;

// Держим открытым 5 секунд

delay(5000);

// Закрываем замок обратно

lockServo.write(0);

isLocked = true;

// Возвращаем красный индикатор

digitalWrite(GREEN_LED, LOW);

digitalWrite(RED_LED, HIGH);

Serial.println("Замок снова заперт.");

}

// Доступ запрещён: тревожный сигнал

void denyAccess() {

Serial.println(">> Доступ ЗАПРЕЩЁН!");

// Три тревожных сигнала с миганием красного

for (int i = 0; i < 3; i++) {

digitalWrite(RED_LED, HIGH);

tone(BUZZER_PIN, 400, 200);

delay(300);

digitalWrite(RED_LED, LOW);

delay(200);

}

// Возвращаем постоянный красный

digitalWrite(RED_LED, HIGH);

}

// Вывод UID в шестнадцатеричном формате

void printUID(byte *buffer, byte bufferSize) {

for (byte i = 0; i < bufferSize; i++) {

Serial.print(buffer[i] < 0x10 ? " 0" : " ");

Serial.print(buffer[i], HEX);

}

}

`

Разбор кода

Протокол SPI. Модуль RC522 использует шину SPI для связи с Arduino. SPI состоит из четырёх линий: MOSI (данные от Arduino к модулю), MISO (обратно), SCK (тактовый сигнал) и SS (выбор устройства). Библиотека MFRC522 полностью берёт на себя низкоуровневое общение.

Авторизация по UID. Каждая RFID-карта или брелок содержит уникальный идентификатор длиной обычно 4 байта. Массив authorizedUID хранит разрешённый номер. Первый шаг после загрузки программы -- поднести вашу карту и посмотреть её UID в Serial Monitor, а затем вписать его в код.

Работа сервопривода. SG90 поворачивается на заданный угол от 0 до 180 градусов. В нашей системе 0 градусов означает "заперто", а 90 градусов -- "открыто". После 5-секундной паузы замок автоматически возвращается в закрытое положение.

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

Неблокирующая проверка. Функции PICC_IsNewCardPresent() и PICC_ReadCardSerial() работают мгновенно -- если карты нет, программа сразу возвращается в начало цикла и не тратит ресурсы на ожидание.

Как добавить несколько авторизованных карт

Для поддержки нескольких карт создайте двумерный массив UID и проверяйте совпадение с каждым в цикле. Например, объявите массив из трёх карт по 4 байта и в функции checkAccess переберите все записи, возвращая true при первом совпадении.

Советы для учителей

1. Первый запуск -- без замка. Начните с чтения UID карт через Serial Monitor. Пусть каждый ученик узнает UID своей карты и впишет его в код.

2. Обсудите безопасность. UID карты передаётся в открытом виде и может быть скопирован. Настоящие системы контроля доступа используют криптографическую аутентификацию -- это хороший повод для дискуссии.

3. Механизм замка. Для демонстрации достаточно прикрепить картонный рычаг к валу сервопривода. Для более реалистичного макета можно напечатать защёлку на 3D-принтере.

4. Расширение проекта. Предложите ученикам добавить LCD-экран для отображения имени владельца карты или SD-модуль для журнала доступа с метками времени.

Как Alashed помогает

В каталоге Alashed Hardware доступны готовые наборы с RFID-модулем RC522, картами, сервоприводами и всей необходимой периферией. Alashed CodeStudio позволяет ученикам работать с Arduino-кодом в браузере -- учитель может раздать шаблон скетча всему классу, а затем наблюдать за прогрессом каждого в реальном времени, помогая с отладкой прямо на уроке.

Попробуйте Alashed бесплатно

Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.

Попробовать бесплатноДемо