Doorbot

From Technologia Incognita
Revision as of 20:11, 15 December 2023 by Brainsmoke (talk | contribs) (New Keypad)
Jump to: navigation, search
Projects
Participants Brainsmoke
Skills
Status Finished
Niche Mechanics
Purpose Infrastructure

Usage

Doorbot instructions.svg

Entering the space: (normally)

  1. scan your fob
  2. enter your pin
  3. press the bell button

Opening the door when in Open mode (RFID Reader LED is green)

  1. press bell

Changing your pin:

  1. scan your fob
  2. enter 999
  3. press bell
  4. enter your current pin
  5. press bell
  6. wait for the doorbot to make the the 'success' double beep
  7. enter your new pin (min 4 characters)
  8. press bell
  9. repeat new pin
  10. press bell

Resetting your pin when you have forgotten:

  1. Ask a doorbot maintainer (brainsmoke for now) to trigger a pin reset
  2. scan your fob
  3. enter your new pin (min 4 characters)
  4. press bell
  5. repeat new pin
  6. press bell

Add a fob:

  1. Trick a doorbot maintainer into starting an addkey procedure
  2. scan your fob
  3. enter your new pin (min 4 characters)
  4. press bell
  5. repeat new pin
  6. press bell

Administration

doorbot shell (doorsh.py)

ssh doorbot@doorbot

Administration:

doorbot> list
doorbot> enable <fobid>
doorbot> disable <fobid>
doorbot> delete <fobid>
doorbot> addkey                  # add key using key reader + pinpad
doorbot> addkey <fobid> <pin>    # add key using doorbot shell only
doorbot> resetpin                # reset pin using reader + pinpad
doorbot> resetpin <fobid> <pin>  # reset pin using shell
doorbot> authmode                # put doorbot in authentication mode (default at startup)
doorbot> openmode                # put doorbot in open mode

doorctl.py

python doorctl.py initdb

# import fob db using plain-text pin
# rfid authorised pin
python doorctl.py import-plain << EOF
5431553 1 12345
5431554 1 12345
5431555 1 12345
5431556 1 12345
EOF

python doorctl.py export     # export fob db

python doorctl.py import     # import fob db

python doorctl.py rfidlisten # print fob IDs of fobs being scanned

Design

       5V 2A
    _____||_____        [door sensor]          5V   ___12V____
   |            |             |                ||  |          |
   |            |--usb--[Lock arduino]--opto--[relay]   [door lock]
   | Cubieboard |                                  |__________|
   |            |--usb--[Auth arduino]
   |____________|         |         |
         |          [HID reader] [keypad]
       Earth
    (for keypad)

Hardware

Software

Cubieboard

udev persistence rules

To get identifiable arributes:

udevadm info -p /class/tty/ttyUSB0 -a


SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="XXXXXXXX", SYMLINK+="ttyAUTH"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="XXXXXXXX", SYMLINK+="ttyLOCK"


doorbotd.py / doorctl.py / doorsh.py

https://github.com/techinc/doorbot

Authentication arduino

source

https://github.com/techinc/doorbot/blob/master/doorauth/doorauth.ino

protocol

Serial, 9600 baud

send:

LED ON\n
LED OFF\n
LED BLINK\n
BEEP\n        (short beep)
DENIED\n      (distorted sound)
GRANTED\n     (double short beep)

receive:

RESET\n       (arduino has reset)
KEY [0-9]\n   (keypad press)
RFID [01]*\n  (rfid scanned)

Lock arduino

source

https://github.com/techinc/doorbot/blob/master/doorlock/doorlock.ino

protocol

Serial, 9600 baud

send:

UNLOCK\n
LOCK\n

receive:

RESET\n        (arduino has reset) 
OPEN\n         (door has opened)
CLOSED\n       (door has closed)

New Keypad

Mechpad1.jpg

Project page: mechpad

Serial, 9600 baud
keypad -> arduino
[0123456789CB]   (keypresses)
[XYZW]           (unused buttons to the right)

arduino -> keypad:
R     (red swirl) 
G     (green swirl)
B     (blue swirl)
S     (sleep animation)
P     (party mode / color wheel swirl)

source

https://github.com/techinc/mechpad

Old Keypad

The old keypad was replaced due to glitching :-( Project page: matrixpad

source

https://github.com/techinc/matrixpad

Keypad New

the new keypad code is: made by beatskip, will post a schematic later this week

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_TCA8418.h>

#define I2C_SDA 19
#define I2C_SCL 18

Adafruit_TCA8418 keypad;

#define ROWS 4
#define COLS 3

char keymap[COLS][ROWS] = {{'1', '4', '7', 'C'},
                           {'2', '5', '8', '0'},
                           {'3', '6', '9', 'B'}};

void setup() {
   Serial.begin(9600);
    pinMode(10, OUTPUT);
    pinMode(7, OUTPUT);
  digitalWrite(10, HIGH);
  digitalWrite(7, HIGH);
  Wire.begin(I2C_SDA, I2C_SCL);
   //run_i2c_scanner();

 
  if (! keypad.begin(TCA8418_DEFAULT_ADDR, &Wire)) {
    Serial.println("keypad not found, check wiring & pullups!");
    while (1);
  }

  // configure the size of the keypad matrix.
  // all other pins will be inputs
  keypad.matrix(ROWS, COLS);

  // flush the internal buffer
  keypad.flush();
  Serial.println();
  
}


void loop()
{
  
  if (keypad.available() > 0)
  {
    //  datasheet page 15 - Table 1
    int k = keypad.getEvent();
    bool pressed = k & 0x80;
    k &= 0x7F;
    k--;
    uint8_t row = k / 10;
    uint8_t col = k % 10;

    if (pressed) 
      Serial.write(keymap[col][row]);

    
  }
}