Selamat datang di sonoku.com

Membaca Kartu RFID Mifare 13.56MHz dengan CR-013F, ATMega128 dan Bascom (bag.2)

Setelah mengetahui bagaimana reader RFID dan Mikrokontroler berkomunikasi pada artikel sebelumnya, selanjutnya adalah membuat program mengakses RFID reader menggunakan BASCOM. Rutin yang dibuat pertama kali adalah rutin untuk mengirim perintah (request) dari mikro ke reader mengikuti protokol pada Gambar 1 berikut.

Gambar 1. Protokol Request Function

Pertama deklarasikan sebuah variabel  berupa array dengan tipe data byte yang isinya adalah kode hex “Function” sesuai Tabel Daftar Fungsi Perintah. Misal kita akan mengirim fungsi untuk Card Type Request maka deklarasi variabelnya seperti berikut:

Dim Reqcardtype(5) As Byte
Reqcardtype(1) = &H00 'ID node-broadcast ke seluruh reader - low byte
Reqcardtype(2) = &H00 'ID node-broadcast ke seluruh reader - high byte
Reqcardtype(3) = &H01              'fungsi Card Type Request - lowbyte
Reqcardtype(4) = &H02              'fungsi Card Type Request - highbyte
Reqcardtype(5) = &H52              'request semua jenis kartu

Berikutnya membuat sub procedure untuk mengirimkan perintah ke reader. Dua byte pertama yang dikirim merupakan sebuah konstanta &HAA dan &HBB, kemudian diikuti panjang data dimulai dari low byte dan high byte. Perintah Shift digunakan untuk menggeser bilangan hexa variabel Panjang karena yang dikirim dahulu adalah lowbyte baru highbyte. Kemudian mengirim beberapa kode Fungsi Perintah yang tersimpan dalam variabel X satu persatu. Selama mengirim ke reader, program juga menghitung checksum yaitu dengan menerapkan operator XOR pada tiap data yang dikirim. Terakhir mikro mengirim adalah Checksum. Potongan programnya sebagai berikut:

Sub Kirim_mifare(byval Panjang As Byte , X As Byte)
Dim K As Byte
Csum = 0
Print #1 , Chr(&Haa);        'kirim header
Print #1 , Chr(&Hbb);

Print #1 , Chr(panjang);     'kirim panjang data
K = Panjang
Shift K , Right , 8
Print #1 , Chr(k);

Panjang = Panjang - 1
For I = 1 To Panjang
Print #1 , Chr(x(i)); 'kirim data
Csum = Csum Xor X(i) 'hitung checksum
Next
Print #1 , Chr(csum);
End Sub

Rutin (sub procedure) yang kedua adalah kode program untuk mengambil respon yang dikirimkan oleh reader kepada mikro ketika suatu perintah dikirim ke reader. Protokol respon reader mengikuti format seperti pada Gambar 2 berikut.

Gambar 2. Protokol Respon Reader

Program diawali dengan mengambil 2 byte Header yang terdiri dari &HAA dan &HBB. Pertama harus dicek apakah data serial yang diterima berupa &HAA, jika ya, cek kembali byte kedua apakah &HBB. Jika kedua syarat terpenuhi, langkah selanjutnya mengambil 2 byte berupa Panjang data. Panjang data yang diperoleh digunakan untuk variabel counting pengambilan data Status dan Data, pada contoh ini Status dan Data disimpan pada variabel Data_response(). Bentuk potongan programnya seperti berikut:

Sub Get_card_data
Dim J As Byte , Long_h As Byte , Long_l As Byte , Long_data As Byte
Dim Offset As Byte , Count As Byte
Dim R As Byte
Dim Countpilih As Integer

Ser_dat = Waitkey(#1)
If Ser_dat = Chr(&Haa) Then 'cek header
Ser_dat = Waitkey(#1)
If Ser_dat = Chr(&Hbb) Then 'cek header
Long_h = Waitkey(#1) 'ambil panjang data
Long_l = Waitkey(#1)
Shift Long_l , Left , 8
Long_data = Long_h Or Long_l

For J = 1 To Long_data
Data_response(j) = Waitkey(#1) 'ambil status dan data
Next
End If
End If
End Sub

Setelah kedua sub procedure diatas dibuat, kemudian bisa digunakan untuk membaca kartu RFID. Tetapi ingat pada langkah ke-3 dari rangkaian proses pembacaan kartu, yaitu proses Select Card diperlukan data nomor seri kartu yang sedang dibaca. Seperti yang kita ketahui, tiap kartu memiliki nomor seri yang berbeda,  untuk itu pada bagian Data yang dikirim berasal dari data yang diperoleh saat pembacaan kartu. Data ini tersimpan pada variabel Data_response() setelah proses permintaan nomor seri kartu (langkah 2). Oleh karena itu perlu ada modifikasi pada bagian prosedur Kirim_mifare(). Modifikasinya adalah menambahkan variabel tipe pengiriman (Type). Lebih lanjut bisa dilihat pada program berikut:

Sub Kirim_mifare(byval Panjang As Byte , X As Byte , Byval Type = Byte )
Dim K As Byte ,
Csum = 0

If Type = 0 Then
Print #1 , Chr(&Haa);                                  'kirim header
Print #1 , Chr(&Hbb);
Print #1 , Chr(panjang);                               'kirim panjang data
K = Panjang
Shift K , Right , 8
Print #1 , Chr(k);
Panjang = Panjang - 1
For I = 1 To Panjang                                   'kirim data
Print #1 , Chr(x(i));
Csum = Csum Xor X(i)                               'hitung checksum
Next
Print #1 , Chr(csum);
End If

'untuk mengirim perintah Select Card
If Type = 1 Then
Print #1 , Chr(&Haa);                                  'kirim header
Print #1 , Chr(&Hbb);
Print #1 , Chr(panjang);                               'kirim panjang data
K = Panjang
Shift K , Right , 8
Print #1 , Chr(k);
For I = 1 To 4                                         'kirim data
Print #1 , Chr(x(i));
Csum = Csum Xor X(i)                               'hitung checksum
Next
For I = 6 To Panjang
Print #1 , Chr(data_response(i));
Csum = Csum Xor Data_response(i)
Next
Print #1 , Chr(csum);
End If
End Sub

Selanjutnya, prosedur-prosedur diatas digunakan untuk membaca isi kartu. Isi kartu tersimpan pada variabel data_response() indeks 6 hingga 21. Dengan mengikuti langkah-langkah proses pembacaan pada artikel sebelumnya, dapat disusun kode program untuk membaca kartu mifare. Contoh potongan kode sederhananya seperti berikut:

Dim kata as string * 16
Do
Call Clear_data_respon
Call Kirim_mifare(&H06 , Reqcardtype(1) , &H00) 'minta tipe kartu
Call Get_card_data
Call Kirim_mifare(&H06 , Reqserialnumber(1) , &H00) ' minta nomor seri
Call Get_card_data 'dapatkan nomor seri simpan di data_response()
Call Kirim_mifare(&H09 , Reqpilihkartu(1) , &H01) 'pilih kartu
Call Get_card_data
Call Kirim_mifare(&H0d , Reqauthcard(1) , &H00) 'authentifikasi kartu
Call Get_card_data
Call Kirim_mifare(&H06 , Reqcardnumber(1) , &H00) 'ambil isi data kartu
Call Get_card_data

'tampilkan isi kartu ke LCD
For I = 6 To 13
kata = kata + data_response(i)
Next
Lcd kata
kata=""

For I = 14 To 21
kata = kata + data_response(i)
Next
lowerline
Lcd kata
Wait 1
Loop

Berikut foto hasil percobaan, isi data block kartu ditampilkan pada LCD. Pada gambar tidak terlihat antenna, karena diletakkan pada bagian bawah PCB. Selamat mencoba!

'broadcast ke seluruh reader

Leave a Reply