Cara Buat Kunci Pintu RFID dengan RC522 dan Arduino Uno

Blue RC522 RFID reader with white card and blue keyfob wired to a blue Arduino Uno and a red two-channel relay module driving an electric strike

Sambungkan RC522 ke pin SPI Arduino Uno, baca UID kad, bandingkan dengan senarai dalam sketch anda, kemudian trigger relay module yang menyuis electric strike 12V. RC522 ialah peranti 3.3V β€” VCC-nya mesti ke pin 3.3V Uno, jangan sekali-kali 5V. Satu library, satu sketch, lebih kurang sepuluh wayar.

Apa yang ada dalam kit RC522, dan apa sebenarnya yang boleh dibacanya?

RC522 dijual di sini sebagai satu set lengkap: PCB reader biru dengan gegelung antena spiral besar terukir pada tembaganya, satu kad RFID putih, satu keyfob biru berbentuk titisan air, dan dua jalur pin header yang masih berasingan β€” satu lurus, satu bengkok 90 darjah. Tiada satu pun yang disolder siap β€” panduan solder header pin kami tunjukkan cara memasang header mana yang sesuai dengan enclosure anda.

Reader ini bekerja pada 13.56 MHz atas standard ISO/IEC 14443A β€” keluarga MIFARE, yang merangkumi kad dan fob dalam kotak serta banyak kad akses pejabat dan kondo β€” tetapi bukan jenis lama 125 kHz, yang langsung tak dapat dilihat oleh reader ini.

Macam mana nak sambung RC522 dan relay ke Arduino Uno?

RC522 berkomunikasi melalui SPI, jadi ia duduk pada pin hardware SPI tetap Uno, dan library MFRC522 memang menjangkakan susunan ini. Biarkan IRQ tanpa sambungan.

Pin modul Arduino Uno Nota
RC522 SDA (SS) D10 Chip select; berlabel SDA pada board ini
RC522 SCK D13 Clock SPI
RC522 MOSI D11 Data keluar SPI
RC522 MISO D12 Data masuk SPI
RC522 RST D9 Reset
RC522 VCC 3.3V Jangan sekali-kali 5V β€” 5V di sini memusnahkan modul
RC522 GND GND Ground dikongsi
Relay IN1 D7 Mana-mana pin digital yang lapang
Relay DC+ 5V Bekalan coil dan opto
Relay DCβˆ’ GND Ground dikongsi

Talian 3.3V ini satu-satunya peraturan tanpa tolak ansur: had mutlak maksimum chip ini pada setiap pin bekalan ialah 4.0V, jadi 5V pada VCC terus membunuhnya β€” cara paling biasa orang merosakkan reader ini. Pin logic-nya pun tidak 5V-tolerant secara rasmi β€” datasheet hadkan pada 0.5V melebihi bekalan, lebih kurang 3.8V β€” dan walaupun dalam praktiknya modul ini biasa sahaja menahan isyarat SPI 5V dari Uno, level shifter atau perintang siri ringkas ialah penyelesaian ikut buku.

Kunci kekal sebagai litar voltan rendah yang berasingan: positif bekalan 12V masuk ke terminal COM relay, NO keluar ke strike, strike balik ke negatif 12V. Channel relay kedua dibiarkan spare.

Gambar rajah pendawaian kartun menunjukkan tujuh wayar jumper dari Arduino Uno biru ke reader RC522 biru dan tiga ke relay module merah yang memacu door strike 12V
Tujuh wayar ke reader, tiga ke relay, dan satu gelung 12V tiga wayar yang berasingan β€” Arduino langsung tak menyentuhnya.

Kenapa projek ini guna relay module dan bukan bare relay?

Relay Songle SRD-05VDC-SL-C ialah kiub biru di atas board merah itu, dan kami jual juga sebagai komponen berasingan untuk projek yang ada driver stage sendiri β€” tetapi tiada bare relay, milik kami atau sesiapa pun, yang boleh dipacu terus dari pin Arduino. Coil 5V-nya berukuran 70 Ξ©, jadi ia menarik lebih kurang 71 mA sedangkan pin I/O Uno dinilai untuk 20 mA sahaja, dan bila coil dimatikan ia menendang balik spike voltan yang lambat-laun akan membawa pin itu sekali.

Sebab itu bare relay perlukan transistor driver dan flyback diode dibina sekelilingnya. Module 2-channel dah sedia ada kedua-duanya, plus optocoupler pada setiap input β€” itulah sebabnya ia komponen pilihan dalam projek ini. Pin anda hanya memacu LED opto pada beberapa milliamp; module yang uruskan coil.

Macam mana nak elak kunci klik terbuka bila Arduino reset?

Relay module 2-channel ini ada jumper block kecil di sebelah terminal input, bertanda untuk high atau low level trigger, yang menentukan logic level mana yang menarik relay. Ini penting untuk kunci: semasa power-up dan reset, pin Uno terapung sebagai input, input terapung boleh terbaca LOW, dan pada low-level trigger kunci akan klik terbuka setiap kali board di-power-cycle.

Dua tabiat menyelesaikannya: pilih sisi trigger dengan sengaja, sebab high-level trigger membuatkan pin terapung tak berbahaya, dan set keadaan idle pin sebagai perkara pertama dalam setup(), dengan menulis level idle sebelum pinMode(). Panduan keselamatan relay module kami mengupas jumper ini dengan mendalam. Kekalkan kunci pada DC voltan rendah dengan bekalan sendiri β€” switching bekalan mains tiada tempat dalam projek ini.

Perbandingan kartun menunjukkan reader RC522 biru dikuasakan dengan betul dari pin 3.3V Arduino berbanding reader yang sama berasap selepas disambung ke 5V
VCC RC522 mesti duduk di pin 3.3V. Tersasar satu pin sahaja bermakna reader mati, dan inilah cara paling biasa orang membunuhnya.

Macam mana nak dapatkan UID kad anda dan jalankan sketch?

Library MFRC522 oleh GithubCommunity ialah yang perlu dipasang: Arduino IDE Library Manager, cari MFRC522, pilih entri itu. Upload sketch di bawah tanpa ubah apa-apa, buka Serial Monitor pada 9600 baud dan tap kad anda β€” ia mencetak UID setiap kad yang dilihatnya, dibenarkan atau tidak. Salin byte itu ke dalam allowedUids, upload semula, dan kad itu kini membuka kunci.

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN     10   // RC522 SDA/SS
#define RST_PIN     9   // RC522 RST
#define RELAY_PIN   7   // IN1 pada relay module

// Padankan dengan jumper trigger anda: LOW/HIGH untuk low-level trigger,
// HIGH/LOW untuk high-level trigger.
#define RELAY_ACTIVE  HIGH
#define RELAY_IDLE    LOW
#define UNLOCK_MS   3000

MFRC522 mfrc522(SS_PIN, RST_PIN);

// Kad yang dibenarkan, UID 4-byte. Ganti dengan UID yang dicetak sketch ini.
byte allowedUids[][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF},
  {0x12, 0x34, 0x56, 0x78}
};
const byte allowedCount = sizeof(allowedUids) / sizeof(allowedUids[0]);

// Pulangkan true hanya jika UID yang di-tap sepadan dengan satu baris penuh senarai.
bool isAllowed(byte *uid, byte size) {
  if (size != 4) return false;          // senarai ini untuk UID 4-byte sahaja
  for (byte c = 0; c < allowedCount; c++) {
    byte matched = 0;
    for (byte i = 0; i < 4; i++) {
      if (uid[i] == allowedUids[c][i]) matched++;
    }
    if (matched == 4) return true;
  }
  return false;
}

void setup() {
  // Letakkan relay pada idle SEBELUM pin jadi output, supaya ia tak
  // glitch ke level aktif semasa board sedang start.
  digitalWrite(RELAY_PIN, RELAY_IDLE);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, RELAY_IDLE);

  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  delay(50);
  mfrc522.PCD_DumpVersionToSerial();  // 0x00 atau 0xFF bermakna masalah pendawaian atau bekalan
  Serial.println(F("Ready. Tap a card."));
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent()) return;
  if (!mfrc522.PICC_ReadCardSerial()) return;

  // Cetak UID setiap kad, supaya anda boleh kutip UID anda sendiri.
  Serial.print(F("UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    if (mfrc522.uid.uidByte[i] < 0x10) Serial.print(F(" 0"));
    else Serial.print(F(" "));
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();

  if (isAllowed(mfrc522.uid.uidByte, mfrc522.uid.size)) {
    Serial.println(F("Granted - unlocking"));
    digitalWrite(RELAY_PIN, RELAY_ACTIVE);
    delay(UNLOCK_MS);
    digitalWrite(RELAY_PIN, RELAY_IDLE);
  } else {
    Serial.println(F("Denied"));
  }

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

Sejujurnya, sejauh mana selamat access control dengan RC522?

UID yang dibandingkan oleh sketch RC522 ini bukan rahsia. Kad menyiarkannya kepada mana-mana reader yang bertanya, sebelum sebarang authentication berlaku, dan kad kosong yang blok UID-nya boleh ditulis semula dijual secara terbuka dengan harga beberapa ringgit sahaja. Dokumentasi library MFRC522 sendiri menyatakannya terus terang: UID tidak boleh dijadikan pengenalan unik untuk projek berkaitan keselamatan.

Membaca sector yang dilindungi pun tidak menyelamatkannya. Cipher Crypto1 pada MIFARE Classic telah dipecahkan secara terbuka sejak 2008, dan penyelidik kemudiannya menunjukkan serangan ciphertext-only yang memulihkan key daripada kad hardened dalam beberapa minit. Pada 2024 Quarkslab menemui backdoor key perkakasan yang dikongsi merentasi satu keluarga penuh chip serasi MIFARE Classic. Crypto1 bukan setakat lemah; ia sudah tamat riwayatnya.

Jadi inilah verdict jujurnya β€” dan ia langsung bukan alasan untuk berhenti membina. Ini projek RBT atau final-year yang cemerlang, log kehadiran atau akses, laci, locker, kabinet workshop, paparan “siapa ada di bench”, atau pagar yang masih menyimpan kunci fizikal sebagai backup. Ia bukan kunci untuk pintu depan rumah anda, peti keselamatan anda, atau apa-apa yang anda tak sanggup kehilangannya.

Bila threat model-nya serius, credential pun kena serius. Kad seperti MIFARE DESFire menggunakan AES-128 dengan mutual authentication, bukan nombor siri yang disiarkan begitu sahaja, dan itulah yang dipakai sistem pintu komersial. Untuk pintu depan rumah, kunci mekanikal yang bagus plus kamera mengalahkan padanan UID setiap masa.

Perbandingan kartun menunjukkan reader RC522 digunakan dengan betul pada kabinet workshop berbanding dipasang secara salah pada pintu depan rumah
Kabinet, locker, laci dan log kehadiran: ya. Pintu depan rumah anda: tidak β€” padanan UID ialah kemudahan, bukan keselamatan.

Kenapa reader tak nampak apa-apa, atau boleh baca tapi tak pernah match?

RC522 tak banyak mod kegagalan dan setiap satu ada tanda tersendiri β€” sebab itulah sketch ini mencetak versi firmware pada setiap boot.

Simptom Punca berkemungkinan Penyelesaian
Versi firmware cetak 0x00 atau 0xFF Pendawaian SPI salah, atau 5V pada VCC Semak semula D9–D13, pindahkan VCC ke 3.3V; modul yang pernah diberi 5V mungkin sudah mati
Versi terbaca elok, tiada kad langsung dikesan Header belum disolder atau cold joint Reflow lapan sambungan itu; goyang-goyang wayar tak membuktikan apa-apa
Bacaan jalan, kemudian berhenti selepas beberapa tap 3.3V lemah atau wayar jumper terlalu panjang Pendekkan wayar bawah 20 cm, kuasakan Uno dari bekalan yang betul, bukan hub laptop
UID dicetak tapi akses sentiasa denied Byte atau panjang tak sepadan dalam senarai Salin byte yang dicetak betul-betul tepat; kad UID 7-byte perlukan semakan panjang diluaskan

Kesilapan biasa yang kami nampak daripada pelanggan sebenar

Corak yang paling makan duit ialah RC522 disambung ke 5V ikut kebiasaan, sebab hampir semua modul lain jalan pada 5V. Kegagalannya muncul sebagai versi firmware 0x00 pada board yang elok sejam sebelumnya β€” diikuti satu petang penuh meragui code yang sebenarnya tiada masalah.

Corak yang makan satu malam pula ialah strike yang tak sehaluan dengan design: diuji di bench dengan relay klik riang-riang, kemudian dipasang pada kunci fail-secure sedangkan plan asal andaikan fail-safe. Putuskan apa yang patut berlaku semasa bekalan elektrik terputus sebelum anda beli strike.

FAQ

Boleh tak saya guna RC522 untuk clone kad akses pejabat atau Touch ‘n Go?

RC522 biasanya boleh membaca UID mana-mana kad 13.56 MHz, dan Touch ‘n Go memang duduk dalam keluarga MIFARE yang sama β€” tetapi kami tidak akan terbitkan prosedur cloning. Menduplikasi credential yang bukan milik anda adalah urusan pihak yang mengeluarkannya, dan baki stored-value tersimpan dalam sector yang di-encrypt, yang bukan hak anda untuk usik.

Boleh tak RC522 membaca menembusi pintu atau dinding?

Ia boleh membaca menembusi beberapa milimeter bahan bukan logam β€” kayu, akrilik, atau faceplate 3D-printed β€” dan begitulah caranya reader disorokkan dalam enclosure. Logam ialah pembunuhnya: pintu logam atau plat belakang logam men-detune antena dan jarak bacaan terus runtuh.

Berapa jarak bacaan sebenar RC522?

Sehingga 50 mm di atas kertas, dan realistiknya 2–4 cm dengan kad putih yang disertakan. Antena keyfob biru yang lebih kecil membaca lebih dekat lagi, dan jarak jatuh lagi bila bekalan kuasa lemah.

Boleh tak saya guna ESP32 sebagai ganti Arduino Uno?

Boleh, malah dari segi elektrik ia padanan yang lebih baik, sebab ESP32 ialah board 3.3V sama macam RC522. Guna pin SPI default β€” MOSI 23, MISO 19, SCK 18, SS 5 β€” dengan RST pada mana-mana GPIO lapang. Perbandingan ESP32 vs ESP8266 vs Uno kami mengupas trade-off-nya.

Berapa banyak kad boleh saya simpan dalam senarai yang dibenarkan?

Jauh lebih banyak daripada yang anda perlukan. Setiap UID 4-byte hanya makan empat byte daripada 2 KB RAM ATmega328P, jadi beratus-ratus muat dalam array. Pindahkan senarai ke EEPROM 1 KB chip itu β€” lebih kurang 250 UID β€” bila kad perlu kekal selepas bekalan terputus dan boleh didaftarkan tanpa upload semula.

Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.

Leave a Reply

Your email address will not be published. Required fields are marked *