RFID Access

From Hive13 Wiki
Jump to navigation Jump to search

Hive13 Project
RFID Access System
Status: Active
Start Date: 1/12/2012



The purpose of this project is to build a modular RFID Access System for all of the tools, doors, and vending machines in the Hive.

  • Requirements
    • Uses the Access Protocol
    • Accepts NFC tags and phones with NFC for access and tracking control (our badges run at 125 KHz)
    • Central database (Postgres, accessed via HTTP, served by a Perl Catalyst app)


What needs to be done

Main Door RFID

  • Battery backup somehow? It's PoE and that's on battery backup.
  • Have it log temperatures

Annex Door RFID

  • Schematic and PCB is on GitHub
  • Battery backup somehow?
  • Motion sensor so it unlocks when you approach it from the inside.
  • Consider switching it to wired for power backup reasons.
  • Add in a mechanical key for when the power's out.

Vending Machine RFID

  • Get compressor being controlled by the Arduino
  • Mount the relay board instead of it being set on a block of wood
  • Clean up the wiring

The Snack Vending Machine has been gutted, its coin validator removed, and RFID card mounted to the machine, however, no work has been done to bring that machine to vending status.

Places it'd be nice to have badge readers

  • Doors out to annex hallway
  • Outside door by the Dumpster
  • Certification-only tools

Enrollment Station

One of the goals of this project is to build a case where cash payments to the hive can be recorded (and membership automatically extended), and cash payments can be automatically made to the card for the purposes of purchasing sodas.

This project is in the planning phase right now -- however, if you want to help, I would appreciate the time and can provide my guidance for this project.


  • The annex uses a WeMos D1 mini.
  • The main door uses an Arduino Mega.

Wiring Diagrams

Scanner to MCU wiring

  • This is correct for the annex door
  • The main door needs to have its wiring changed to match.
Function Scanner Wire Color Ethernet cable wire color
Wiegand D0 Green Green
Wiegand D1 White White/Green
Light Grey Orange
Beeper Purple White/Orange
+12V Red Both blues
Ground Black Both browns

2929 Spring Grove - Rework for Front Door

Currently involved:

  • Hodapp (setup on Pi and integration with RFID reader)
  • Drew Kirkman (infra stuff)
  • Chris Davis (wiring, mounting)
  • Dave Velzy

We are working on a makeshift solution for the new space at 2701. Right now this is running from a Raspberry Pi with Alpine Linux and some software written in Go. This code interfaces with RFID readers over the Wiegand protocol, communicates with intweb to request access for some badge, and listens over HTTP for 'manual' door open requests.

Code is at: https://github.com/Hive13/HiveRFID

The electric door release is a HES 5000 from Assa Abloy. (Installation instructions: https://content.assaabloyusa.com/doc/AADSS1009179&.pdf)


Diagram to follow, eventually.

  • Green (Wiegand D0) from reader to level shifter RXI channel 1
  • White (Wiegand D1) from reader to level shifter RXI channel 2
  • Black (ground) from reader to level shifter GND (either one)
  • Raspberry Pi BCM 17 to level shifter RXO channel 1
  • Raspberry Pi BCM 18 to level shifter RXO channel 2
  • Raspberry Pi 3.3V to level shifter LV
  • Raspberry Pi 5V to level shifter HV
  • Raspberry Pi GND to level shifter GND (either one)
  • Raspberry Pi BCM 26 to purple from reader (beeper)
  • Raspberry Pi BCM 16 to grey from reader (LED)
  • Raspberry Pi BCM 24 to relay board input

Connect power to reader's red wire, and ensure that power supply ground is also connected to level shifter GND. (With the uctronics PoE hat with the +12VDC output available, you can plug the red wire to the +12V terminal and ground to the ground terminal.)

Double-check that D0 and D1 from the reader are always on the high-voltage side of the level shifter, and that the Raspberry Pi's GPIOs are always on the low-voltage side.

If you have no level shifter, this also works:

  • Wiegand D0 (green) to BCM 17 through a resistive divider to ground (two 1K resistors)
  • Wiegand D1 (white) to BCM 18 through a resistive divider to ground (likewise two 1K resistors)

The resistive divider is because D0 and D1 use 5V, while the Raspberry Pi runs at 3.3V - so they may damage the Pi if used directly. The divider steps this down to a safer 2.5V. Any kind of level shifter that works similarly should be fine here. The beeper and LED pins do not need their level shifted; simply put them on a GPIO pin and bring the pin low to trigger the beeper and the LED.

Wiring to HES5000 at Front Door

The connections to the HES5000 were done to the Cat5e snaked through the front door frame as follows:

  • Ethernet brown pair to HES5000 purple
  • Ethernet green pair to HES5000 red/green stripe
  • Ethernet blue pair to HES5000 black
  • Ethernet orange pair to HES5000 red

This can work with the 12 V supply from the uctronics PoE hat. As in the instructions, connect +12 VDC to the brown and orange pair, and negative to the blue and green pair.

(This was also tested with a ~20 V supply, wired up as the instructions give for +24 VDC: connect brown & blue pair together, connect orange pair to positive, connect green pair to negative.)


  • Reading RFID cards from badge reader, and producing proper badge number
  • Authenticating this badge number for door access with intweb
  • Serving HTTP requests
  • Triggering beeper and LED on badge reader
  • Triggering door strike via relay board
  • Powering both RFID reader and door strike from +12VDC of Raspberry Pi's PoE hat

Still needed

  • Other wiring and mounting - mounting and wiring to badge reader, mounting Pi, other power connections
  • More complete documentation on wiring (once the wiring is to a stable state)

For the software:

  • Cache badges (perhaps hold a badge in cache for 3-4 days)
  • More setup in Alpine Linux - run the code in OpenRC, enable Raspberry Pi's hardware watchdog, and perhaps have some other monitoring on the LAN to ensure that the Pi has not gone offline or crashed
  • Back up this Linux image someplace that people can find it easily if needed
  • Document the HTTP endpoint
  • Get old Python & C code into repository
  • Make better use of beeper and LED?
  • Maybe: Use a mutex to make behavior around multiple unlocks in a row more sane. (For instance: Rather than having a flat 3-second timer to re-lock after every unlock, perhaps instead have a timer that is reset at every unlock.)