PROJECT_05

ZKTeco

Control de Acceso Físico

Access control for a school: a custom Arduino PCB, a ZKTeco card reader and a web panel to manage students.

TYPE
Hardware · Full Stack
STATUS
IN PRODUCTION
SCREENSHOTS
12
  • React
  • Vite
  • TailwindCSS
  • Java
  • Spring Boot
  • MySQL
  • Arduino / ESP32
  • C++
  • KiCad
  • Wiegand 26/34

CONTEXT

An end-to-end project: the circuit, the firmware, the backend that decides who gets in, and the panel where it is managed, hosted on the school’s own server.

HIGHLIGHTS

  • Custom PCB integrating the Arduino, the lock relay and step-down power supplies.
  • ZKTeco PROID10BM MIFARE slave card reader (13.56 MHz) to identify each student by card.
  • The backend checks whether the student is active or blocked before opening.
  • Web panel to add, remove and block students, hosted on the school server.

THE BOARD · REV A

  • Designed in KiCad: 170 × 115 mm, 61 components all through-hole so the whole board solders with one technique, 42 nets, and ERC and DRC at zero.
  • Two independent Wiegand readers, two door relays broken out as dry contacts (COM/NC/NO) and two exit buttons, all driven by an Arduino Nano.
  • 12 V input with a resettable PTC and a Schottky against reverse polarity; an MP1584 buck steps down to 5 V for the Nano and the pull-ups.
  • Every Wiegand line passes through a TVS, a 1 nF filter and a 220 Ω series resistor before reaching the AVR: that is what buys cable length on a bus that is not differential.
  • A single ULN2003A drives the LED and buzzer of both readers, with four unpopulated pull-ups left in place in case a reader asserts high instead of pulling to ground.
  • The three on-board LEDs cost no pin at all: the PWR one hangs off the 5 V rail and the relay ones sit across the coil, so they report the actual actuation rather than what the firmware believes.

THE FIRMWARE

  • Wiegand 26 and 34 decoded on interrupt, validating both parity bits before the card list is even consulted; a frame that is not exactly 26 or 34 bits discards itself.
  • The Nano has only two hardware interrupts and four lines were needed: the second reader runs on a pin-change interrupt over port D, comparing against the previous state to keep only the falling edges.
  • Up to 100 cards held in EEPROM: they are enrolled over the serial port at 115200, on site and without recompiling.
  • Not a single delay(): relays, LEDs and beeps are state machines, so one reader can be beeping while the other reads.
  • A 2 s watchdog, and the first thing setup() does is drop both relays: if the reset happened with a door open, it does not stay open.
  • 6.5 KB of flash (21 %) and 324 B of RAM, compiled warning-free for arduino:avr:nano.

SCREENSHOTS

ZKTeco PROID10BM MIFARE card reader used in the access control system
ZKTeco PROID10BM reader
ZKTeco reader installed next to the entrance door
On-site installation
Design of the custom PCB with Arduino and relay for the electric lock
PCB design
Trace routing view of the access control board
Trace routing
3D view of the board with connectors and step-down supplies
3D view of the board
3D view of the board from the back, showing the reader terminal silkscreen
Terminal silkscreen
Login screen of the access control web panel
Panel login
List of registered students in the admin panel
Registered students
Student registration form and card assignment
Student registration
Access history log with date and time
Access history
Admin panel showing student status
Student status
Settings view of the access control system
Settings

01 01