Breadboard with ESP32-C3 SuperMini, RC522 RFID reader module and buzzer, hand tapping an RFID card near a door

ผู้เริ่มต้น

สร้างการสาธิตการเข้าถึงด้วย RFID

เซ็นเซอร์ความปลอดภัยอินพุต

แตะการ์ด ปลดล็อกบางสิ่ง – เทคโนโลยีเดียวกันกับคีย์การ์ดโรงแรม แต่คุณเป็นคนสร้างและเขียนโค้ดเอง

รวมชิ้นส่วนจริง 6 รายการ

ราคารวมชุดนี้: 1,735.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโครงการ

โครงการนี้สร้างการสาธิตการควบคุมการเข้าถึงขนาดเล็กที่ใช้งานได้จริง โดยใช้เทคโนโลยีพื้นฐานเดียวกันกับที่พบในบัตรกุญแจโรงแรมหรือเครื่องอ่านบัตรสำนักงาน: แตะบัตรใกล้กับเครื่องอ่าน และระบบจะตัดสินใจว่าจะอนุญาตการเข้าถึงหรือไม่ ในที่นี้ 'การอนุญาตการเข้าถึง' หมายถึงการส่งเสียงกริ่ง แต่ตรรกะการตัดสินใจเป็นแนวคิดหลักเดียวกันกับที่ใช้ในระบบควบคุมการเข้าถึงจริง

สิ่งที่คอนโทรลเลอร์ทำ

ESP32-C3 SuperMini สื่อสารกับเครื่องอ่าน RC522 ผ่าน SPI รอให้ตรวจพบบัตรหรือคีย์โฟบ อ่านรหัสประจำตัวที่ไม่ซ้ำกัน ตรวจสอบรหัสนั้นกับรายการรหัสที่อนุญาตที่เก็บไว้ในโค้ดของคุณ และเปิดใช้งานกริ่งเฉพาะเมื่อแท็กอยู่ในรายการนั้น

สิ่งที่เครื่องอ่าน RFID ทำ

RC522 สื่อสารกับคอนโทรลเลอร์ผ่าน SPI และเมื่อวางบัตร RFID หรือคีย์โฟบที่เข้ากันได้ภายในไม่กี่เซนติเมตร เครื่องจะอ่านรหัสประจำตัวที่ไม่ซ้ำกัน (UID) ของแท็กนั้น ซึ่งเป็นตัวระบุที่ฝังอยู่ในแท็กทุกอันและแตกต่างกันในแต่ละแท็ก หน้าที่ของเครื่องอ่านสิ้นสุดที่การรายงาน UID; การตัดสินใจว่าจะทำอย่างไรกับ UID นั้นขึ้นอยู่กับโค้ดของคุณ

สิ่งที่กริ่งทำ

กริ่งแบบแอคทีฟเป็นเอาต์พุตเดียวของโครงการนี้ – มันจะส่งเสียงตามคำสั่งจากคอนโทรลเลอร์และไม่มีอะไรอื่น มันไม่มีตรรกะของตัวเอง; มันเพียงแค่ส่งเสียงเมื่อได้รับคำสั่ง ซึ่งเป็นสิ่งที่คุณต้องการสำหรับสัญญาณ 'เข้าถึงได้' ที่ชัดเจนและไม่คลุมเครือ

การเดินสาย SPI และ Reset Pin

RC522 ใช้ SPI ซึ่งเป็นบัสแบบซิงโครนัสที่มีสายนาฬิกา, สายข้อมูลเข้า, และสายข้อมูลออกโดยเฉพาะพร้อมกับสาย Chip-Select ข้อควรระวังทั่วไปสำหรับ RC522 โดยเฉพาะ: บางไลบรารีต้องการให้ Reset Pin ของมันถูกต่อสายและกำหนดในโค้ดอย่างชัดเจน แทนที่จะปล่อยทิ้งไว้เฉยๆ หรือต่อสูงโดยค่าเริ่มต้น – หากเครื่องอ่านไม่สามารถเริ่มต้นได้ นี่คือสิ่งแรกๆ ที่ควรตรวจสอบ

แนวคิดเกี่ยวกับซอฟต์แวร์และไลบรารี

ไลบรารีชุมชนสำหรับ RC522 จัดการการสื่อสาร SPI และการตรวจจับแท็กให้คุณ โดยแสดง UID ที่ตรวจพบเป็นอาร์เรย์ไบต์ง่ายๆ ในโค้ดของคุณ ตรรกะของคุณเองคือสิ่งที่เปลี่ยน UID นั้นเป็นการตัดสินใจ: เปรียบเทียบกับรายการ UID ที่ดีที่รู้จักที่เก็บไว้ และเปิดใช้งานกริ่งเฉพาะเมื่อตรงกัน

การทดสอบและการแก้ไขปัญหา

  • เครื่องอ่านไม่เคยตรวจพบแท็กเลย – ตรวจสอบการเดินสาย SPI อย่างละเอียด โดยเฉพาะอย่างยิ่ง Reset Pin; ไลบรารี RC522 หลายตัวต้องการให้มันถูกกำหนดอย่างชัดเจนในโค้ด และ Reset Pin ที่ลอยหรือไม่ได้เชื่อมต่อเป็นสาเหตุที่พบบ่อยมากที่ทำให้เครื่องอ่านไม่สามารถเริ่มต้นได้
  • มีเพียงแท็กเดียวเท่านั้นที่ใช้งานได้และแท็กอื่น ๆ ถูกปฏิเสธ – ยืนยันว่าโค้ดของคุณกำลังเปรียบเทียบ UID ของแท็กทั้งหมดแบบไบต์ต่อไบต์ ไม่ใช่ส่วนที่ถูกตัดทอนหรือบางส่วน การเปรียบเทียบบางส่วนอาจทำให้แท็กตรงกันหรือไม่ตรงกันอย่างไม่สอดคล้องกัน
  • กริ่งจะดังขึ้นทุกครั้งที่แตะ โดยไม่คำนึงถึงแท็กที่ใช้ – นี่บ่งชี้ถึงข้อผิดพลาดในตรรกะการเปรียบเทียบ UID เอง (เช่น การตรวจสอบรายการที่อนุญาตที่ไม่ได้บังคับใช้จริง) ไม่ใช่ปัญหาฮาร์ดแวร์
  • การตรวจจับไม่สอดคล้องกันแม้กับแท็กที่ทราบว่าใช้งานได้ – ลองถือแท็กให้ใกล้ขึ้นและอยู่กึ่งกลางเครื่องอ่านมากขึ้น; ระยะการอ่านของ RC522 มีเพียงไม่กี่เซนติเมตร และการวางแนวของแท็กอาจส่งผลต่อการตรวจจับที่เชื่อถือได้

การอัปเกรดเสริมในอนาคต: บันทึกการเข้าถึงหลายผู้ใช้

เมื่อระบบควบคุมการเข้าถึงด้วยแท็กเดี่ยวทำงานได้อย่างน่าเชื่อถือแล้ว การขยายที่เป็นธรรมชาติคือการแมป UID ที่รู้จักแต่ละรายการกับชื่อหรือบทบาท และบันทึกการแตะแต่ละครั้ง (แท็กใด ได้รับอนุญาตหรือถูกปฏิเสธ และเมื่อใด) แทนที่จะส่งเสียงกริ่งเท่านั้น ซึ่งจะเปลี่ยนการสาธิตให้ใกล้เคียงกับบันทึกการเข้าถึงจริงมากขึ้น

การเดินสาย

  • RC522 3.3V → ESP32-C3 SuperMini 3.3V — RC522 ใช้ตรรกะ 3.3V เท่านั้น ห้ามจ่ายไฟ 5V เด็ดขาด
  • RC522 GND → GND
  • RC522 SCK → GPIO4 (`SPI_SCK_PIN`)
  • RC522 MISO → GPIO5 (`SPI_MISO_PIN`)
  • RC522 MOSI → GPIO6 (`SPI_MOSI_PIN`)
  • RC522 SDA/SS → GPIO7 (`RFID_SS_PIN`)
  • RC522 RST → GPIO10 (`RFID_RST_PIN`)
  • สัญญาณกริ่งแอคทีฟ/+ → GPIO2 (`BUZZER_PIN`)
  • กริ่งแอคทีฟ GND → GND

ตรวจสอบให้แน่ใจว่า RC522 เชื่อมต่อกับ 3.3V ก่อนเปิดเครื่อง — 5V จะทำให้เสียหายได้ ในการอัปโหลดครั้งแรก สแกนบัตรและคีย์โฟบของคุณและดู Serial Monitor: สเก็ตช์จะพิมพ์ UID ที่สแกนทั้งหมด ดังนั้นคัดลอกไบต์เลขฐานสิบหกจริงที่แสดงลงใน `authorizedUIDs[]` (UID ตัวยึดตำแหน่งในโค้ดเป็นค่าหลอกและจะไม่ตรงกับแท็กจริง) การเข้าถึงที่ได้รับอนุญาตจะส่งเสียงบี๊บยาวหนึ่งครั้ง; การถูกปฏิเสธจะส่งเสียงบี๊บสั้นสามครั้ง

แผนภาพการต่อสาย

3.3V GND SCK → GPIO4 MISO → GPIO5 MOSI → GPIO6 SDA/SS → GPIO7 RST → GPIO10 signal/+ → GPIO2 GND ESP32-C3 SuperMini RC522 Active Buzzer GND

โค้ดเริ่มต้น

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

#define SPI_SCK_PIN  4   // ESP32-C3 default hardware SPI pins - adjust to match your board's silkscreen if different
#define SPI_MISO_PIN 5
#define SPI_MOSI_PIN 6
#define RFID_SS_PIN  7   // RC522 SDA/SS - any free digital GPIO
#define RFID_RST_PIN 10  // RC522 RST - any free digital GPIO
#define BUZZER_PIN   2   // Active buzzer signal - any digital output GPIO

MFRC522 mfrc522(RFID_SS_PIN, RFID_RST_PIN);

// Add the real UIDs of your own cards/keyfobs here after reading them from
// Serial on first boot (see the scanned UID printout). Each UID is the byte
// sequence MFRC522 reports for that tag.
byte authorizedUIDs[][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF}, // placeholder - replace with your card's real UID
};
const int NUM_AUTHORIZED = sizeof(authorizedUIDs) / sizeof(authorizedUIDs[0]);

void printUID(byte *uid, byte size) {
  for (byte i = 0; i < size; i++) {
    Serial.print(uid[i] < 0x10 ? " 0" : " ");
    Serial.print(uid[i], HEX);
  }
  Serial.println();
}

bool isAuthorized(byte *uid, byte size) {
  if (size != 4) return false;
  for (int i = 0; i < NUM_AUTHORIZED; i++) {
    bool match = true;
    for (int j = 0; j < 4; j++) {
      if (authorizedUIDs[i][j] != uid[j]) { match = false; break; }
    }
    if (match) return true;
  }
  return false;
}

void beepGranted() {
  digitalWrite(BUZZER_PIN, HIGH);
  delay(400);
  digitalWrite(BUZZER_PIN, LOW);
}

void beepDenied() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(BUZZER_PIN, HIGH);
    delay(100);
    digitalWrite(BUZZER_PIN, LOW);
    delay(100);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  SPI.begin(SPI_SCK_PIN, SPI_MISO_PIN, SPI_MOSI_PIN, RFID_SS_PIN);
  mfrc522.PCD_Init();

  Serial.println("RFID Access Demo ready - scan a card or keyfob");
  Serial.println("Scanned UIDs print below - copy your own into authorizedUIDs[]");
}

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

  Serial.print("Scanned UID:");
  printUID(mfrc522.uid.uidByte, mfrc522.uid.size);

  if (isAuthorized(mfrc522.uid.uidByte, mfrc522.uid.size)) {
    Serial.println("Access granted");
    beepGranted();
  } else {
    Serial.println("Access denied");
    beepDenied();
  }

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  delay(1000); // avoid re-triggering instantly on the same tag
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา