Cara Kerja RFID dan Cara Membuat Kunci Pintu RFID berbasis Arduino
Pada tutorial kali ini kita akan mempelajari apa itu RFID, cara kerjanya dan cara membuat kunci pintu RFID berbasis Arduino. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk lebih jelasnya.
Ringkasan
RFID adalah singkatan dari Radio Frequency IDentification dan ini adalah teknologi non-kontak yang digunakan secara luas di banyak industri untuk tugas-tugas seperti pelacakan personel, kontrol akses, manajemen rantai pasokan, pelacakan buku di perpustakaan, sistem gerbang tol, dan sebagainya.[/column]
Cara Kerja RFID
Sistem RFID terdiri dari dua komponen utama, transponder atau tag yang terletak pada objek yang ingin diidentifikasi, dan transceiver atau pembaca.
Pembaca RFID terdiri dari modul frekuensi radio, unit kontrol dan kumparan antena yang menghasilkan medan elektromagnetik frekuensi tinggi. Di sisi lain, tag biasanya merupakan komponen pasif, yang hanya terdiri dari antena dan microchip elektronik, sehingga ketika mendekati medan elektromagnetik transceiver, karena induksi, tegangan dihasilkan di kumparan antena dan ini tegangan berfungsi sebagai daya untuk microchip.
Sekarang ketika tag diaktifkan, ia dapat mengekstrak pesan yang dikirimkan dari pembaca, dan untuk mengirim pesan kembali ke pembaca, ia menggunakan teknik yang disebut manipulasi beban. Menghidupkan dan mematikan beban pada antena tag akan mempengaruhi konsumsi daya antena pembaca yang dapat diukur sebagai penurunan tegangan. Perubahan tegangan ini akan ditangkap sebagai satu dan nol dan begitulah cara data ditransfer dari tag ke pembaca.
Ada juga cara lain untuk mentransfer data antara pembaca dan tag, yang disebut kopling backscattered. Dalam hal ini, tag menggunakan sebagian dari daya yang diterima untuk membangkitkan medan elektromagnetik lain yang akan ditangkap oleh antena pembaca.
RFID dan Arduino
Jadi itulah prinsip kerja dasar dan sekarang mari kita lihat bagaimana kita dapat menggunakan RFID dengan Arduino dan membuat kunci pintu RFID kita sendiri. Kami akan menggunakan tag yang didasarkan pada protokol MIFARE dan pembaca RFID MFRC522, yang harganya hanya beberapa dolar.
Tag ini memiliki memori 1kb dan memiliki microchip yang dapat melakukan operasi aritmatika. Frekuensi operasi mereka adalah 13,56 MHz dan jarak operasi hingga 10 cm tergantung pada geometri antena. Jika kita membawa salah satu tag ini di depan sumber cahaya, kita dapat melihat antena dan microchip yang telah kita bicarakan sebelumnya.
Adapun modul pembaca RFID, menggunakan protokol SPI untuk komunikasi dengan papan Arduino dan inilah cara kita menghubungkannya. Harap dicatat bahwa kita harus menghubungkan VCC modul ke 3.3V dan untuk pin lain kita tidak perlu khawatir karena mereka toleran 5V.
Setelah menghubungkan modul, kita perlu mendownload library MFRC522 dari GitHub. Pustaka dilengkapi dengan beberapa contoh bagus yang dapat digunakan untuk mempelajari cara menggunakan modul.
Pertama kita bisa mengupload contoh “DumpInfo” dan menguji apakah sistem kita bekerja 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 monitor serial.
Di sini kita dapat melihat nomor UID tag serta memori 1 KB yang sebenarnya dibagi menjadi 16 sektor, masing-masing sektor menjadi 4 blok dan setiap blok dapat menyimpan 2 byte data. Untuk tutorial ini kita tidak akan menggunakan memori tag apapun, kita hanya akan menggunakan nomor UID dari tag.
Proyek Kontrol Akses Kunci Pintu RFID Arduino
Sebelum kita membahas kode proyek kunci pintu RFID, mari kita lihat komponen dan skema rangkaian proyek ini.
Selain modul RFID kami akan menggunakan sensor jarak untuk memeriksa apakah pintu tertutup atau terbuka, motor servo untuk mekanisme kunci dan tampilan karakter.
Anda bisa mendapatkan komponen yang diperlukan untuk Tutorial Arduino ini dari link di bawah ini:
Modul RFID MFRC522 …………………….
Motor Servo ……………………………………..
Layar LCD ………………………………………
Arduino Board ………………………………….
Breadboard dan Kabel Lompat ……………..
Sensor Kedekatan CNY70 ………………………
Proyek ini memiliki alur kerja berikut:Pertama kita harus menetapkan tag master dan kemudian sistem masuk ke mode normal. Jika kami memindai tag yang tidak dikenal, aksesnya akan ditolak, tetapi jika kami memindai master, kami akan memasuki mode program dari mana kami dapat menambahkan dan mengotorisasi tag yang tidak dikenal. Jadi sekarang jika kita memindai tag lagi, akses akan diberikan sehingga kita bisa membuka pintu.
Pintu akan otomatis mengunci setelah kita menutup pintu. Jika kita ingin menghapus tag dari sistem, kita hanya perlu masuk lagi ke mode program, pindai tag yang diketahui dan tag akan dihapus.
Kode Sumber
Sekarang mari kita lihat kodenya. Jadi pertama-tama kita perlu menyertakan perpustakaan untuk modul RFID, tampilan dan motor servo, menentukan beberapa variabel yang diperlukan untuk program di bawah ini serta membuat instance perpustakaan.
Di bagian setup, pertama-tama kita menginisialisasi modul, dan mengatur nilai awal motor servo ke posisi kunci. Kemudian kami mencetak pesan awal ke tampilan dan dengan loop "sementara" berikut kami menunggu sampai tag master dipindai. Fungsi khusus getID() mendapatkan tag UID dan kami menempatkannya di lokasi pertama larik 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();
}Code language: Arduino (arduino)
Mari kita lihat fungsi kustom getID(). Pertama ia memeriksa apakah ada tag baru yang ditempatkan di dekat pembaca dan jika demikian, kita akan melanjutkan ke loop "untuk" yang akan mendapatkan UID dari tag. Tag yang kita gunakan memiliki nomor UID 4 byte jadi itu 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 ke huruf besar dan akhirnya kami 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;
}Code language: Arduino (arduino)
Sebelum kita memasuki loop utama, di akhir bagian penyiapan, kita juga memanggil fungsi kustom printNormalModeMessage() yang mencetak pesan “Access Control” di layar.
Di loop utama, kita mulai dengan membaca nilai sensor jarak, yang memberi tahu kita apakah pintu tertutup atau tidak.
int proximitySensor = analogRead(A0);Code language: Arduino (arduino)
Jadi jika pintu ditutup, menggunakan baris yang sama seperti yang kami jelaskan dalam fungsi kustom getID() kami akan memindai dan mendapatkan UID dari tag baru. Kami dapat melihat di sini bahwa kode tidak akan melanjutkan lebih jauh sampai kami memindai tag karena baris "kembali" dalam pernyataan "jika".
Setelah tag dipindai, kami memeriksa apakah tag itu adalah master yang sebelumnya kami daftarkan, dan jika itu benar, kami akan memasuki mode program. Dalam mode ini, jika kami memindai tag yang sudah diotorisasi, tag akan dihapus dari sistem, atau jika tag tidak diketahui, tag akan ditambahkan ke sistem sebagai yang 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;
}
}
}Code language: Arduino (arduino)
Di luar mode program, dengan loop "untuk" berikutnya, kami memeriksa apakah tag yang dipindai sama dengan tag mana pun yang terdaftar dan kami membuka kunci pintu atau membiarkan akses ditolak. Di akhir pernyataan “else” kita menunggu sampai pintu tertutup, kemudian kita mengunci pintu dan mencetak kembali pesan mode normal.
// 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();
}Code language: Arduino (arduino)
Jadi itu saja semuanya dan inilah 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!");
}Code language: Arduino (arduino)
Saya harap Anda menikmati tutorial ini dan jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.