Skip to content

Commit 909dd3b

Browse files
Update to new hardware with custom door lock hardware
1 parent 7db14de commit 909dd3b

File tree

2 files changed

+234
-19
lines changed

2 files changed

+234
-19
lines changed

bitlair_doorduino/bitlair_doorduino.ino

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,37 @@
77
#include "Entropy.h"
88
#include "sha1.h"
99

10-
#define PIN_HORN 6
11-
#define PIN_OPEN 5
12-
#define PIN_CLOSE 4
10+
11+
#include <Arduino.h>
12+
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
13+
#define MOTOR_STEPS 100
14+
#define RPM 120
15+
#define DIR A0
16+
#define STEP 9
17+
#include "A4988.h"
18+
A4988 stepper(MOTOR_STEPS, DIR, STEP);
19+
20+
#define INPUT_SOLENOID 4
21+
#define INPUT_HORN 3
22+
#define PIN_LEDSOLENOID 6
23+
#define PIN_LEDHORN 5
24+
bool StateSolenoid = false;
25+
bool StateHorn = false;
26+
uint32_t SolenoidStartTime;
27+
28+
29+
30+
#define PIN_DOORPOWER A3
31+
#define PIN_SOLENOID A5
32+
#define PIN_HORN A4
33+
#define PIN_OPEN 8
34+
#define PIN_CLOSE 7
1335

1436
#define PIN_1WIRE 13
1537
#define PIN_LEDGREEN 10
1638
#define PIN_LEDRED 11
1739

18-
#define PIN_MAINS_POWER 9
40+
#define PIN_MAINS_POWER A2
1941

2042
#define CMD_BUFSIZE 64
2143
#define CMD_TIMEOUT 10000 //command timeout in milliseconds
@@ -145,6 +167,16 @@ void setup()
145167
Serial.begin(115200);
146168
Serial.println("DEBUG: Board started");
147169

170+
stepper.begin(RPM);
171+
stepper.enable();
172+
stepper.setMicrostep(1); // Set microstep mode to 1:1
173+
174+
pinMode(INPUT_SOLENOID, INPUT_PULLUP);
175+
pinMode(INPUT_HORN, INPUT_PULLUP);
176+
pinMode(PIN_LEDSOLENOID, OUTPUT);
177+
pinMode(PIN_LEDHORN, OUTPUT);
178+
pinMode(PIN_DOORPOWER, OUTPUT);
179+
pinMode(PIN_SOLENOID, OUTPUT);
148180
pinMode(PIN_OPEN, OUTPUT);
149181
pinMode(PIN_CLOSE, OUTPUT);
150182
pinMode(PIN_HORN, OUTPUT);
@@ -153,6 +185,10 @@ void setup()
153185
pinMode(PIN_LEDRED, OUTPUT);
154186
pinMode(PIN_MAINS_POWER, INPUT);
155187

188+
digitalWrite(PIN_OPEN, LOW);
189+
digitalWrite(PIN_CLOSE, LOW);
190+
digitalWrite(PIN_DOORPOWER, LOW);
191+
156192
SetLEDState(LEDState_Off);
157193

158194
Entropy.initialize();
@@ -501,28 +537,25 @@ void ToggleLock()
501537
{
502538
g_lockopen = false;
503539
Serial.println("closing lock");
504-
for (uint8_t i = 0; i < 3; i++)
505-
{
506-
digitalWrite(PIN_CLOSE, HIGH);
507-
DelayLEDs(BUTTON_TIME);
508-
digitalWrite(PIN_CLOSE, LOW);
509-
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
510-
}
540+
digitalWrite(PIN_DOORPOWER, HIGH);
541+
digitalWrite(PIN_CLOSE, HIGH);
542+
DelayLEDs(BUTTON_TIME);
543+
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
511544
}
512545
else
513546
{
514547
g_lockopen = true;
515548
Serial.println("opening lock");
516-
for (uint8_t i = 0; i < 3; i++)
517-
{
518-
digitalWrite(PIN_OPEN, HIGH);
519-
DelayLEDs(BUTTON_TIME);
520-
digitalWrite(PIN_OPEN, LOW);
521-
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
522-
}
549+
digitalWrite(PIN_DOORPOWER, HIGH);
550+
digitalWrite(PIN_OPEN, HIGH);
551+
DelayLEDs(BUTTON_TIME);
552+
DelayLEDs(TOGGLE_TIME - BUTTON_TIME);
523553
}
524554

525555
DelayLEDs(4000);
556+
digitalWrite(PIN_OPEN, LOW);
557+
digitalWrite(PIN_CLOSE, LOW);
558+
digitalWrite(PIN_DOORPOWER, LOW);
526559

527560
Serial.println("finished lock action");
528561
}
@@ -570,6 +603,15 @@ void loop()
570603
Serial.print("iButton authenticated\n");
571604
ToggleLock();
572605
deniedcount = 0;
606+
607+
if(g_lockopen == true){
608+
StateSolenoid = true;
609+
SolenoidStartTime = millis();
610+
Serial.print("Solenoid activated\n");
611+
digitalWrite(PIN_SOLENOID, HIGH);
612+
stepper.move(MOTOR_STEPS*(RPM/60)*10);
613+
}
614+
573615
}
574616
else
575617
{
@@ -592,6 +634,34 @@ void loop()
592634
}
593635

594636
ProcessLEDs();
637+
638+
digitalWrite(PIN_LEDSOLENOID, HIGH);
639+
digitalWrite(PIN_LEDHORN, HIGH);
640+
if (digitalRead(INPUT_SOLENOID) == LOW) {
641+
if(StateSolenoid == false){
642+
StateSolenoid = true;
643+
SolenoidStartTime = millis();
644+
Serial.print("Solenoid activated\n");
645+
digitalWrite(PIN_SOLENOID, HIGH);
646+
stepper.move(MOTOR_STEPS*(RPM/60)*10);
647+
}
648+
}
649+
if(StateSolenoid == true && ((millis() - SolenoidStartTime) > (10*1000)) ){
650+
digitalWrite(PIN_SOLENOID, LOW);
651+
StateSolenoid = false;
652+
}
653+
if (digitalRead(INPUT_HORN) == LOW) {
654+
if(StateHorn == false){
655+
StateHorn = true;
656+
Serial.print("Horn activated\n");
657+
digitalWrite(PIN_HORN, HIGH);
658+
}
659+
}else{
660+
StateHorn = false;
661+
digitalWrite(PIN_HORN, LOW);
662+
}
663+
664+
595665
}
596666
}
597-
667+
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#include <Arduino.h>
2+
3+
// this pin should connect to Ground when want to stop the motor
4+
#define STOPPER_PIN 4
5+
6+
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
7+
#define MOTOR_STEPS 400
8+
#define RPM 60
9+
// Acceleration and deceleration values are always in FULL steps / s^2
10+
#define MOTOR_ACCEL 2000
11+
#define MOTOR_DECEL 1000
12+
13+
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
14+
#define MICROSTEPS 8
15+
16+
#define DIR 10
17+
#define STEP 11
18+
#define ENABLE A3 // optional (just delete ENABLE from everywhere if not used)
19+
20+
#define SLEEP 12
21+
#define RESET 13
22+
23+
#include "A4988.h"
24+
#define MS1 A2
25+
#define MS2 A1
26+
#define MS3 A0
27+
A4988 stepper(MOTOR_STEPS, DIR, STEP, ENABLE, MS1, MS2, MS3);
28+
29+
30+
#include <ams_as5048b.h>
31+
32+
//unit consts
33+
#define U_RAW 1
34+
#define U_TRN 2
35+
#define U_DEG 3
36+
#define U_RAD 4
37+
#define U_GRAD 5
38+
#define U_MOA 6
39+
#define U_SOA 7
40+
#define U_MILNATO 8
41+
#define U_MILSE 9
42+
#define U_MILRU 10
43+
44+
AMS_AS5048B mysensor;
45+
46+
47+
#define DOOR_OPEN 3
48+
#define DOOR_CLOSE 2
49+
50+
#define STATE_IDLE 0
51+
#define STATE_OPEN 1
52+
#define STATE_CLOSE 2
53+
int state = STATE_IDLE;
54+
int angle_prev = 0;
55+
int angle = 0;
56+
int angle_steps = 0;
57+
58+
void setup() {
59+
Serial.begin(115200);
60+
61+
pinMode(SLEEP, OUTPUT);
62+
pinMode(RESET, OUTPUT);
63+
digitalWrite(SLEEP, HIGH);
64+
digitalWrite(RESET, HIGH);
65+
66+
// Configure stopper pin to read HIGH unless grounded
67+
pinMode(STOPPER_PIN, INPUT_PULLUP);
68+
69+
stepper.begin(RPM, MICROSTEPS);
70+
stepper.disable();
71+
72+
//stepper.setSpeedProfile(stepper.LINEAR_SPEED, MOTOR_ACCEL, MOTOR_DECEL);
73+
stepper.setSpeedProfile(stepper.CONSTANT_SPEED, MOTOR_ACCEL, MOTOR_DECEL);
74+
75+
//init AMS_AS5048B object
76+
mysensor.begin();
77+
78+
pinMode(DOOR_OPEN, INPUT);
79+
pinMode(DOOR_CLOSE, INPUT);
80+
81+
Serial.println("START");
82+
83+
stepper.setEnableActiveState(LOW);
84+
// stepper.enable();
85+
// stepper.rotate(360);
86+
// Serial.println("START2");
87+
88+
if (digitalRead(DOOR_OPEN) == HIGH && state == STATE_IDLE){
89+
state = STATE_OPEN;
90+
Serial.println("RECEIVED OPEN");
91+
stepper.enable();
92+
stepper.startRotate(-560);
93+
}
94+
if (digitalRead(DOOR_CLOSE) == HIGH && state == STATE_IDLE){
95+
state = STATE_CLOSE;
96+
Serial.println("RECEIVED CLOSE");
97+
stepper.enable();
98+
stepper.startRotate(560);
99+
}
100+
101+
}
102+
103+
void loop() {
104+
static int step = 0;
105+
106+
if(state != STATE_IDLE && millis()%50 == 0){
107+
angle_prev = angle;
108+
angle = mysensor.angleR(U_DEG, true);
109+
angle_steps++;
110+
Serial.print("Time : ");
111+
Serial.print(millis(), DEC);
112+
Serial.print(" Angle : ");
113+
Serial.print(angle, DEC);
114+
Serial.print(" angle prev : ");
115+
Serial.println(angle_prev, DEC);
116+
117+
if(angle_steps > 5 && (angle_prev - angle) >= -5 && (angle_prev - angle) <= 5){
118+
Serial.println("STOPPER REACHED");
119+
stepper.stop();
120+
stepper.disable();
121+
122+
state = STATE_IDLE;
123+
step = 0;
124+
angle_steps = 0;
125+
delay(10000);
126+
Serial.println("FINISHED");
127+
}
128+
}
129+
130+
// motor control loop - send pulse and return how long to wait until next pulse
131+
unsigned wait_time = stepper.nextAction();
132+
// Serial.println(wait_time);
133+
step++;
134+
135+
// 0 wait time indicates the motor has stopped
136+
if (state != STATE_IDLE && wait_time <= 0) {
137+
stepper.disable(); // comment out to keep motor powered
138+
Serial.println("END");
139+
state = STATE_IDLE;
140+
step = 0;
141+
angle_steps = 0;
142+
delay(10000);
143+
Serial.println("FINISHED");
144+
}
145+
}

0 commit comments

Comments
 (0)