Perangkat pintu akses (access door controller)
adalah perangkat yang digunakan pada sistem kunci pintu. Saat ini, perangkat
itu banyak dipasarkan dari yang mahal dan canggih sampai yang murah meriah. Aku
pernah memasang beberapa jenis dari yang mahal sampai yang murah. Bahkan harga
di pasaran untuk perangkat yang paling murah hanya berharga berkisar 300 ribuan
saja. Memang harga itu baru panelnya saja dan belum perangkat pendukung lainnya
seperti power supply, electric door, tombol keluar dan kartu RFID serta
instalasi kabel.
Karena postingan ini berjudul pintu akses
sederhana, maka sebagai perbandingannya adalah perangkat akses berharga murah
yang ada di pasaran. Tapi jangan kuatir, setelah diinstalasi maka penampilan
alat kita tidak akan kalah keren dengan bahkan yang mahal sekalipun.
Sebagai perbandingan adalah panel akses berharga
murah. Panel yang di pasarkan tersebut sudah lengkap di dalamnya termasuk pembaca
kartu RFID. Panel yang ada di pasaran itu, umumnya bekerja secara mandiri
(stand-alone) maksudnya sistem perangkat tidak memiliki fitur komunikasi yang
dapat dihubungkan dengan PC untuk membentuk jaringan seperti layaknya perangkat
yang mahal dan canggih.
Nah, di sini aku mau membuat panel akses dengan
harga lebih murah dari pada panel termurah yang ada di pasaran tapi memiliki
kelebihan bisa berkomunikasi dengan perangkat PC. Untuk identifikasinya aku
pergunakan pembaca kartu RFID yang ada di pasaran dan berharga murah meriah.
Sebagai perkiraan perbandingan harga, jika sobat mau coba maka modal yang
dibutuhkan bisa menghemat sampai paling tidak 200 ribuan. Lumayan kan.
Konsepnya sederhana saja. Panel yang akan dibuat
berbasis mikrokontroler dari Atmel yaitu AT89C2051. Kemudian untuk menyimpan
data kartu menggunakan AT93C46/56/66 yang berkapasitas 128/256/512 byte,
sedikit memang, tapi kebutuhan kita memang hanya untuk diimplementasikan pada
perumahan dan kantor kecil dengan jumlah pengguna (user) tak lebih dari
maksimal 42/85/170 kartu. Tapi jangan kuatir jika menginginkan jumlah yang
banyak sobat bisa mengganti dengan memori yang lebih besar lagi seperti
AT24C512 yang bisa diisi sampai 10 ribuan kartu ditambah record transaksinya.
Tapi panel jadi enggak sederhana lagi terutama dalam programnya. Apalagi kalau
ditambah menggunakan RTC (real time clock) untuk menunjukkan waktu dan fitur
time zone atau apalah seperti panel akses yang canggih.
Tapi sobat enggak usah kuatir, aku pernah buat yang
menggunakan AT24C512 dan nanti aku akan sampaikan deh. Sekarang kita bahas yang
sederhana dulu ya....
Aku coba membuat panel ini dan sobat percaya nggak
kalau harga komponennya nggak lebih dari 50 ribu? Tentu diluar harga pembaca
kartunya (card reader) dimana aku menggunakan RFID 125kHz yang murah meriah.
Rangkaian lengkapnya seperti berikut:
Dari rangkaian di atas bisa sobat perhatikan dengan seksama. Untuk masukan dan keluaran aku klasifikasikan sesuai jenisnya dan menggunakan konektor yang terpisah. Dengan rincian sebagai berikut:
CN201 diberi nama READER adalah konektor yang digunakan untuk antarmuka dengan pembaca kartu. Konektor ini sudah dilengkapi dengan power suplai 12 volt dan masukan D0 dan D1.
CN202, DOOR IN adalah konektor untuk masukan yang berhubungan dengan pintu. DS adalah Door Sensor yang berfungsi mendeteksi kondisi buka tutup pintu dan bisa menggunakan sensor berbentuk magnetic contact. Jika tidak digunakan maka masukan DS bisa dihubung singkat dengan GND. DE adalah Door Exit yang dihubungan dengan tombol tekan atau push button yang berfungsi untuk membuka pintu dari dalam.
CN203, SW OUT adalah konektor keluaran dari kontak relay yang dihubungkan dengan electric lock atau kunci elektrik. Koneksinya tergantung dari jenis kunci yang digunakan bisa jenis fail safe dihubungkan ke NC atau fail secure dihubungkan ke NO. Instalasinya bisa dilihat pada gambar berikut:
CN204, SERIAL adalah konektor untuk
antarmuka dengan RS-232 dan dapat dihubungkan langsung dengan gerbang COM pada
PC. Agar dapat berkomunikasi dengan PC maka diperlukan aplikasi yang harus
dijalankan pada PC. Untuk komunikasi dengan PC maka pada postingan kali ini
belum akan aku bahas. Pembahasan akan dilakukan pada postingan yang akan
datang. Jadi rangkaian yang berkaitan dengan P3.0/RXD dan P3.1/TXD di atas
untuk sementara diabaikan dulu. Karena pembahasan termasuk program yang harus
dijalankan pada PC yang dibuat dengan Visual Basic.
Sabar yaaa....
CN205, POWER adalah konektor yang
dihubungkan dengan power suplai dengan sumber tegangan sebesar 12 volt.
JP201, PRG/RUN adalah pemintas atau
jumper yang digunakan untuk menentukan status program dari panel kita.
Menghubung-singkatkan JP201 ke GND akan memerintahkan mikrokontroler
untuk menjalankan menu pemrograman kartu. Sementara agar sistem kita berjalan
sebagai pintu akses maka dibiarkan terbuka.
S201, UNIT ID adalah saklar dip yang
berfungsi menetapkan nomor dari unit atau perangkat yang dibutuhkan nantinya
sebagai penomoran perangkat dalam sebuah jaringan. Dari jumlah bit S201 maka
jumlah maksimal perangkat dalam sebuah jaringan adalah 16 unit dimulai dari 00H
sampai dengan 0FH. Jadi sama dengan SERIAL nanti.
Untuk menyimpan banyaknya data kartu yang digunakan
kita menggunakan EEPROM AT93C46 yang memiliki kapasitas 1k bit atau 128 byte.
Panjang data dari format Wiegand 26 bit adalah 3 byte ditambah 1 byte untuk
status maka maksimal data kartu yang dapat disimpan adalah 32 kartu. Pada
postingan kali ini, aku akan menggunakan seluruh kapasitas EEPROM hanya untuk
menyimpan data kartu dengan panjang data 3 byte.
Selanjutnya, supaya alat bisa berfungsi, isi dengan
program berikut:
$mod51
PinProgram bit p1.4
DIO bit p1.5
CLK bit p1.6
RST bit p1.7
DoorSensor bit p3.2
DoorExit bit p3.3
WiegandData0 bit p3.4
WiegandData1 bit p3.5
DoorRelay bit p3.7
DataHeksa data 08h
Bendera data 20h
Fail bit Bendera.0
Pertama sobat paling tidak harus menetapkan
parameter seperti di atas yang akan digunakan dalam listing program nantinya untuk
mempermudah dalam penulisannya. Parameter harus sesuai dengan gambar rangkaian
yang dibuat.
org 0h
acall ResetChip
jnb PinProgram, DefaultUnit
ajmp AppMulai
DefaultUnit:
mov r5, #20
Default2:
mov r6, #200
Default2:
mov r7, #250
clr DoorRelay
TungguPinProgram:
jb PinProgram, AppMulai
djnz r7, TungguPinProgram
djnz r6, Default2
djnz r5, Default1
clr DoorRelay
jnb PinProgram, $
acall AT93C46_EWEN
acall AT93C46_ERAL
acall AT93C46_EWDS
acall Pulsa1Detik
setb DoorRelay
Pada awal
program alamat 0000H dimulai dengan me-reset EEPROM AT93C46 agar pin RST
menjadi rendah. Kemudian program akan memeriksa status PinProgram untuk tujuan
default unit atau reset pabrik (factory reset) jika bit tersebut rendah.
Sebelum
memastikan pelaksanaan reset unit, sebelumnya program akan menjalankan perintah
tunggu menggunakan register R5, R6 dan R7 yang dioperasikan sebagai pecacah
mundur menggunakan perintah DJNZ. Dari nilai yang diisikan pada
register-register tersebut dapat dihitung perkiraan waktu tuda selama 4 detik
sambil memeriksa apakah status PinProgram dalam keadaan rendah atau tidak. Jika
PinProgram tinggi sebelum pencacah selesai maka reset unit dibatalkan.
Jika pencacah
mundur selesai dan PinProgram masih rendah, maka program akan mengaktifkan
relay dengan perintah CLR dan menunggu sampai PinProgram menjadi tinggi sebelum
melaksanakan penghapusan isi memori AT93C46 dengan instruksi ERAL (erase all).
Setelah selesai, program kembali menon-aktifkan relay setelah 1 detik.
AppMulai:
jnb PinProgram, SubProgram
jb DoorSensor, AppMulai
jnb DoorExit, AppBukaPintu
jnb WiegandData0, AppBacaKartu
jnb WiegandData1, AppBacaKartu
ajmp AppMulai
Selanjutnya
aplikasi akses pintu dimulai dari AppMulai. Pertama adalah memeriksa status
PinProgram, jika rendah akan menuju alamat SubProgram. Kedua memeriksa status
DoorSensor, jika tinggi akan kembali ke AppMulai. Ketiga memeriksa status
DoorExit, jika rendah akan menuju ke AppBukaPintu. Terakhir adalah memerika
WiegandData 0 dan 1, jika salah satu rendah akan menuju AppBacaKartu.
SubProgram:
clr DoorRelay
AppProgram:
jb PinProgram, AppMulai
jnb WiegandData0, ProgramKartu
jnb WiegandData1, ProgramKartu
ajmp AppProgram
Alamat SubProgram diawali dengan mengaktifkan relay
kemudian menjalankan rutin AppProgram.
Pada AppProgram berisi perintah memeriksa status PinProgram,
tinggi tinggi maka akan kembali ke AppMulai. Kemudian diteruskan dengan
memeriksa masukan Wiegand. Jika salah satu dari bit data Wiegand rendah maka
selanjutnya adalah menjalankan rutin ProgramKartu.
ProgramKartu:
mov r1, #DataHeksa
acall Wiegand
acall CekWiegand
jnz PrgMemori
ajmp AppProgram
Pada rutin
ProgramKartu, register R1 diisi dengan alamat buffer DataHeksa untuk kemudian
memanggil subrutin membaca kartu RFID. Setelah pembacaan selesai sobat perlu
memeriksa isi dari buffer, jika tidak kosong maka dapat dilanjutkan ke
PrgMemori jika ternyata kosong dan berarti ada kesalahan maka kembali ke
AppProgram.
Berikut adalah
rutin PrgMemori
yang berfungsi mengisi data kartu ke memori AT93C46.
PrgMemori:
mov dph, #0
mov dpl, #0
mov r7, #32
PrgIsiMemori:
acall AT93C46_READ
mov r6, #3
cpl a
jnz PrgIsiMemoriBerikut
setb DoorRelay
mov r0, #DataHeksa
acall AT93C46_EWEN
mov a, #9
PrgSimpanKartu:
acall AT93C46_WRITE
mov a, @r0
inc dptr
inc r0
djnz r6, PrgSimpanKartu
acall AT93C46_EWDS
acall Pulsa1Detik
ajmp SubProgram
PrgIsiMemoriBerikut:
inc dptr
djnz r6, PrgIsiMemoriBerikut
inc dptr
djnz r7, PrgIsiMemori
ajmp AppProgram
Pertama-tama rutin menetapkan alamat memori dengan
register DPTR dengan 0000H atau alamat awal dari memori. Kemudian seperti sudah
dijelaskan di bagian atas postingan ini maka register R7 diisi dengan nilai
maksimum dari jumlah kartu yang memungkinkan yaitu 32 kartu.
Rutin PrgIsiMemori, pertama-tama membaca isi
AT93C46 sesuai dengan alamat pada register DPTR dengan memanggil sub rutin
AT93C46_READ. Disini aku menyisipkan perintah mengisi register R6. Akumulator
sekarang berisi data sesuai alamat DPTR dan kemudian dikomplemen dengan
perintah CPL, jika akumulator tidak kosong atau isi pada memori adalah FFH maka
program akan melompat ke PrgIsiMemoriBerikut untuk menuju alamat memori
berikutnya.
Jika memori masih kosong maka data Wiegand dapat
disimpan. Untuk memberi indikator maka aku menggunakan perintah menon-aktifkan
Relay. Kemudian mengisi register R0 dengan bufer DataHeksa, menjalankan sub
rutin AT93C46_EWEN untuk membolehkan menulis ke memori dan menetapkan isi
akumulator dengan nilai #09H.
Rutin PrgSimpanKartu, pertama-tama adalah mengisi
memori dengan nilai akumulator 09H. Setelah menyalin isi buffer DataHeksa
melalui register penunjuk R0 selanjutnya menaikan isi register DPTR dan R0
sebelum akhirnya memeriksa isi register R6 dengan DJNZ. Karena isi register R6 semula adalah 3 maka
program akan mengulangi rutin PrgSimpanKartu sebanyak 3 kali untuk memindahkan
isi buffer DataHeksa sebanyak 3 byte sesuai data kartu ke memori.
Setelah data kartu tersimpan maka selanjutnya
adalah menon-aktifkan EEPROM agar tidak dapat ditulis dengan memanggil sub
rutin AT93C46_EWDS. Kemudian program diakhiri dengan menjalankan timer selama 1
detik sebelum kembali ke rutin SubProgram.
Rutin PrgMemoriBerikut digunakan untuk menuju
memori berikutnya sesuai sisa nilai register R6. Total lompatan alamat DPTR
menuju ke alamat berikutnya adalah DPTR+4, maka jika semula nilai DPTR adalah
0000H maka setelah rutin ini akan bernilai 0004H. Rutin ini juga memeriksa
nilai register R7 untuk memastikan pembacaan tidak melebihi 32 atau DPTR
menjadi 80H karena lokasi alamat terakhir AT93C46 adalah 7FH.
Berikut adalah rutin AppBukaPintu yang berfungsi
mengaktifkan pulsa selama 5 detik untuk membuka pintu.
AppBukaPintu:
clr DoorRelay
acall Pulsa5Detik
setb DoorRelay
ajmp AppMulai
Rutin AppBukaPintu dijalankan karena bila mendeteksi
bit DoorExit rendah atau tombol ditekan. Setelah mengaktifkan relay untuk
membuka pintu selanjutnya program menjalankan tundaan selama 5 detik sebelum
akhirnya menon-aktifkan kembali relay dan kembali ke rutin AppMulai.
Berikut adalah AppBacaKartu yang berfungsi membaca
kartu kemudian memeriksa nomor kartu tersebut pada daftar memori At93C46.
AppBacaKartu:
mov r0, #DataHeksa
acall Wiegand
acall CekWiegand
jnz BacaMemori
ajmp AppMulai
Setelah pada rutin AppMulai terdeteksi salah satu
bit WiegandData berstatus rendah maka rutin AppBacaKartu akan memanggil sub
rutin membaca Wiegand dan menyimpannya pada buffer DataHeksa. Jika data terbaca
valid atau benar maka selanjutkan akan dibandingkan dengan isi EEPROM.
BacaMemori:
mov dph, #0
mov dpl, #0
mov r7, #32
BacaIsiMemori:
acall AT93C46_READ
cpl a
jnz BacaMemoriBerikut
ajmp AppMulai
Pertama data Wiegand Pada buffer DataHeksa akan
dibandingkan dengan alamat EEPROM 0000H sesuai ditentukan pada perintah rutin
BacaMemori sesuai isi register DPTR. Pada rutin ini kembali register R7 diisi
dengan nilai maksimum kartu yang dapat disimpan pada EEPROM yaitu 32.
Selanjutnya rutin BacaIsiMemori memeriksa byte
pertama yang berisi status isi dari alokasi memori kartu pada EEPROM. Jika
kosong maka program akan kembali menuju AppMulai.
BacaMemoriBerikut:
mov r0, #DataHeksa
mov r6, #3
CekIsiMemori:
inc dptr
acall AT93C46_READ
xch a, b
mov a, @r0
inc r0
xrl a, b
jnz CekIsiBerikut
djnz r6, CekIsiMemori
ajmp AppBukaPintu
CekIsiBerikut:
inc dptr
djnz r6, CekIsiBerikut
djnz r7, BacaIsiMemori
ajmp AppMulai
Rutin BacaMemoriBerikut adalah rutin untuk
membandingkan data buffer melalui register R0 dengan isi EEPROM sepanjang 3
byte yang ditetapkan sesuai isi register R6.
Setelah register R0 dan R6 ditetapkan maka
selanjutnya mulai membaca isi EEPROM satu pertsatu dengan memanggil sub rutin
AT93C46_READ dan menyimpannya di akumulator. Pencocokan isi kemudian dilakukan
dengan menukar isi akumulator dengan register B dengan perintah XCH (Exchange
register) kemudian menyalin buffer sesuai isi register R0 ke akumulator dan
melaksanakan perintah XOR (exclusive OR) terhadap akumulator dan register B.
Jika hasilnya isi akumulator kosong maka berarti sama dan rutin CekIsiMemori
akan diulangi untuk alamat berikutnya dan jika ke-3 byte sama maka program akan
menjalankan rutin AppBukaPintu karena nomor kartu terbaca terdaftar dalam
memori. Bahasa kerennya access granted.
Jika byte data dari DataHeksa dan alokasi data di
EEPROM tidak sama maka program akan melanjutkan ke alokasi memori berikutnya
dengan melaksanakan perintah CekIsiBerikut yang menghiitung posisi alamat
berikut dari DPTR.
Berikut adalah sub rutin pewaktu 5 detik dan 1
detik yang merupakan satu kesatuan.
Pulsa5Detik:
mov r5, #50
ajmp PulsaReg6
Pulsa1Detik:
mov r5, #10
PulsaReg6:
mov r6, #200
PulsaReg7:
mov r7, #250
djnz r7, $
djnz r6, PulsaReg7
djnz r5, PulsaReg6
ret
sub rutin Pulsa5Detik menetapkan isi register R5
dengan nilai 50 kemudian melompat ke PulsaReg6. Sementara Pulsa1Detik
menetapkan register R5 dengan 10.
Pada PulsaReg6 dan seterusnya, program berisi
perintah mengisi register R6 dengan nilai 200 dan pada rutin PulsaReg7 mengisi register
R7 dengan 250. Dengan menggunakan perintah mencacah turun DJNZ maka nilai pulsa
dapat dihitung.
Dimulai dari awal sub rutin Pulsa5Detik terdapat 4 perintah
MOV Rn, # yang membutuhkan 1 siklus dengan waktu eksekusi kurang lebih 1us
(pendekatan karena menggunakan kristal 11,095200MHz nilai sebenarnya adalah
1,085us) dan 1 perintah DJNZ R7 dengan 2 siklus maka dapat dihitung (250x2)+4=504
siklus. Kemudian DJNZ R6 dan MOV R7 dengan 3 siklus menjadi (504+3)x200=101400
siklus. Terakhir DJNZ R5 dengan siklus 3 menjadi (101400+3)x50=5.070.150us.
Pada program di atas terdapat perintah pemanggilan sub
rutin CekWiegand untuk memeriksa isi data buffer DataHeksa. Sub rutin tersebut
seperti di bawah ini:
CekWiegand:
mov r0, #DataHeksa
mov r7, #3
CekIsiWiegand:
mov a, @r0
jnz CekWiegandOK
inc r0
djnz r7, CekIsiWiegand
CekWiegandOK:
ret
Setelah menetapkan register R0 untuk merepresentasi
alamat RAM buffer DataHeksa dan panjabng data 3 byte maka perintah loop akan
memeriksa isi buffer. Jika salah satu dari isi buffer tersebut tidak kosong
maka dianggap data benar atau valid.
$include (c:\tesasm\wiegand.txt)
$include (c:\tesasm\93C46_8.txt)
end
Program yang kita buat berkaitan dengan modul-modul
yang diperlukan yaitu wiegand.txt yang berisi sub rutin perintah membaca data
wiegand dan 93c46_8.txt yang merupakan modul antarmuka dengan EEPROM AT93C46
dengan format data 8 bit.
Udah ya, makasih udah baca postingan aku. Semoga
bisa bermanfaat, sukur-sukur bisa diterapkan di rumah sobat semua.
Salam....