mirror of
https://github.com/bitlair/bitlair_doorduino.git
synced 2025-05-13 12:20:07 +02:00
Update to new hardware with custom door lock hardware
This commit is contained in:
parent
7db14dedbd
commit
909dd3b162
2 changed files with 234 additions and 19 deletions
|
@ -7,15 +7,37 @@
|
||||||
#include "Entropy.h"
|
#include "Entropy.h"
|
||||||
#include "sha1.h"
|
#include "sha1.h"
|
||||||
|
|
||||||
#define PIN_HORN 6
|
|
||||||
#define PIN_OPEN 5
|
#include <Arduino.h>
|
||||||
#define PIN_CLOSE 4
|
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
|
||||||
|
#define MOTOR_STEPS 100
|
||||||
|
#define RPM 120
|
||||||
|
#define DIR A0
|
||||||
|
#define STEP 9
|
||||||
|
#include "A4988.h"
|
||||||
|
A4988 stepper(MOTOR_STEPS, DIR, STEP);
|
||||||
|
|
||||||
|
#define INPUT_SOLENOID 4
|
||||||
|
#define INPUT_HORN 3
|
||||||
|
#define PIN_LEDSOLENOID 6
|
||||||
|
#define PIN_LEDHORN 5
|
||||||
|
bool StateSolenoid = false;
|
||||||
|
bool StateHorn = false;
|
||||||
|
uint32_t SolenoidStartTime;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PIN_DOORPOWER A3
|
||||||
|
#define PIN_SOLENOID A5
|
||||||
|
#define PIN_HORN A4
|
||||||
|
#define PIN_OPEN 8
|
||||||
|
#define PIN_CLOSE 7
|
||||||
|
|
||||||
#define PIN_1WIRE 13
|
#define PIN_1WIRE 13
|
||||||
#define PIN_LEDGREEN 10
|
#define PIN_LEDGREEN 10
|
||||||
#define PIN_LEDRED 11
|
#define PIN_LEDRED 11
|
||||||
|
|
||||||
#define PIN_MAINS_POWER 9
|
#define PIN_MAINS_POWER A2
|
||||||
|
|
||||||
#define CMD_BUFSIZE 64
|
#define CMD_BUFSIZE 64
|
||||||
#define CMD_TIMEOUT 10000 //command timeout in milliseconds
|
#define CMD_TIMEOUT 10000 //command timeout in milliseconds
|
||||||
|
@ -145,6 +167,16 @@ void setup()
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.println("DEBUG: Board started");
|
Serial.println("DEBUG: Board started");
|
||||||
|
|
||||||
|
stepper.begin(RPM);
|
||||||
|
stepper.enable();
|
||||||
|
stepper.setMicrostep(1); // Set microstep mode to 1:1
|
||||||
|
|
||||||
|
pinMode(INPUT_SOLENOID, INPUT_PULLUP);
|
||||||
|
pinMode(INPUT_HORN, INPUT_PULLUP);
|
||||||
|
pinMode(PIN_LEDSOLENOID, OUTPUT);
|
||||||
|
pinMode(PIN_LEDHORN, OUTPUT);
|
||||||
|
pinMode(PIN_DOORPOWER, OUTPUT);
|
||||||
|
pinMode(PIN_SOLENOID, OUTPUT);
|
||||||
pinMode(PIN_OPEN, OUTPUT);
|
pinMode(PIN_OPEN, OUTPUT);
|
||||||
pinMode(PIN_CLOSE, OUTPUT);
|
pinMode(PIN_CLOSE, OUTPUT);
|
||||||
pinMode(PIN_HORN, OUTPUT);
|
pinMode(PIN_HORN, OUTPUT);
|
||||||
|
@ -153,6 +185,10 @@ void setup()
|
||||||
pinMode(PIN_LEDRED, OUTPUT);
|
pinMode(PIN_LEDRED, OUTPUT);
|
||||||
pinMode(PIN_MAINS_POWER, INPUT);
|
pinMode(PIN_MAINS_POWER, INPUT);
|
||||||
|
|
||||||
|
digitalWrite(PIN_OPEN, LOW);
|
||||||
|
digitalWrite(PIN_CLOSE, LOW);
|
||||||
|
digitalWrite(PIN_DOORPOWER, LOW);
|
||||||
|
|
||||||
SetLEDState(LEDState_Off);
|
SetLEDState(LEDState_Off);
|
||||||
|
|
||||||
Entropy.initialize();
|
Entropy.initialize();
|
||||||
|
@ -501,28 +537,25 @@ void ToggleLock()
|
||||||
{
|
{
|
||||||
g_lockopen = false;
|
g_lockopen = false;
|
||||||
Serial.println("closing lock");
|
Serial.println("closing lock");
|
||||||
for (uint8_t i = 0; i < 3; i++)
|
digitalWrite(PIN_DOORPOWER, HIGH);
|
||||||
{
|
|
||||||
digitalWrite(PIN_CLOSE, HIGH);
|
digitalWrite(PIN_CLOSE, HIGH);
|
||||||
DelayLEDs(BUTTON_TIME);
|
DelayLEDs(BUTTON_TIME);
|
||||||
digitalWrite(PIN_CLOSE, LOW);
|
|
||||||
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
|
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_lockopen = true;
|
g_lockopen = true;
|
||||||
Serial.println("opening lock");
|
Serial.println("opening lock");
|
||||||
for (uint8_t i = 0; i < 3; i++)
|
digitalWrite(PIN_DOORPOWER, HIGH);
|
||||||
{
|
|
||||||
digitalWrite(PIN_OPEN, HIGH);
|
digitalWrite(PIN_OPEN, HIGH);
|
||||||
DelayLEDs(BUTTON_TIME);
|
DelayLEDs(BUTTON_TIME);
|
||||||
digitalWrite(PIN_OPEN, LOW);
|
|
||||||
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
|
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
DelayLEDs(4000);
|
DelayLEDs(4000);
|
||||||
|
digitalWrite(PIN_OPEN, LOW);
|
||||||
|
digitalWrite(PIN_CLOSE, LOW);
|
||||||
|
digitalWrite(PIN_DOORPOWER, LOW);
|
||||||
|
|
||||||
Serial.println("finished lock action");
|
Serial.println("finished lock action");
|
||||||
}
|
}
|
||||||
|
@ -570,6 +603,15 @@ void loop()
|
||||||
Serial.print("iButton authenticated\n");
|
Serial.print("iButton authenticated\n");
|
||||||
ToggleLock();
|
ToggleLock();
|
||||||
deniedcount = 0;
|
deniedcount = 0;
|
||||||
|
|
||||||
|
if(g_lockopen == true){
|
||||||
|
StateSolenoid = true;
|
||||||
|
SolenoidStartTime = millis();
|
||||||
|
Serial.print("Solenoid activated\n");
|
||||||
|
digitalWrite(PIN_SOLENOID, HIGH);
|
||||||
|
stepper.move(MOTOR_STEPS*(RPM/60)*10);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -592,6 +634,34 @@ void loop()
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessLEDs();
|
ProcessLEDs();
|
||||||
|
|
||||||
|
digitalWrite(PIN_LEDSOLENOID, HIGH);
|
||||||
|
digitalWrite(PIN_LEDHORN, HIGH);
|
||||||
|
if (digitalRead(INPUT_SOLENOID) == LOW) {
|
||||||
|
if(StateSolenoid == false){
|
||||||
|
StateSolenoid = true;
|
||||||
|
SolenoidStartTime = millis();
|
||||||
|
Serial.print("Solenoid activated\n");
|
||||||
|
digitalWrite(PIN_SOLENOID, HIGH);
|
||||||
|
stepper.move(MOTOR_STEPS*(RPM/60)*10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(StateSolenoid == true && ((millis() - SolenoidStartTime) > (10*1000)) ){
|
||||||
|
digitalWrite(PIN_SOLENOID, LOW);
|
||||||
|
StateSolenoid = false;
|
||||||
|
}
|
||||||
|
if (digitalRead(INPUT_HORN) == LOW) {
|
||||||
|
if(StateHorn == false){
|
||||||
|
StateHorn = true;
|
||||||
|
Serial.print("Horn activated\n");
|
||||||
|
digitalWrite(PIN_HORN, HIGH);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
StateHorn = false;
|
||||||
|
digitalWrite(PIN_HORN, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
145
bitlair_doorduino_door/bitlair_doorduino_door.ino
Normal file
145
bitlair_doorduino_door/bitlair_doorduino_door.ino
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// this pin should connect to Ground when want to stop the motor
|
||||||
|
#define STOPPER_PIN 4
|
||||||
|
|
||||||
|
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
|
||||||
|
#define MOTOR_STEPS 400
|
||||||
|
#define RPM 60
|
||||||
|
// Acceleration and deceleration values are always in FULL steps / s^2
|
||||||
|
#define MOTOR_ACCEL 2000
|
||||||
|
#define MOTOR_DECEL 1000
|
||||||
|
|
||||||
|
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
|
||||||
|
#define MICROSTEPS 8
|
||||||
|
|
||||||
|
#define DIR 10
|
||||||
|
#define STEP 11
|
||||||
|
#define ENABLE A3 // optional (just delete ENABLE from everywhere if not used)
|
||||||
|
|
||||||
|
#define SLEEP 12
|
||||||
|
#define RESET 13
|
||||||
|
|
||||||
|
#include "A4988.h"
|
||||||
|
#define MS1 A2
|
||||||
|
#define MS2 A1
|
||||||
|
#define MS3 A0
|
||||||
|
A4988 stepper(MOTOR_STEPS, DIR, STEP, ENABLE, MS1, MS2, MS3);
|
||||||
|
|
||||||
|
|
||||||
|
#include <ams_as5048b.h>
|
||||||
|
|
||||||
|
//unit consts
|
||||||
|
#define U_RAW 1
|
||||||
|
#define U_TRN 2
|
||||||
|
#define U_DEG 3
|
||||||
|
#define U_RAD 4
|
||||||
|
#define U_GRAD 5
|
||||||
|
#define U_MOA 6
|
||||||
|
#define U_SOA 7
|
||||||
|
#define U_MILNATO 8
|
||||||
|
#define U_MILSE 9
|
||||||
|
#define U_MILRU 10
|
||||||
|
|
||||||
|
AMS_AS5048B mysensor;
|
||||||
|
|
||||||
|
|
||||||
|
#define DOOR_OPEN 3
|
||||||
|
#define DOOR_CLOSE 2
|
||||||
|
|
||||||
|
#define STATE_IDLE 0
|
||||||
|
#define STATE_OPEN 1
|
||||||
|
#define STATE_CLOSE 2
|
||||||
|
int state = STATE_IDLE;
|
||||||
|
int angle_prev = 0;
|
||||||
|
int angle = 0;
|
||||||
|
int angle_steps = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
pinMode(SLEEP, OUTPUT);
|
||||||
|
pinMode(RESET, OUTPUT);
|
||||||
|
digitalWrite(SLEEP, HIGH);
|
||||||
|
digitalWrite(RESET, HIGH);
|
||||||
|
|
||||||
|
// Configure stopper pin to read HIGH unless grounded
|
||||||
|
pinMode(STOPPER_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
stepper.begin(RPM, MICROSTEPS);
|
||||||
|
stepper.disable();
|
||||||
|
|
||||||
|
//stepper.setSpeedProfile(stepper.LINEAR_SPEED, MOTOR_ACCEL, MOTOR_DECEL);
|
||||||
|
stepper.setSpeedProfile(stepper.CONSTANT_SPEED, MOTOR_ACCEL, MOTOR_DECEL);
|
||||||
|
|
||||||
|
//init AMS_AS5048B object
|
||||||
|
mysensor.begin();
|
||||||
|
|
||||||
|
pinMode(DOOR_OPEN, INPUT);
|
||||||
|
pinMode(DOOR_CLOSE, INPUT);
|
||||||
|
|
||||||
|
Serial.println("START");
|
||||||
|
|
||||||
|
stepper.setEnableActiveState(LOW);
|
||||||
|
// stepper.enable();
|
||||||
|
// stepper.rotate(360);
|
||||||
|
// Serial.println("START2");
|
||||||
|
|
||||||
|
if (digitalRead(DOOR_OPEN) == HIGH && state == STATE_IDLE){
|
||||||
|
state = STATE_OPEN;
|
||||||
|
Serial.println("RECEIVED OPEN");
|
||||||
|
stepper.enable();
|
||||||
|
stepper.startRotate(-560);
|
||||||
|
}
|
||||||
|
if (digitalRead(DOOR_CLOSE) == HIGH && state == STATE_IDLE){
|
||||||
|
state = STATE_CLOSE;
|
||||||
|
Serial.println("RECEIVED CLOSE");
|
||||||
|
stepper.enable();
|
||||||
|
stepper.startRotate(560);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
static int step = 0;
|
||||||
|
|
||||||
|
if(state != STATE_IDLE && millis()%50 == 0){
|
||||||
|
angle_prev = angle;
|
||||||
|
angle = mysensor.angleR(U_DEG, true);
|
||||||
|
angle_steps++;
|
||||||
|
Serial.print("Time : ");
|
||||||
|
Serial.print(millis(), DEC);
|
||||||
|
Serial.print(" Angle : ");
|
||||||
|
Serial.print(angle, DEC);
|
||||||
|
Serial.print(" angle prev : ");
|
||||||
|
Serial.println(angle_prev, DEC);
|
||||||
|
|
||||||
|
if(angle_steps > 5 && (angle_prev - angle) >= -5 && (angle_prev - angle) <= 5){
|
||||||
|
Serial.println("STOPPER REACHED");
|
||||||
|
stepper.stop();
|
||||||
|
stepper.disable();
|
||||||
|
|
||||||
|
state = STATE_IDLE;
|
||||||
|
step = 0;
|
||||||
|
angle_steps = 0;
|
||||||
|
delay(10000);
|
||||||
|
Serial.println("FINISHED");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// motor control loop - send pulse and return how long to wait until next pulse
|
||||||
|
unsigned wait_time = stepper.nextAction();
|
||||||
|
// Serial.println(wait_time);
|
||||||
|
step++;
|
||||||
|
|
||||||
|
// 0 wait time indicates the motor has stopped
|
||||||
|
if (state != STATE_IDLE && wait_time <= 0) {
|
||||||
|
stepper.disable(); // comment out to keep motor powered
|
||||||
|
Serial.println("END");
|
||||||
|
state = STATE_IDLE;
|
||||||
|
step = 0;
|
||||||
|
angle_steps = 0;
|
||||||
|
delay(10000);
|
||||||
|
Serial.println("FINISHED");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue