====== DIY RFID system with RPi ====== If you're interested to know how this stared, [[rfid_access_system_door_lock_and_laser_cutter_inspiration|have a look here]]. This project was supposed to be a generic solution for giving EB members controlled access to lab resources. So far it's working for the laser cutter only, but has some potential to be extended! We tried hard to used a micro-controller for this. This one worked with an Arduino Nano without the Ethernet Shield. Once we connect the Ethernet shield it won't work via SPI. And via i2c it becomes very unstable. So we tried with a Raspberry Pi models 1 and 2. Didn't work either. Tried SPI, i2c and UART. Also, after many issues dealing with RFID reader MFRC522, we decided to move to PN532. So finally we got the PN532 working with a Raspberry Pi 3 via i2c. So far it's been consistent. The source code is available on github: https://github.com/tiagovaz/eblab/ ===== Hardware parts ===== Here is the current hardware parts for this project: * [[https://www.raspberrypi.org/products/raspberry-pi-3-model-b/|RaspberryPi 3 or newer]] * [[https://abra-electronics.com/sensors/sensors-id-en/high-frequency/sens-26-mfrc522-nfc-rfid-controller-breakout-board.html |MFRC522 NFC/RFID Controller Breakout Board]] * [[https://abra-electronics.com/robotics-embedded-electronics/raspberry-pi-en-3/displays/wave-15811-3.5inch-rpi-lcd-c-480x320-125mhz-high-speed-spi.html|3.5inch RPi LCD (C), 480x320, 125MHz High-Speed SPI]] * [[http://www.datasheetcafe.com/srd-05vdc-sl-c-datasheet-pdf/|5V Relay SRD-05VDC-SL-C or similar]] The current solution includes a few Python scripts on a local Raspberry Pi and a simple Django application server side. ===== RPi preparation ===== **Hardware** {{ :signal-2020-11-12-135551_002.jpeg?nolink&400 |}} **WIP:** {{ ::eblab_rfid_bb.png?nolink&400 |}} **Software** * Install Raspberry Pi OS (32-bit) with desktop. Instructions [[https://www.raspberrypi.org/downloads/raspberry-pi-os/|here]]. * Follow the instructions here on how to build&install the NFC library: http://wiki.sunfounder.cc/index.php?title=PN532_NFC_RFID_Module#Test_for_Raspberry * git clone https://github.com/tiagovaz/py532lib.git (use this one since I merged important PRs) * ''sudo apt install python3-setuptools && cd py532lib; sudo python3 setup.py install'' * Install the remained needed Python3 libraries from the provided ''requirements_rpi.txt'': ''sudo pip3 install -r requirements_rpi.txt'' * Setup the desktop to call ''eblaser_gui.py'' once the XOrg server is loaded. ===== Client side software (Rpi/Python) ===== * ''eblaser_daemon.py'': currently placed on ''/home/pi/py532lib/'', this script uses the pn532 library to make the RFID reading calls. Information about the resource usage is stored as a json structure in ''/tmp/eblaser_data.json''. This file will be constantly read by another script, which will update the screen attached to the RPi. * ''eblaser_gui.py'': First I tried hard to have a single daemon for the whole process. However, updating the screen and reading the RFID card refused to work under a same clock. Threads didn't work neither. That's why this script exists: it constantly reads information from the json file generated by ''eblaser_daemon.py'' and updates the RPi screen accordingly. * ''eblaser_daemon.service'': service unit configuration file for calling ''eblaser_daemon.py''. Should be placed on ''/usr/local/lib/systemd/system''. ===== Server side software (Django app) ===== The django app provided along with the local scripts should be deployed as a regular django app, nothing special :-) The dependencies are listed in the ''requirements_server.txt'' and can be installed via pip3. This should be deployed under HTTPS using any webserver. The URL should be set on the local scripts accordingly. For authenticating the RPi requests, you need to create a user token and add it to script ''eblaser_gui.py''. On the server side, do the following: ''python3 manage.py drf_create_token eb'' On the client side, add the generated token to ''self.headers'' CardReader attribute: ''self.headers = {'Authorization': 'Token MYSECRETTOKENGENERATEDONTHESERVER'}'' **API** For json responses, add ''format=json'' to the URL. Resource usage examples: * /rfid/?uid=XXXXXX&resource=laser_cutter&action=LAS (starting laser usage) * /rfid/?uid=XXXXXX&resource=laser_cutter&action=LAE&usage_time=120 (ending laser usage and recording cut time) Possible actions: * LAS (laser start) * LAE (laser end) * LOI (logged in) * LOO (logged out) * NON (do nothing, used for authentication only) Getting users information, mostly used for the RPi screen messages: * /person/XXXXXX (get person name from a given rfid) * /people (get all users info) Getting total resource usage from a given user from their rfid: * /daily_usage/XXXXXX