Membangun Pintu Kunci RFID Arduino – Kuasai Teknologi RFID dengan Panduan Langkah demi Langkah
Dalam tutorial ini kita akan mempelajari apa itu RFID, cara kerjanya, dan cara membuat kunci pintu berbasis Arduino RFID. Anda dapat menonton video di bawah ini atau membaca tutorial tertulis di bawah ini untuk detail selengkapnya.
Ringkasan
RFID adalah singkatan dari Radio Frequency IDentification dan merupakan teknologi non-kontak yang banyak digunakan di banyak industri untuk tugas seperti pelacakan personil, kontrol akses, manajemen rantai pasokan, pelacakan buku di perpustakaan, sistem tol, dan sebagainya.[/column]
Cara Kerja RFID
Sebuah sistem RFID terdiri dari dua komponen utama, transponder atau tag yang terletak pada objek yang ingin kita identifikasi, dan transceiver atau pembaca.
Pembaca RFID terdiri dari modul frekuensi radio, unit kontrol, dan sirkuit anten yang menghasilkan medan elektromagnetik frekuensi tinggi. Di sisi lain, tag biasanya merupakan komponen pasif, yang terdiri hanya dari anten dan mikrokip elektronik, jadi ketika tag mendekati medan elektromagnetik transceiver, akibat induksi, tegangan dihasilkan di sirkuit anten tag dan tegangan ini berfungsi sebagai daya untuk mikrokip.
Sekarang setelah tag mendapatkan daya, tag dapat mengekstrak pesan yang ditransmisikan dari pembaca, dan untuk mengirim pesan kembali ke pembaca, tag menggunakan teknik yang disebut load manipulation. Menyalakan dan mematikan beban di anten tag akan mempengaruhi konsumsi daya anten pembaca yang dapat diukur sebagai penurunan tegangan. Perubahan tegangan ini akan ditangkap sebagai nol dan satu, dan itulah cara data ditransfer dari tag ke pembaca.
Ada juga cara lain untuk transfer data antara pembaca dan tag, yang disebut backscattered coupling. Dalam kasus ini, tag menggunakan sebagian daya yang diterima untuk menghasilkan medan elektromagnetik lain yang akan ditangkap oleh anten pembaca.
RFID dan Arduino
Itulah prinsip kerja dasarnya dan sekarang mari kita lihat bagaimana kita dapat menggunakan RFID dengan Arduino dan membangun kunci pintu RFID kita sendiri. Kita akan menggunakan tag yang didasarkan pada protokol MIFARE dan pembaca RFID MFRC522, yang harganya hanya beberapa dolar.
Tag-tag ini memiliki memori 1 KB dan memiliki mikrokip yang dapat melakukan operasi aritmatika. Frekuensi operasinya adalah 13,56 MHz dan jarak operasinya hingga 10 cm tergantung pada geometri anten. Jika kita mendekatkan salah satu tag ini ke sumber cahaya, kita dapat memperhatikan anten dan mikrokip yang sebelumnya kita bicarakan.
Seperti yang kita ketahui, modul pembaca RFID menggunakan protokol SPI untuk komunikasi dengan papan Arduino dan berikut cara kita harus menghubungkannya. Perhatikan bahwa kita harus menghubungkan VCC modul ke 3,3 V dan untuk pin lainnya kita tidak perlu khawatir karena mereka tolerant 5 V.
Setelah kita menghubungkan modul, kita perlu mengunduh perpustakaan MFRC522 dari GitHub. Perpustakaan ini datang dengan beberapa contoh baik yang dapat kita pelajari cara menggunakan modul.
Pertama kita dapat mengunggah contoh “DumpInfo” dan menguji apakah sistem kita berfungsi dengan baik. Sekarang jika kita menjalankan Serial Monitor dan mendekatkan tag ke modul, pembaca akan mulai membaca tag dan semua informasi dari tag akan ditampilkan di serial monitor.
Di sini kita dapat memperhatikan nomor UID tag serta memori 1 KB yang sebenarnya terbagi menjadi 16 sektor, setiap sektor menjadi 4 blok, dan setiap blok dapat menyimpan 2 byte data. Untuk tutorial ini kita tidak akan menggunakan memori tag apa pun, kita hanya akan menggunakan nomor UID tag.
Proyek Kontrol Akses Pintu Kunci RFID Arduino
Sebelum kita melalui kode proyek kunci pintu RFID kita, mari kita lihat komponen dan skema rangkaian proyek ini.
Selain modul RFID, kita akan menggunakan sensor proximity untuk memeriksa apakah pintu tertutup atau terbuka, motor servo untuk mekanisme kunci, dan display karakter.
Anda dapat mendapatkan komponen yang diperlukan untuk tutorial Arduino ini dari tautan di bawah ini:
Modul RFID MFRC522 …………………….
Motor Servo ……………………………………..
Display LCD ………………………………………
Papan Arduino ………………………………….
Breadboard dan Kabel Jumper ……………..
Sensor Proximity CNY70 ……………………
Proyek memiliki alur kerja sebagai berikut: Pertama kita harus mengatur tag master, lalu sistem masuk ke mode normal. Jika kita memindai tag yang tidak dikenal, akses akan ditolak, tetapi jika kita memindai master, kita akan memasuki mode pemrograman di mana kita dapat menambahkan dan mengotorisasi tag yang tidak dikenal. Jadi sekarang jika kita memindai tag lagi, akses akan diberikan sehingga kita dapat membuka pintu.
Pintu akan secara otomatis terkunci setelah kita menutup pintu. Jika kita ingin menghapus tag dari sistem, kita hanya perlu pergi lagi ke mode pemrograman, memindai tag yang diketahui, dan tag akan dihapus.
Kode Sumber
Sekarang mari kita lihat kode. Pertama kita perlu menyertakan perpustakaan untuk modul RFID, display, dan motor servo, mendefinisikan beberapa variabel yang diperlukan untuk program di bawah serta membuat instance perpustakaan.
Di bagian setup, pertama-tama kita menginisialisasi modul dan mengatur nilai awal motor servo ke posisi terkunci. Kemudian kita mencetak pesan awal ke display dan dengan loop “while” berikutnya kita menunggu hingga tag master dipindai. Fungsi khusus getID() mendapatkan UID tag dan kita meletakkannya di lokasi pertama array myTags[0].
void setup() { // Initiating SPI.begin(); // SPI bus mfrc522.PCD_Init(); // MFRC522 lcd.begin(16, 2); // LCD screen myServo.attach(8); // Servo motor myServo.write(10); // Initial lock position of the servo motor // Prints the initial message lcd.print("-No Master Tag!-"); lcd.setCursor(0, 1); lcd.print(" SCAN NOW"); // Waits until a master card is scanned while (!successRead) { successRead = getID(); if ( successRead == true) { myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array lcd.clear(); lcd.setCursor(0, 0); lcd.print("Master Tag Set!"); tagsCount++; } } successRead = false; printNormalModeMessage(); }Bahasa kode: Arduino (arduino)
Mari kita lihat fungsi khusus getID(). Pertama memeriksa apakah ada tag baru yang ditempatkan di dekat pembaca dan jika demikian kita akan melanjutkan ke loop “for” yang akan mendapatkan UID tag. Tag yang kita gunakan memiliki nomor UID 4 byte, jadi itulah sebabnya kita perlu melakukan 4 iterasi dengan loop ini, dan menggunakan fungsi concat() kita menambahkan 4 byte ke dalam satu variabel String. Kami juga mengatur semua karakter string menjadi huruf besar dan di akhirnya kita menghentikan pembacaan.
uint8_t getID() { // Getting ready for Reading PICCs if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue return 0; } if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue return 0; } tagID = ""; for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading return 1; }Bahasa kode: Arduino (arduino)
Sebelum kita memasuki loop utama, di akhir bagian setup, kita juga memanggil fungsi khusus printNormalModeMessage() yang mencetak pesan “Access Control” di display.
Di loop utama, kita mulai dengan membaca nilai sensor proximity, yang memberi tahu kita apakah pintu tertutup atau tidak.
int proximitySensor = analogRead(A0);Bahasa kode: Arduino (arduino)
Jadi jika pintu tertutup, menggunakan baris yang sama seperti yang kami jelaskan di fungsi khusus getID(), kita akan memindai dan mendapatkan UID tag baru. Kita dapat memperhatikan di sini bahwa kode tidak akan melanjutkan lebih jauh sampai kita memindai tag karena baris “return” dalam pernyataan “if”.
Setelah kita memiliki tag yang dipindai, kita memeriksa apakah tag tersebut adalah master yang sebelumnya kami daftarkan, dan jika benar kita akan memasuki mode pemrograman. Dalam mode ini, jika kita memindai tag yang sudah diotorisasi, tag akan dihapus dari sistem, atau jika tag tidak dikenal, tag akan ditambahkan ke sistem sebagai diotorisasi.
// Checks whether the scanned tag is the master tag if (tagID == myTags[0]) { lcd.clear(); lcd.print("Program mode:"); lcd.setCursor(0, 1); lcd.print("Add/Remove Tag"); while (!successRead) { successRead = getID(); if ( successRead == true) { for (int i = 0; i < 100; i++) { if (tagID == myTags[i]) { myTags[i] = ""; lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Tag Removed!"); printNormalModeMessage(); return; } } myTags[tagsCount] = strdup(tagID.c_str()); lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Tag Added!"); printNormalModeMessage(); tagsCount++; return; } } }Bahasa kode: Arduino (arduino)
Di luar mode pemrograman, dengan loop “for” berikutnya kita memeriksa apakah tag yang dipindai sama dengan salah satu tag yang terdaftar dan kita membuka kunci pintu atau menahan akses ditolak. Pada akhirnya dalam pernyataan “else” kita menunggu hingga pintu tertutup, lalu kita mengunci pintu dan mencetak pesan mode normal lagi.
// Checks whether the scanned tag is authorized for (int i = 0; i < 100; i++) { if (tagID == myTags[i]) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Granted!"); myServo.write(170); // Unlocks the door printNormalModeMessage(); correctTag = true; } } if (correctTag == false) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Denied!"); printNormalModeMessage(); } } // If door is open... else { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Door Opened!"); while (!doorOpened) { proximitySensor = analogRead(A0); if (proximitySensor > 200) { doorOpened = true; } } doorOpened = false; delay(500); myServo.write(10); // Locks the door printNormalModeMessage(); }Bahasa kode: Arduino (arduino)
Itu lebih kurang semuanya dan berikut adalah kode lengkap proyeknya:
/* * Arduino Door Lock Access Control Project * * by Dejan Nedelkovski, www.HowToMechatronics.com * * Library: MFRC522, https://github.com/miguelbalboa/rfid */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal.h> #include <Servo.h> #define RST_PIN 9 #define SS_PIN 10 byte readCard[4]; char* myTags[100] = {}; int tagsCount = 0; String tagID = ""; boolean successRead = false; boolean correctTag = false; int proximitySensor; boolean doorOpened = false; // Create instances MFRC522 mfrc522(SS_PIN, RST_PIN); LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7) Servo myServo; // Servo motor void setup() { // Initiating SPI.begin(); // SPI bus mfrc522.PCD_Init(); // MFRC522 lcd.begin(16, 2); // LCD screen myServo.attach(8); // Servo motor myServo.write(10); // Initial lock position of the servo motor // Prints the initial message lcd.print("-No Master Tag!-"); lcd.setCursor(0, 1); lcd.print(" SCAN NOW"); // Waits until a master card is scanned while (!successRead) { successRead = getID(); if ( successRead == true) { myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array lcd.clear(); lcd.setCursor(0, 0); lcd.print("Master Tag Set!"); tagsCount++; } } successRead = false; printNormalModeMessage(); } void loop() { int proximitySensor = analogRead(A0); // If door is closed... if (proximitySensor > 200) { if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue return; } if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue return; } tagID = ""; // The MIFARE PICCs that we use have 4 byte UID for ( uint8_t i = 0; i < 4; i++) { // readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading correctTag = false; // Checks whether the scanned tag is the master tag if (tagID == myTags[0]) { lcd.clear(); lcd.print("Program mode:"); lcd.setCursor(0, 1); lcd.print("Add/Remove Tag"); while (!successRead) { successRead = getID(); if ( successRead == true) { for (int i = 0; i < 100; i++) { if (tagID == myTags[i]) { myTags[i] = ""; lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Tag Removed!"); printNormalModeMessage(); return; } } myTags[tagsCount] = strdup(tagID.c_str()); lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Tag Added!"); printNormalModeMessage(); tagsCount++; return; } } } successRead = false; // Checks whether the scanned tag is authorized for (int i = 0; i < 100; i++) { if (tagID == myTags[i]) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Granted!"); myServo.write(170); // Unlocks the door printNormalModeMessage(); correctTag = true; } } if (correctTag == false) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Denied!"); printNormalModeMessage(); } } // If door is open... else { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Door Opened!"); while (!doorOpened) { proximitySensor = analogRead(A0); if (proximitySensor > 200) { doorOpened = true; } } doorOpened = false; delay(500); myServo.write(10); // Locks the door printNormalModeMessage(); } } uint8_t getID() { // Getting ready for Reading PICCs if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue return 0; } if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue return 0; } tagID = ""; for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading return 1; } void printNormalModeMessage() { delay(1500); lcd.clear(); lcd.print("-Access Control-"); lcd.setCursor(0, 1); lcd.print(" Scan Your Tag!"); }Bahasa kode: Arduino (arduino)
Saya harap Anda menyukai tutorial ini dan silakan ajukan pertanyaan apa pun di bagian komentar di bawah ini.