Translate

Membuat Pintu Akses Sederhana Untuk Rumah Atau Kantor Kecil Dengan AT89C2051 Dan AT93C46


  
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....

Tidak ada komentar:

Posting Komentar