
Собираем электронный дверной замок на Arduino с RFID-считывателем RC522, сервоприводом, светодиодами и зуммером. Полный код, схема и пояснения для школьных проектов.
Технология RFID (радиочастотная идентификация) окружает нас повсюду: транспортные карты, пропуска в офис, банковские карточки с бесконтактной оплатой. Принцип прост -- маленький чип внутри карты хранит уникальный номер, а считыватель распознаёт его на расстоянии нескольких сантиметров без физического контакта.
В этом проекте мы соберём систему контроля доступа с RFID-замком. Подносите авторизованную карту -- загорается зелёный светодиод, звучит приятный сигнал, сервопривод поворачивается и открывает замок. Подносите неизвестную карту -- красный свет, тревожный звук, замок остаётся закрытым. Через 5 секунд замок автоматически запирается. Проект рассчитан на учеников 7-10 классов и занимает 2-3 часа.
Чему вы научитесь:
| Компонент | Количество | Назначение |
|---|---|---|
| Arduino Uno | 1 | Управляющий контроллер |
| RFID-модуль RC522 | 1 | Считывание карт и брелоков |
| RFID-карта или брелок | 1-2 | Ключи доступа (идут в комплекте с RC522) |
| Сервопривод SG90 | 1 | Механизм замка |
| Пьезозуммер (активный) | 1 | Звуковые сигналы |
| Светодиод зелёный | 1 | Индикатор разрешённого доступа |
| Светодиод красный | 1 | Индикатор отказа |
| Резисторы 220 Ом | 2 | Ограничение тока светодиодов |
| Макетная плата | 1 | Сборка без пайки |
| Провода-перемычки | 15 шт. | Соединение компонентов |

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

Важно: RC522 работает от 3.3 В. Подключение к 5 В может повредить модуль. На Arduino Uno есть отдельный вывод 3.3V -- используйте именно его.
Установите библиотеку 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 Hardware доступны готовые наборы с RFID-модулем RC522, картами, сервоприводами и всей необходимой периферией. Alashed CodeStudio позволяет ученикам работать с Arduino-кодом в браузере -- учитель может раздать шаблон скетча всему классу, а затем наблюдать за прогрессом каждого в реальном времени, помогая с отладкой прямо на уроке.
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.