บทความ RFID พร้อมตัวอย่างการต่อใช้งาน ตอนที่ 2 RFID 125 KHz

บทความ RFID พร้อมตัวอย่างการต่อใช้งาน
ตอนที่ 2 
มาตรฐาน ISO10536 หรือ RFID 125 KHz

โดยเนื้อหาหลักๆ จะประกอบด้วยเนื้อหาดังนี้

จากตารางในบทความตอนที่ 1 (คลิกดูตาราง) จะเห็นว่า RFID ที่ขายในเว็บไซต์ของเรามี 3 ประเภท คือ
1. มาตรฐาน ISO10536 หรือ RFID 125 KHz 
2. มาตรฐาน ISO15693 หรือ ICODE
3. มาตรฐาน ISO14443 Type A หรือ Mifare


        ในการเลือกใช้แต่ละมาตรฐานต้องคำนึงถึงว่าเครื่องอ่าน-เขียนรองรับมาตรฐานของการ์ดที่ใช้อยู่หรือไม่ เช่น เครื่องอ่าน-เขียนตามมาตรฐาน Mifare ไม่สามารถใช้ได้กับบัตร ICODE ถึงแม้ว่าจะใช้ย่านความถี่เดียวกัน คือ 13.56MHz แต่โปรโตคอลที่รับส่งข้อมูลแตกต่างกัน หากต้องการใช้ร่วมกันอาจเปลี่ยนไปใช้เครื่องอ่าน-เขียนที่รองรับหลายมาตรฐาน (Multi-Protocol) แทน เช่น Pi‐931‐X34CC จาก บจก. ซิลิคอน คราฟท์ เทคโนโลยี หรือ SL500F-USB Reader/Write จาก StrongLink Technology Co., Ltd.

01
Pi‐931-X34CC (รหัสสินค้า ERFI009)  

02
SL500F-USB Reader/Write (รหัสสินค้า ERFI014)

1. มาตรฐาน ISO 10536 หรือ RFID 125 KHz เหมาะกับการใช้งานที่เป็นการอ่านข้อมูลจากบัตรเพียงอย่างเดียว เช่น ระบบ Access Control ควบคุมการเข้า-ออก หรือระบบฉลากและคลัง สินค้า ยกตัวอย่างการใช้งานเบื้องต้นทั้งเครื่องอ่านและการ์ด ดังนี้

1.1 เครื่องอ่าน ID-12 (รหัสสินค้า ETEE003A)

03
คุณสมบัติID-12
เชื่อมต่อSerial (TTL)
ความถี่125KHz
มาตรฐานการ์ดEM4001 หรือเทียบเท่า
EncodingManchester 64-bit, module 64
ระยะอ่านไม่เกิน 5 cm
แรงดัน4.6 – 5.4 VDC
พลังงานที่ใช้5 VDC ที่ 30 mA เมื่อทำงานในโหมดปกติ

จากตารางคุณสมบัติของโมดูล ID-12 แสดงว่ารองรับเฉพาะบัตร RFID 125 KHz มาตรฐาน EM4001 หรือเทียบเท่า เชื่อมต่อผ่านพอร์ต Serial ระดับแรงดันที่ 0- 5 VDC (TTL) บนโมดูล ID-12 ผู้ใช้สามารถกำหนดให้ Buzzer ทำงานหรือไม่ทุกครั้งที่ทาบบัตร ดังภาพ 

04 1
05 1

เสียบ Jumper ทางขวาทำให้มีเสียง Buzzer เมื่อทาบบัตร       เสียบ Jumper ทางซ้ายเมื่อไม่ต้องการให้มีเสียง Buzzer

ขาต่างๆ บนโมดูล ID-12

06

จากตารางแสดงตำแหน่งขาของโมดูล ID-12 จะเห็นได้ว่าขาที่จำเป็นต่อการใช้งาน มี 4 ขา คือ TX  Rx  +5V  GND ขาที่เหลือเช่นขา RTS ใช้ในกรณีเมื่อเมื่อผู้ใช้กำหนดให้ใช้ Flow Control ไว้ รายละเอียดเพิ่มเติม สามารถดูได้จาก คู่มือ ID-12

23

1.2 การ์ด 125 KHz (รหัสสินค้า ERFC010)

08
คุณสมบัติการ์ด 125 KHz
ความถี่125KHz
มาตรฐานการ์ดTK4100
EncodingManchester
ID size40 bits
วัสดุPVC
อุณหภูมิ-20℃ ถึง +50℃
ขนาด85.6 × 54 × 0.86 (mm)

จากตารางคุณสมบัติของการ์ด ตัวการ์ดใช้มาตรฐาน TK4100 ซึ่งรองรับมาตรฐาน EM4001 ความถี่ 125 KHz ทำให้การ์ดนี้สามารถใช้กับเครื่องอ่าน ID-12 ได้

09

นอกจากบัตรในรูปแบบการ์ดแล้ว RFID มาตรฐาน 125 KHz ยังมีรูปแบบอื่นอีก เช่น กำไลข้อมือยาง (WristBand) เหรียญ (Coin Token) พวงกุญแจ (Key tag)

ทดลองการใช้งาน

         ให้โมดูล ID-12 อ่านรหัสบัตรมาแสดงผลบน PC แต่ ID-12 ไม่สามารถเชื่อมต่อกับ PC ได้โดยตรงต้องต่อวงจรเพิ่มแปลงระดับสัญญาณเป็น Serial (RS-232) เข้า PC ที่มีพอร์ต Serial RS-232 หรือใช้โมดูล ID-12 ต่อกับ USB to Serial (TTL) เข้ากับพอร์ต USB ของ PC ในการทดลองนี้ใช้วิธีหลัง ดังภาพ

10

เชื่อมต่อ USB toSerial (TTL) กับโมดูล ID-12 ถ้าดูที่ Device Manager จะเห็น USB to Serial เชื่อมต่ออยู่ พร้อมกับแสดงหมายเลขพอร์ต

11

ใช้โปรแกรม X-CTU หรือโปรแกรมติดต่อกับ Serial port เช่น Hyper terminal  PuTTY เป็นต้น กำหนดค่า Baud rate = 9600 bps, Data bits = 8, Parity = None, Stop bit = 1, Flow Control = None

12

จากนั้นคลิกไปที่แท็บ Terminal แล้วนำบัตรไปทาบกับเครื่องอ่านบัตร โมดูลจะส่งข้อมูลออกมาดังภาพ

โดยข้อมูลที่ออกมาจะตรงกับโปรโตคอลของโมดูลตาม คู่มือ ID-12 คือ เป็นข้อมูลขนาด 16 ไบต์ ประกอบด้วย

– STX (Start Transmitter) เริ่มต้นด้วย 0x02
– Data ข้อมูล ID ของบัตร ขนาด 10 ไบต์
– Checksum ที่คำนวนได้จากข้อมูล มีขนาด 2 ไบต์
– CR (Carriage Return) 1 ไบต์ คือ 0x0D
– LF (Line Feed) ขนาด 1 byte คือ 0x0A
– ETX (End Transmitter) จบด้วย 0x03

14
15
16

ทดลองเชื่อมต่อ ID-12 กับ Arduino

17

นำบอร์ด Arduino ต่อกับโมดูล ID-12 ผ่านขา Serial (TTL) จ่ายไฟ +5V และต่อขากราวด์ (GND) โปรแกรมบน Arduino จะวนอ่านค่าจาก ID-12 ผ่าน Software Serial ถ้าค่า ID จากบัตรที่ ID-12 ส่งมาตรงกับค่า ID ที่ Arduino เก็บอยู่ จะส่งข้อความผ่าน Serial Monitor

18

ตัวอย่างโค้ดโปรแกรม

// RFID ID-12 Test Program //

#include <SoftwareSerial.h>
SoftwareSerial rfidSerial(3,2); //(RX, TX)
//Register your RFID tags here
char tag1[13] = “540062AEF66E”;
char tag2[13] = “4900C96EF719”;
char tag3[13] = “4900C970DC2C”;
char tagString[13];
int index = 0;
boolean reading = false;
void setup(){
Serial.begin(9600);
rfidSerial.begin(9600);
}
void loop() {
while(rfidSerial.available()){
int readByte = rfidSerial.read(); //read next available byte
//Serial.println(readByte,HEX); //Debug 
delay(1);
if((reading == true)&&(readByte != 3)&&(readByte != 10)&&(readByte != 13)){
//store the tag
tagString[index] = readByte;
index ++;
}
if((readByte == 2) && (reading == false)) reading = true; //begin of tag
if((readByte == 3) && (reading == true)) reading = false; //end of tag
}
if(reading == false){
checkTag(tagString); //Check if it is a match
clearTag(tagString); //Clear the char of all value
index = 0;
}
}
void checkTag(char tag[]){
if(strlen(tag) == 0) return; //empty, no need to continue
if(compareTag(tag, tag1)){ // if matched tag1, do this
Serial.print(“Tag 1 In : “);
Serial.println(tag); 
}
else if(compareTag(tag, tag2)){ //if matched tag2, do this
Serial.print(“Tag 2 In : “);
Serial.println(tag);
}
else if(compareTag(tag, tag3)){
Serial.print(“Tag 3 In : “);
Serial.println(tag);
}
else {
Serial.print(“Unknow Tag : “); 
Serial.println(tag); //read out any unknown tag
}
} //End checkTag()
void clearTag(char one[]){ //clear the char array by filling with null – ASCII 0
//Will think same tag has been read otherwise
for(int n = 0; n < strlen(one); n++){
one[n] = 0;
}
}
boolean compareTag(char one[], char two[]) {
//compare two value to see if same, strcmp not working 100% so we do this
if(strlen(one) == 0) return false; //empty
for(int n = 0; n < 12; n++){
if(one[n] != two[n]) return false;
}
return true; //no mismatches
}

จากโค้ดโปรแกรมทำงานดังนี้

// RFID ID-12 Test Program //

#include <SoftwareSerial.h>
SoftwareSerial rfidSerial(3,2); //(RX, TX)
//Register your RFID tags here
char tag1[13] = “540062AEF66E”;
char tag2[13] = “4900C96EF719”;
char tag3[13] = “4900C970DC2C”;
char tagString[13];
int index = 0;
boolean reading = false;

Arduino ใช้ Software Serial ติดต่อกับ ID-12 กำหนด Object ชื่อ rfidSerial ให้ขา 3 เป็น Rx และขา 2 เป็น Tx จากนั้นประกาศตัวแปร char array เป็น ID ของบัตรที่เราต้องเปรียบเทียบขนาด 12 บิต (Data 10 บิต และ Check Sum 2 บิต) ประกาศตัวแปร tagString ไว้ข้อมูลที่รับจาก ID-12

void setup(){

Serial.begin(9600);
rfidSerial.begin(9600);
}

ฟังก์ชั่น setup() ใช้กำหนดค่า โดย Hardware Serial ขา 0 และ 1 กำหนด Baud Rate เป็น 9600  ส่วน Software Serial กำหนด Baud Rate เป็น 9600 เช่นกัน

void loop() {
while(rfidSerial.available()){
int readByte = rfidSerial.read(); //read next available byte
//Serial.println(readByte,HEX); //Debug 
delay(1);
if((reading == true)&&(readByte != 3)&&(readByte != 10)&&(readByte != 13)){
//store the tag
tagString[index] = readByte;
index ++;
}
if((readByte == 2) && (reading == false)) reading = true; //begin of tag
if((readByte == 3) && (reading == true)) reading = false; //end of tag
}
if(reading == false){
checkTag(tagString); //Check if it is a match
clearTag(tagString); //Clear the char of all value
index = 0;
}
}

ในส่วนฟังชั่น loop() ให้โปรแกรมวนตรวจสอบ มีข้อมูลส่งมาจาก ID-12 หรือไม่ ถ้ามีให้ rfidSerial อ่านค่าและนำไปเก็บไว้ในตัวแปร readByte ในกรณีข้อมูล

มีค่าเท่ากับ 2 กำหนดตัวแปร reading เป็น true คือกำหนด state ให้โปรแกรมเริ่มเก็บข้อมูลไว้ในตัวแปร tagString 
มีค่าเท่ากับ 3 กำหนดตัวแปร reading เป็น false คือกำหนด state ให้โปรแกรมหยุดเก็บข้อมูลเข้าตัวแปร tagString
ถ้าตัวแปร reading เป็น true คือให้เริ่มเก็บข้อมูล และข้อมูลต้องไม่ใช่ 13 (0xD,CR) และ 10 (0xA,LA) โปรแกรมเก็บข้อมูลไว้ที่ตัวแปร tagString โดยเลื่อนเก็บข้อมูลไปทีละหนึ่งจากการชี้ของตัวแปร index 
ถ้าตัวแปร reading เป็น false คือ ข้อมูลได้ส่งครบแล้ว โปรแกรมจะนำข้อมูลในตัวแปร tagString ไปตรวจสอบว่าตรงกับตัวแปร tag1 tag2 หรือ tag3 หรือไม่ ผ่านการเรียกใช้ฟังชั่น checkTag จากนั้นโปรแกรมจะลบข้อมูลที่อยู่ใน tagString กำหนดตัวแปร index เป็น 0 เพื่อเตรียมที่จะรับข้อมูลชุดใหม่จาก ID-12

void checkTag(char tag[]){

if(strlen(tag) == 0) return; //empty, no need to continue
if(compareTag(tag, tag1)){ // if matched tag1, do this
Serial.print(“Tag 1 In : “);
Serial.println(tag); 
}
else if(compareTag(tag, tag2)){ //if matched tag2, do this
Serial.print(“Tag 2 In : “);
Serial.println(tag);
}
else if(compareTag(tag, tag3)){
Serial.print(“Tag 3 In : “);
Serial.println(tag);
}
else {
Serial.print(“Unknown Tag : “); 
Serial.println(tag); //read out any unknown tag
}
} //End checkTag()

ในส่วนของฟังก์ชั่น checkTag ทำหน้าที่เปรียบเทียบข้อมูลของการ์ดที่ส่งมากับข้อมูลของการ์ดที่ประกาศไว้ว่าตรงกันหรือไม่ ถ้าตรงให้ส่งข้อความผ่าน Serial ตามที่กำหนดแต่ละกรณี โดยเริ่มแรกจะตรวจสอบข้อมูลที่เข้ามาก่อนว่า ตัวแปรที่เข้ามามีข้อมูลอยู่หรือไม่หรือว่างอยู่ ถ้ามีข้อมูลอยู่ให้นำไปเปรียบเทียบโดยใช้ฟังชั่น compare() ถ้าตรงกับข้อมูลที่กำหนดให้ส่งข้อความของ tag นั้นออกมา แต่ถ้าไม่ตรงกับข้อมูลที่กำหนดไว้ให้ส่งข้อความ “Unknown Tag :”

void clearTag(char one[]){ //clear the char array by filling with null – ASCII 0

//Will think same tag has been read otherwise
for(int n = 0; n < strlen(one); n++){
one[n] = 0;
}
}

ฟังก์ชั่น clearTag มีหน้าที่กำหนดให้ตัวแปร Array ที่กำหนด มีค่าเท่ากับ 0

boolean compareTag(char one[], char two[]) {

//compare two value to see if same, strcmp not working 100% so we do this
if(strlen(one) == 0) return false; //empty
for(int n = 0; n < 12; n++){
if(one[n] != two[n]) return false;
}
return true; //no mismatches
}

ฟังก์ชั่น compare มีหน้าที่เปรียบเทียบข้อมูล Array สองชุด

ถ้าโปรแกรมตรวจสอบได้ว่าข้อมูลที่นำมาตรวจสอบ (ตัวแปร one) ไม่มีข้อมูลอยู่ให้ return เป็น false คือไม่เหมือนกัน
ถ้าข้อมูลทั้งหมดเหมือนกันจะ return เป็น true แต่ถ้าโปรแกรมวนตรวจสอบทั้งหมด พบว่าข้อมูลไม่เหมือนกันเพียงชุดเดียว โปรแกรม return เป็น false

1.3 RFID 125 KHz Reader Evaluation Module (รหัสสินค้า ERFI012)

19
คุณสมบัติRFID 125 KHz Reader
เชื่อมต่อUSB HID Keyboard
ความถี่125KHz
มาตรฐานการ์ดEM4001 หรือเทียบเท่า
แรงดัน4.6 – 5.4 VDC
พลังงานที่ใช้5 VDC ที่ 45 mA เมื่อทำงานในโหมดปกติ
อื่นๆLED แสดงเมื่อบัตรทาบ, Buzzer

จากคุณสมบัติของเครื่องอ่าน RFID เชื่อมต่อผ่านพอร์ต USB  โดยเมื่อเสียบเข้ากับเครื่อง PC แล้วเครื่องจะมองเห็นเครื่องอ่านเป็น USB HID Keyboard (VID= 1234, PID= E000) ดังภาพ โดยเครื่องอ่านใช้ไฟเลี้ยง +5V จากสาย USB ไม่ต้องจ่ายไฟแยก

20

เมื่อเชื่อมต่อเครื่องอ่านเข้ากับ PC และเปิดโปรแกรม Note Pad Text Editor นำบัตรไปทาบบนเครื่องอ่าน เครื่องอ่านจะพิมพ์ข้อความ ID ของการ์ด 10 ตัวอักษรตามด้วย CR (Carriage Return) และ LF (Line Feed) บนโปรแกรมดังภาพ

22