Penulis mendapat modul starter kit RFID innovative dari pembaca blog yg kebingungan setelah membeli nya. Modul ini dapat diperoleh dengan harga sekitar 350 ribu dengan packing yang sudah terdapat komunikasi serial UART atau Rs232 serta beberapa rangkaian tambahan sehingga dapat dikatakan siap pakai. Modul Utama RFID adalah ID-12 yang bekerja pada frekuensi 125Khz dan hanya berfungsi sebagai reader. Terdapat antenna internal sehingga tinggal menempatkan kartu RFID di atasnya. Unutk model yang bisa write/menulis ke kartu RFID maka dibutuhkan jenis yang lebih advance yaitu ID-20
Ternyata tidaklah sesusah yg dikira..bisa langsung dihubungkan menuju serial port atau usb to serial converter dan melalui software hyperterminal / putty (9600 bps) ketika kartu RFID dideketkan ke modul akan muncul kode ascii seperti contoh ini :
4D00D584B1AD
Dari datasheet didapatkan penjelasan byte yg dikirim ketika kartu didekatkan berupa :
1. STX (0x02) , start transmission
2. 10 DATA ASCII
3. 2 byte checksum (ascii)
4. <cr><lf> ETX , kalo hexanya 0x0D , 0x0A, 0x03
Ke 16 byte ini bisa dibaca langsung melalui serial port (tentunya ketika kartu yg sesuai ditempelkan dekan ID-12) akan tetapi checksumnya mubazir jika hanya kecepatan membaca kartu tidak tinggi, sehingga lebih baik hanya di compare semua byte ascii (10 + 2) jika ingin melakukan suatu proses pengecekan kartu.
Untuk rangkaian dari datasheet produk RFID Innovations, seperti berikut:
Perbedaan antara ID-0/ID-2 dan ID-12 hanya di antenna , dimana ID0/2 tidak memiliki antena internal seperti ID12. Tapi ID12 dapat juga dipasangkan antena external yg dapat digunakan bersamaan. Antenna dapat dibuat dengan lilitan kawat enamel diameter 0.5 mm yang dililit melingkar sekitar 100 putaran dengan diameter lingkaran 10cm (kira2 menghasilkan 640uh, gunakan google untuk mencari kalkulator lilitan), dan kemudian jangan lupa memasangkan tunning capacitor yang bernilai sekitar 1,5nF. Untuk koneksinya dapat dilihat pada gambar diatas.
Jika modul trainner dihubungkan dengan Microcontroller maka cukup gunakan mode UART TTL , dan hanya digunakan pin RX saja , karena tujuannya hanya membaca data serial yg diberikan oleh modul ketika membaca kartu.
jadi....kodenya kira2 begini , output ke LCD 16x2 (baca tutorial mengenai penulisan lcd disini):
#define F_CPU 4000000UL //sesuaikan dengan clock micro #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd.h" //silahkan baca pembahasan menulis LCD #define USART_BAUDRATE 9600 //baudrate #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) void init_usart(void) { UCSRB |= (1 << RXEN) | (1 << TXEN); UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); UCSRB |= (1 << RXCIE); //interupt serial usart sei(); //enable interupt } ISR(USART_RX_vect) //interupt ketika ada data yg diterima { char databyte; databyte = UDR; // isi data if(databyte == 2) { //deteksi STX (0x02h) lcd_gotoxy(0,1); } //tampilkan data kecuali data status ke LCD else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) {lcd_putc(databyte); } } int main(void) { //inisialisasi port I/O DDRC=0b1111111; //port LCD ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit //inisialisasi LCD lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts(" BACA RF ID"); init_usart(); while(1) { } return 0; }
Script diatas hanya berfungsi untuk mendapatkan pembacaan dari kartu RFID yang didekatkan ke modul. Untuk lebih ke aplikasi selanjutnya kita dapat memanfaatkan nomer kartu yang unique yang kemudian akan dipakai sebagai pembuka suatu slot kunci dari selenoid. Slot kuncinya seperti ini nih :
Jadi ntar salah satu pin dari microcontroller akan meng ON dan OFF selenoid sebagai proses Kunci dan Buka dari pintu. Ketika tombol kunci ditekan maka selenoid akan OFF sehingga ujung slot akan mengunci pintu. Ketika kartu yang kodenya sesuai dengan yang diijinkan membuka (atau memakai daftar database pun bisa) maka Micro akan meng ON kan selenoid sehingga slot akan tertarik oleh magnet selenoid dan pintu akan terbuka. Selenoid ini harus di drive oleh relay atau transistor agar tidak merusak microcontroller dan rata-rata tegangan selenoid tidak bisa di drive langsung oleh microcontroller. contohnya seperti gambar berikut:
Script komparasi dari kartu RFID seperti berikut ini :
/*============================= RF ID trainner modul IE version connected to IE MINSYS 8535 For DOOR LOCK via SELENOID by: ahocool@gmail.com www.aisi555.com =============================*/ #define F_CPU 4000000UL //sesuaikan clock xtal yg dipakai #include <string.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd.h" //untuk LCD #define USART_BAUDRATE 9600 //baudrate komunikasi serial #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) uint8_t dataindex,detik; char data[12]; char pass[12]="4D00D584B1AD" ; //sesuaikan dengan pembacaan kartu via PC & hyperterminal/putty , kartu yg digunakan yg dapat membuka pintu void init_usart(void) //inisialisasi usart { UCSRB |= (1 << RXEN) | (1 << TXEN); UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); UCSRB |= (1 << RXCIE); //interupt serial usart sei(); } void init_jam(void) //timer 8 detik tanpa aktivitas, LCD mati { TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode TIMSK |= (1 << OCIE1A); // Enable CTC interrupt OCR1A = 62499; //compare the CTC A TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64 TCNT1 = 0; PORTC |= (1<<PC7); //hidupkan LCD detik=0; } ISR(TIMER1_COMPA_vect) //interrupt detik { detik ++; if(detik == 2) { lcd_gotoxy(0,1); lcd_puts("Tempelkan Kartu!"); } if(detik >=8) { //8 detik layar lcd mati PORTC &= ~(1<<PC7); // lcd mati TCCR1B=0; } } ISR(USART_RX_vect) //interupt data serial dari RFID { char databyte; uint8_t a; databyte = UDR; if(databyte == 2) { //Start transmission dataindex=0; } //byte status di skip aja else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) { data[dataindex - 1]=databyte; //simpan ke memory hasil pembacaan } if(dataindex > 14 ) //jika sudah baca semua data { for(a=0 ;a<12 ; a++) { if(data[a] != pass[a]) break; //komparasi nilai pembacaan RFID } if( a == 12) { //jika kartu benar lcd_gotoxy(0,1); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" PINTU DIBUKA "); PORTA |=(1<<PA0); init_jam(); } else{ lcd_gotoxy(0,1); //jika kartu salah lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Kartu Salah ! "); init_jam(); } } dataindex++; } void tombol(void) //routine pembacaan tombol { if(bit_is_clear(PINA, PINA1)) { lcd_gotoxy(0,1); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" PINTU DIKUNCI "); PORTA &= ~(1<<PA0); init_jam(); } } int main(void) { //inisialisasi port I/O, sesuaikan dengan IC AVR yg dipakai DDRC=0b11111111; //port LCD dan PC7 terhubung ke VCC dari LCD (kalau tidak kuat di drive transistor) untuk mematikan layar jika melebihi waktu (biar hemat listrik) DDRA |= (1<<PA0); //output ke relay/transistor driver selenoid kunci & led status pintu DDRA &= ~(1<<PA1); //tombol kunci pintu ,tombol lepas= pull up 10k ke vcc, tombol ditekan = nyambung ke GND ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit //inisialisasi LCD init_jam(); lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts(" RFID DOOR LOCK\n"); lcd_puts("Tempelkan Kartu!"); init_usart(); while(1) { tombol(); } return 0; }
Hasilnya seperti ini nih...
Selamat Mencoba