อาร์เอฟไอดี (RFID - Radio frequency identification) เป็นเทคโนโลยีที่ใช้คลื่นวิทยุ (Radio frequency) ในการเก็บข้อมูล เพื่อใช้ระบุตัวตน เช่น นำไปแปะกับสิ่งของเพื่อใช้ระบุตัวสิ่งของ ใช้กับบัตรนักเรียนเพื่อระบุข้อมูลนักเรียน อุปกรณ์ที่ใช้ร่วมกัน คือ
เครื่องอ่าน / เขียน RFID (RFID Reader) เป็นเครื่องที่ใช้อ่านข้อมูล หรือเขียนข้อมูลลงบัตร RFID ซึ่งเครื่องที่ใช้อ่าน/เขียนนี้จะถูกแบ่งออกเป็นช่วงความถี่ที่รองรับ รวมถึงรวมถึงรองรับการอ่านเพียงอย่างเดียว หรือรองรับการเขียนด้วย
เครื่องอ่าน RFID แบบมาตรฐานที่ใช้งานกันทั่วไป (softpowergroup.net)
บัตร RFID หรือ แท็ก RFID (RFID Tag) - ภายในจะประกอบไปด้วย 2 ส่วน คือส่วนเก็บข้อมูล และส่วนเสาร์อากาศ ตัวแท็กนี้สามารถเก็บข้อมูลไว้ได้โดยไม่ต้องใช้พลังงาน เมื่อมีการส่งคลื่นวิทยุเข้ามาที่ตัวแท็ก ตัวแท็กก็จะส่งเป็นสัญญาณข้อมูลกลับไป แท็ก RFID จะถูกแบ่งออกเป็นช่วงความถี่ที่รองรับเช่นเดียวกับเครื่องอ่าน / เขียน และยังแบ่งได้ตามความจุของข้อมูลอีกด้วย
ส่วนประกอบของ RFID Tag (barcodesinc.com)
บัตร RFID ได้ถูกใช้งานกับอย่างแพร่หลายในปัจจุบัน เช่น ใช้ในบัตรนักศึกษาเพื่อระบุตัวตนของนักศึกษา ใช้เป็นบัตรเติมเงินในศูนย์อาหาร หรือใช้เป็นบัตรเข้าที่จอดรถ รวมถึงใช้เพื่อป้องกันการขโมยสินค้าในห้างสรรพสินค้าอีกด้วย
ตามที่ได้กล่าวไปข้างต้นว่า RFID สามารถนำมาใช้ประโยชน์ได้มาก ในระบบสมองกลฝังตัวจึงนิยมใช้งานต่างๆกันอย่างแพร่หลาย เช่น ทำระบบตอกบัตร หรือทำระบบปลดล็อกประตู เป็นต้น
ในบทความนี้ เราจะมาลองใช้งานโมดูลอ่าน RFID รุ่น MFRC522 ความถี่ 13.56MHz ที่ภายในชุดจะมีทั้งแท๊กรูปบัตร และแท๊กรูปกุญแจมาให้ด้วย ทำให้ง่ายต่อการทดลองในครั้งนี้
โมดูลอ่าน RFID รุ่น MFRC522 สามารถนำไปใช้งานกับบอร์ด Arduino ได้ง่าย มีคนเขียนไลบารี่ให้ใช้งานอยู่แล้ว โดยสามารถดาว์โหลดได้ที่ https://github.com/miguelbalboa/rfid เมื่อเข้าไปแล้วคลิกปุ่ม Download ZIP ทางด้านขวาได้เลย
เมื่อดาว์โหลดเสร็จแล้ว ให้แตกไฟล์ทั้งหมดไปไว้ที่ Documents\Arduino\libraries
เปิดโปรแกรม Arduino ขึ้นมา จากนั้นกดไปที่เมนู File > Examples เลื่อนหา MFRC522
กลับมาต่อวงจรใช้งานกันก่อน เมื่อแกะถุงออกมาแล้ว โมดูล MFRC-522 จะยังไม่ได้บัดกรีก้างปลามาให้ ต้องบัดกรีก้างปลาเพื่อให้สะดวกต่อการทำไปใช้งานก่อน (หากต้องการเสียบลงโพรโต้บอร์ดแนะนำให้ใช้ขาตรง หากต้องการนำไปยึดติดกับกล่อง หรือมาสายต่อ แนะนำให้ใช้ขางอ)
การต่อวงจร สามารถต่อตามรูปด้านล่างนี้ได้เลยครับ
*** ควรระวังเรื่องการต่อสายแรงดันเข้า 3.3V หากต่อเข้ากับ 5V อาจจะทำให้โมดูลพังเสียหายได้ ***
กรณีที่ไม่ถนัดดูตามรูปภาพ สามารถต่อตามตารางด้านล่างนี้ได้เลย
MFRC522 | Arduino |
3.3V | 3.3V |
RES | D9 |
GND | GND |
MISO | D12 |
MOSI | D11 |
SCK | D13 |
SDA (SS) | D10 |
กลับมาโปรแกรม Arduino ให้ก๊อบโค้ดด้านล่างนี้ไป แล้วอัพโหลดโค้ดเข้าบอร์ด Arduino (เซฟไฟล์ก่อนด้วย)
#include "SPI.h"
#include "MFRC522.h"
#define SS_PIN 10
#define RST_PIN 9
#define SP_PIN 8
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial())
return;
// Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// Serial.println(rfid.PICC_GetTypeName(piccType));
// Check is the PICC of Classic MIFARE type
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
String strID = "";
for (byte i = 0; i < 4; i++) {
strID +=
(rfid.uid.uidByte[i] < 0x10 ? "0" : "") +
String(rfid.uid.uidByte[i], HEX) +
(i!=3 ? ":" : "");
}
strID.toUpperCase();
// เมื่อถึงส่วนนี้ ตัวแปร strID จะเก็บค่า UID ของแท็กไว้แล้ว
// สามารถนำไปใช้งานได้เลย เช่น นำไปเข้า IF เพื่อให้หลอด
// LED ติดสว่าง หรือดับได้
Serial.print("Tap card key: ");
Serial.println(strID);
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
เมื่ออัพโหลดเสร็จแล้ว เปิด Serial Moniter ขึ้นมา ตั้ง Baud rate ไว้ที่ 9600 ลองนำแท็กทั้ง 2 อันมาแตะ จะให้ค่า UID ที่ต่างกันออกมา
ค่า UID นี้ (หรือ key) จะถูกเก็บไว้ในตัวแปร strID ซึ่งจะใช้งานได้หลังบรรทัดที่ 41 ลงมา ตัวอย่างโค้ดด้านล่างนี้เป็นการประยุกต์นำแท็ก RFID มาควบคุมกับติดดับของหลอด LED
#include "SPI.h"
#include "MFRC522.h"
#define SS_PIN 10
#define RST_PIN 9
#define LED_PIN A0
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial())
return;
// Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// Serial.println(rfid.PICC_GetTypeName(piccType));
// Check is the PICC of Classic MIFARE type
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
String strID = "";
for (byte i = 0; i < 4; i++) {
strID +=
(rfid.uid.uidByte[i] < 0x10 ? "0" : "") +
String(rfid.uid.uidByte[i], HEX) +
(i!=3 ? ":" : "");
}
strID.toUpperCase();
Serial.print("Tap card key: ");
Serial.println(strID);
// โค้ดส่วนควบคุมหลอด LED โดยเอาค่าจากตัวแปร strID มาเทียบ
if (strID.indexOf("E4:0A:BA:EB") >= 0) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
ผลที่ได้จะเป็นไปตามคลิปด้านล่างนี้ครับ
RFID มีประโยชน์และนำไปประยุกต์ใช้งานได้หลากหลายรูปแบบ แต่สิ่งที่ควรคำนึงถึงคือการสื่อสารกับผู้ใช้ที่ดี เช่น กรณีอ่านข้อมูลจากแท็กได้แล้ว ควรมีเสียงบอกเป็นสัญญาณ รวมถึงควรแจ้งผู้ใช้ได้ด้วยว่าแท็กที่นำมาใช้นั้น ผ่านการตรวจสอบหรือไม่ (เช่น หากนำแท็กที่ผ่านการรับรองมาติ๊ก ควรจะบอกได้ด้วยว่าแท๊กที่ถืออยู่ใช้ไม่ได้) รวมถึงควรยืดหยุ่นต่อการใช้งาน การเพิ่มหมายเลขแท็กควรทำได้ง่ายๆ โดยไม่ต้องอัพโหลดโปรแกรมเข้าไปแก้ใหม่ (ใช้ EEPROM ในการเก็บ และจัดการข้อมูลแท็ก)
-------------------------------------------------------------------------------------------
จบ - ขอบคุณที่ติดตามอ่านนะครับ ติดตามบทความใหม่ๆของทางร้าน IOXhop ได้ผ่านทาง Facebook fanpage ArtronShop หรืออ่านบทความเก่าๆได้ที่ลิ้ง https://www.artronshop.co.th/article?tskp ครับ พบกันใหม่ในบทความหน้านะครับ สวัสดีครับ