From 909dd3b16239c85bf3b32b0ea0dd76c82fd355fa Mon Sep 17 00:00:00 2001 From: Jeroen Stroeve Date: Mon, 12 Aug 2024 20:26:52 +0200 Subject: [PATCH] Update to new hardware with custom door lock hardware --- bitlair_doorduino/bitlair_doorduino.ino | 108 ++++++++++--- .../bitlair_doorduino_door.ino | 145 ++++++++++++++++++ 2 files changed, 234 insertions(+), 19 deletions(-) create mode 100644 bitlair_doorduino_door/bitlair_doorduino_door.ino diff --git a/bitlair_doorduino/bitlair_doorduino.ino b/bitlair_doorduino/bitlair_doorduino.ino index 41ca375..fc4ceb2 100644 --- a/bitlair_doorduino/bitlair_doorduino.ino +++ b/bitlair_doorduino/bitlair_doorduino.ino @@ -7,15 +7,37 @@ #include "Entropy.h" #include "sha1.h" -#define PIN_HORN 6 -#define PIN_OPEN 5 -#define PIN_CLOSE 4 + +#include +// 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_LEDGREEN 10 #define PIN_LEDRED 11 -#define PIN_MAINS_POWER 9 +#define PIN_MAINS_POWER A2 #define CMD_BUFSIZE 64 #define CMD_TIMEOUT 10000 //command timeout in milliseconds @@ -145,6 +167,16 @@ void setup() Serial.begin(115200); 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_CLOSE, OUTPUT); pinMode(PIN_HORN, OUTPUT); @@ -153,6 +185,10 @@ void setup() pinMode(PIN_LEDRED, OUTPUT); pinMode(PIN_MAINS_POWER, INPUT); + digitalWrite(PIN_OPEN, LOW); + digitalWrite(PIN_CLOSE, LOW); + digitalWrite(PIN_DOORPOWER, LOW); + SetLEDState(LEDState_Off); Entropy.initialize(); @@ -501,28 +537,25 @@ void ToggleLock() { g_lockopen = false; Serial.println("closing lock"); - for (uint8_t i = 0; i < 3; i++) - { - digitalWrite(PIN_CLOSE, HIGH); - DelayLEDs(BUTTON_TIME); - digitalWrite(PIN_CLOSE, LOW); - DelayLEDs(TOGGLE_TIME - BUTTON_TIME); - } + digitalWrite(PIN_DOORPOWER, HIGH); + digitalWrite(PIN_CLOSE, HIGH); + DelayLEDs(BUTTON_TIME); + DelayLEDs(TOGGLE_TIME - BUTTON_TIME); } else { g_lockopen = true; Serial.println("opening lock"); - for (uint8_t i = 0; i < 3; i++) - { - digitalWrite(PIN_OPEN, HIGH); - DelayLEDs(BUTTON_TIME); - digitalWrite(PIN_OPEN, LOW); - DelayLEDs(TOGGLE_TIME - BUTTON_TIME); - } + digitalWrite(PIN_DOORPOWER, HIGH); + digitalWrite(PIN_OPEN, HIGH); + DelayLEDs(BUTTON_TIME); + DelayLEDs(TOGGLE_TIME - BUTTON_TIME); } DelayLEDs(4000); + digitalWrite(PIN_OPEN, LOW); + digitalWrite(PIN_CLOSE, LOW); + digitalWrite(PIN_DOORPOWER, LOW); Serial.println("finished lock action"); } @@ -570,6 +603,15 @@ void loop() Serial.print("iButton authenticated\n"); ToggleLock(); 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 { @@ -592,6 +634,34 @@ void loop() } 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); + } + + } } - + diff --git a/bitlair_doorduino_door/bitlair_doorduino_door.ino b/bitlair_doorduino_door/bitlair_doorduino_door.ino new file mode 100644 index 0000000..1cab59d --- /dev/null +++ b/bitlair_doorduino_door/bitlair_doorduino_door.ino @@ -0,0 +1,145 @@ +#include + +// 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 + +//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"); + } +}