Difference between revisions of "ACKsess"
m (omg ocd spacing fail.. must.. align... code... has to be maintainable!!!1~) |
(linked pictures) |
||
Line 17: | Line 17: | ||
* Opens on powerup/reset. This way, the reset button can be used to open the door | * Opens on powerup/reset. This way, the reset button can be used to open the door | ||
* Various code cleanup/alignment/update | * Various code cleanup/alignment/update | ||
+ | ==== images ==== | ||
+ | Some images | ||
+ | <gallery> | ||
+ | File:ACKsess_1.jpg|iButton reader inside the door handle hole | ||
+ | File:ACKsess_2.jpg|first version of door lock mechanism | ||
+ | File:ACKsess_3.jpg|Awesome door handle (press fire to open) | ||
+ | File:ACKsess_4.jpg|Joystick internals | ||
+ | </gallery> | ||
+ | |||
+ | |||
+ | |||
==== hardware ==== | ==== hardware ==== |
Revision as of 08:33, 20 November 2014
Project: ACKsess | |
---|---|
Featured: | |
State | Active |
Members | Vicarious, Prodigity, xopr |
GitHub | No GitHub project defined. Add your project here. |
Description | Knock knock. |
Picture | |
No project picture! Fill in form Picture or Upload a jpeg here |
Contents
synopsis
knock knock.
current implementation
The now working ACKsess implementation has several advantages over the old broken one, that broke.
- Heartbeat: it pulsates the LED every 5 seconds or so, to indicate it's active
- Better feedback (fast blink if door is unlocked)
- Brute force protection (locks 30 seconds after a failed authentication)
- Faster response (shortened the delay for faster response)
- Opens on powerup/reset. This way, the reset button can be used to open the door
- Various code cleanup/alignment/update
images
Some images
hardware
Xopr placed his Arduino mega 1280 (clone) to get it working quickly (still took him all day to get back on track).
arduino Mega 1280
Used the arduino to get it working quickly, new design should be underway (by someone else). Xopr made a mini prototype shield where the onewire pullup sits, the NPN transistor (to switch the 12Vin via the relay to ground), the LED, external button and some extra ground connections.
You can add a usb A to B cable for debugging on 115200 baud.
proto shield
The shield fetches power and uses some of the digital I/O 0 to 7.
Arduino pins
- TxD, not used
- relay pin, set high to pull breakout pin X to low
- led pin, uses pwm heart beat every 5 seconds and blinks fast if the door is unlocked
- reader pin: the onewire data pin
- button pin: for use for external opener, pullup (connect to ground to trigger)
breakout pins:
,_________ | |o external open (pullup, connect to ground to trigger) |o onewire data (probe green) |o led + (probe orange) |o Vin (12v for relay) (bundle-with-orange) |o door-open (GND-switch) (bundle-with-blue) |o GND (currently not connected, for use with external button) |o GND (probe orange) |o GND (probe blue) o o o | e b c NPN transistor '__________
- The NPN transistor used is a BC548 (goes up to 500mA), drived with a 100-300 something ohm resistor on the base (from the top of my head).
- Note that is has a diode (1n4000 something) antiparallel between collector and emittor as coil reverse voltage protection
- The onewire pull up used is 4k7 to 5v
DS9092L iButton probe
I had to reverse engineer the wiring somewhat (connector was gone), but here it is: DS9092L iButton probe datasheet Pinout:
- GND (blue)
- Data (onewire) (green)
- LED cathode (-) (yellow)
- LED anode (+) (orange)
software
Most of ACKsess.ino:
#include <OneWire.h> const int relayPin = 3; // the number of the relay pin const int ledPin = 4; // the number of the LED pin (change to 13 to see the onboard led) const int readerPin = 5; // the number of the iButton reader pin const int buttonPin = 6; // the number of the pushbutton pin OneWire ds( readerPin ); byte addr[ 8 ]; String keyStatus = ""; // Buttons, first defense byte but[][6] = { /* ADD YOUR BUTTONS HERE */ }; void setup(void) { Serial.begin( 115200 ); pinMode( buttonPin, INPUT_PULLUP ); pinMode( ledPin, OUTPUT ); pinMode( relayPin, OUTPUT ); Serial.println( "ACKsess initialized" ); Serial.print( "number of keys: " ); Serial.println( sizeof( but ) / 6 ); // Open the door upon power up and (on board) reset openDoor( ); } byte nState = 0; byte nLedVal = 0; void loop(void) { switch ( nState ) { case 0: // forward, led fade in nLedVal++; if ( nLedVal >= 255 ) nState++; analogWrite( ledPin, nLedVal ); delay( 1 ); break; case 1: // backward, led fade out nLedVal--; if ( nLedVal <= 0 ) nState++; analogWrite( ledPin, nLedVal ); delay( 1 ); break; default: // idle nState++; delay( 500 ); if ( nState >= 10 ) nState = 0; break; }; // If the external button was pushed, open the door if ( digitalRead( buttonPin ) == LOW ) openDoor( ); // Check keys twice each fade and on every idle state step if ( (nLedVal == 127) || ( nState > 1 ) ) { // Store the button info and read the keycode getKeyCode( ); if( keyStatus == "ok" ) { // We have a correct key type, authenticate it Serial.print("00"); for( byte i = 5; i > 0; i--) { Serial.print(":"); Serial.print(addr[i], HEX); } Serial.println(""); // Either open the door, or lock the system for 30 seconds if ( authenticateKey( addr ) ) { openDoor( ); } else { Serial.println( "ACKsess denied!" ); delay( 30000 ); } } } } void openDoor() { Serial.println( "ACKsess!" ); // Trigger the relay digitalWrite( relayPin, HIGH ); // Blink the led fast for about 3 seconds for ( byte n = 0; n < 15; n++ ) { digitalWrite( ledPin, HIGH ); delay( 100 ); digitalWrite( ledPin, LOW ); delay( 100 ); } // Relay off digitalWrite( relayPin, LOW ); } void getKeyCode() { byte present = 0; byte data[ 12 ]; keyStatus=""; if ( !ds.search( addr ) ) { ds.reset_search( ); return; } if ( OneWire::crc8( addr, 7) != addr[ 7 ] ) { keyStatus = "CRC invalid"; return; } keyStatus = "ok"; ds.reset( ); } boolean authenticateKey( byte* _button ) { /* SECURITY THROUGH OBSCURITY, VISIT US TO SEE SOME EXAMPLES */ return false; }
todo
- have battery backup (implement stand-by mode, might need a refit of the pull-up)
- check if we need a power-on-lock or power-off-lock, and add an appropriate power design
- someone needs to make a 2.0 version that fits in the designated casing (the awesome joystick), but up until that time, the current implementation will suffice.
- audit the authentication method
- Create better method to store and revoke keys on the whole