Version 1
Unfortunately this version was not powerful enough. It used a uni-polar geared down motor which was not capable of lifting the door.
This commit is contained in:
parent
ff411c8de7
commit
dfede8a0c6
0
README.org
Normal file
0
README.org
Normal file
233
chicken-door.ino
Executable file
233
chicken-door.ino
Executable file
@ -0,0 +1,233 @@
|
||||
#include <Stepper.h>
|
||||
|
||||
// LED Values
|
||||
const int ledPin = 13;
|
||||
|
||||
// Stepper and Solenoid mosfet
|
||||
const int mosPin = 4;
|
||||
|
||||
// Stepper Values
|
||||
const int stepsPerRevolution = 513;
|
||||
const int coilA1Pin = 11;
|
||||
const int coilA2Pin = 9;
|
||||
const int coilB1Pin = 7;
|
||||
const int coilB2Pin = 10;
|
||||
Stepper doorStepper = Stepper(stepsPerRevolution, coilA1Pin, coilA2Pin, coilB1Pin, coilB2Pin);
|
||||
|
||||
// Solenoid Values
|
||||
const int solPin = 1;
|
||||
|
||||
// Light Meter Values
|
||||
const int lightPin = A3;
|
||||
const int doorOpenThreshold = 350;
|
||||
const int doorCloseThreshold = 325;
|
||||
const long doorCloseDelay = 10 * 1000L; // 60 seconds // TODO
|
||||
int lightValue = 0;
|
||||
|
||||
// Switches
|
||||
const int doorOpenSwitch = A2;
|
||||
const int doorCloseSwitch = A1;
|
||||
|
||||
// Door States
|
||||
const int doorOpen = 1;
|
||||
const int doorClosed = 2;
|
||||
const int doorPreClose = 3;
|
||||
const int doorUnknown = 4;
|
||||
const int doorJammed = 5; // took too long to gravity close
|
||||
const int doorJamCleared = 6;
|
||||
const int expectedDoorCloseDurationMilli = 10 * 1000L; // 10 seconds
|
||||
//const unsigned long minDoorOpenDuration = 8 * 60 * 60 * 1000L; // 8 hours
|
||||
const unsigned long minDoorOpenDuration = 60 * 1000L; // TODO
|
||||
|
||||
const bool debug = true;
|
||||
const int sec = 1000;
|
||||
|
||||
class Door {
|
||||
int doorState;
|
||||
unsigned long doorPreCloseMillis;
|
||||
unsigned long doorLastOpenMillis;
|
||||
|
||||
public:
|
||||
Door() {
|
||||
doorState = doorUnknown;
|
||||
doorPreCloseMillis = 0;
|
||||
doorLastOpenMillis = 0;
|
||||
}
|
||||
|
||||
void Update() {
|
||||
int lightValue = analogRead(lightPin);
|
||||
if (debug) {
|
||||
Serial.print("Light level: ");
|
||||
Serial.println(lightValue);
|
||||
}
|
||||
|
||||
if (doorState == doorJammed || doorState == doorUnknown) {
|
||||
Open();
|
||||
}
|
||||
|
||||
if (lightValue > doorOpenThreshold) {
|
||||
Open();
|
||||
} else if (lightValue < doorCloseThreshold) {
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
void Open() {
|
||||
if (doorState == doorOpen && digitalRead(doorOpenSwitch) == LOW) {
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.println("Going to open the door");
|
||||
|
||||
digitalWrite(mosPin, HIGH); // Enable the motors and solenoid
|
||||
digitalWrite(solPin, HIGH); // Retract the lock
|
||||
|
||||
while(digitalRead(doorOpenSwitch) == HIGH) {
|
||||
doorStepper.step(stepsPerRevolution / 8); // Open the door, 1/8 rotation
|
||||
}
|
||||
|
||||
digitalWrite(solPin, LOW); // Extend the lock
|
||||
delay(sec);
|
||||
digitalWrite(mosPin, LOW); // Disable the motors and solenoid
|
||||
|
||||
Serial.println("Door is open");
|
||||
|
||||
if (doorState == doorJammed) {
|
||||
doorState = doorJamCleared;
|
||||
} else {
|
||||
doorState = doorOpen;
|
||||
doorLastOpenMillis = millis();
|
||||
}
|
||||
}
|
||||
|
||||
void Close() {
|
||||
if (doorState == doorClosed && digitalRead(doorCloseSwitch) == LOW) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((unsigned long)(millis() - doorLastOpenMillis) < minDoorOpenDuration) {
|
||||
Serial.println("Not closing, opened too recently");
|
||||
delay(sec);
|
||||
return;
|
||||
}
|
||||
|
||||
if (doorState == doorOpen || doorState == doorJamCleared) {
|
||||
Serial.println("Entering door pre-close");
|
||||
doorState = doorPreClose;
|
||||
doorPreCloseMillis = millis();
|
||||
}
|
||||
|
||||
if (doorState == doorPreClose) {
|
||||
long elapsed = ((unsigned long)(millis() - doorPreCloseMillis));
|
||||
if (elapsed < doorCloseDelay) {
|
||||
delay(sec);
|
||||
return;
|
||||
}
|
||||
|
||||
// Finished pre-close delay
|
||||
}
|
||||
|
||||
Serial.print("Going to close the door\n");
|
||||
|
||||
// TODO: Add a "last-call" where door is opened briefly after
|
||||
// 5 minutes, then closed again
|
||||
|
||||
digitalWrite(mosPin, HIGH); // Enable the motors and solenoid
|
||||
digitalWrite(solPin, HIGH); // Retract the lock
|
||||
|
||||
unsigned long doorCloseStart = millis();
|
||||
unsigned long interval = expectedDoorCloseDurationMilli * 1.5;
|
||||
while(digitalRead(doorCloseSwitch) == HIGH &&
|
||||
(unsigned long)(millis() - doorCloseStart) < interval) {
|
||||
doorStepper.step(stepsPerRevolution / 8 * -1); // Close the door, 1/8 rotation
|
||||
}
|
||||
|
||||
Serial.print("Door close took ");
|
||||
Serial.print(millis() - doorCloseStart);
|
||||
Serial.println(" millis");
|
||||
|
||||
if (digitalRead(doorCloseSwitch) == HIGH) {
|
||||
Serial.println("Door did not close, likely jammed");
|
||||
doorState = doorJammed;
|
||||
// Do not diable the solenoid or motor jump to update loop to bounce open and closed
|
||||
return;
|
||||
}
|
||||
|
||||
digitalWrite(solPin, LOW); // Extend the lock
|
||||
delay(sec);
|
||||
digitalWrite(mosPin, LOW); // Disable the motors and solenoid
|
||||
|
||||
Serial.println("Door is closed");
|
||||
doorState = doorClosed;
|
||||
}
|
||||
};
|
||||
|
||||
class Flasher {
|
||||
int ledPin; // the number of the LED pin
|
||||
long OnTime; // milliseconds of on-time
|
||||
long OffTime; // milliseconds of off-time
|
||||
|
||||
int ledState; // ledState used to set the LED
|
||||
unsigned long previousMillis; // will store last time LED was updated
|
||||
|
||||
public:
|
||||
Flasher(int pin, long on, long off) {
|
||||
ledPin = pin;
|
||||
pinMode(ledPin, OUTPUT);
|
||||
|
||||
OnTime = on;
|
||||
OffTime = off;
|
||||
|
||||
ledState = LOW;
|
||||
previousMillis = 0;
|
||||
}
|
||||
|
||||
void Update() {
|
||||
// check to see if it's time to change the state of the LED
|
||||
unsigned long currentMillis = millis();
|
||||
|
||||
if((ledState == HIGH) && ((unsigned long)(currentMillis - previousMillis) >= OnTime)) {
|
||||
ledState = LOW; // Turn it off
|
||||
previousMillis = currentMillis; // Remember the time
|
||||
digitalWrite(ledPin, ledState); // Update the actual LED
|
||||
} else if ((ledState == LOW) && ((unsigned long)(currentMillis - previousMillis) >= OffTime)) {
|
||||
ledState = HIGH; // turn it on
|
||||
previousMillis = currentMillis; // Remember the time
|
||||
digitalWrite(ledPin, ledState); // Update the actual LED
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// the setup function runs once when you press reset or power the board
|
||||
void setup() {
|
||||
pinMode(ledPin, OUTPUT);
|
||||
|
||||
// initialize stepper pins
|
||||
pinMode(coilA1Pin, OUTPUT);
|
||||
pinMode(coilA2Pin, OUTPUT);
|
||||
pinMode(coilB1Pin, OUTPUT);
|
||||
pinMode(coilB2Pin, OUTPUT);
|
||||
doorStepper.setSpeed(20);
|
||||
|
||||
// initialize pins
|
||||
pinMode(solPin, OUTPUT);
|
||||
pinMode(mosPin, OUTPUT);
|
||||
pinMode(doorOpenSwitch, INPUT_PULLUP);
|
||||
pinMode(doorCloseSwitch, INPUT_PULLUP);
|
||||
|
||||
//Initiate Serial communication
|
||||
if (debug) {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
}
|
||||
|
||||
Flasher led = Flasher(ledPin, 500, 500);
|
||||
Door door = Door();
|
||||
|
||||
// loop runs forever
|
||||
void loop() {
|
||||
led.Update();
|
||||
door.Update();
|
||||
|
||||
delay(500);
|
||||
}
|
BIN
circuitry/ChickenDoor.fzz
Executable file
BIN
circuitry/ChickenDoor.fzz
Executable file
Binary file not shown.
0
circuitry/parts-list.org
Normal file
0
circuitry/parts-list.org
Normal file
BIN
motor-mount/._chicken-door.svg
Executable file
BIN
motor-mount/._chicken-door.svg
Executable file
Binary file not shown.
15534
motor-mount/chicken-door.dxf
Executable file
15534
motor-mount/chicken-door.dxf
Executable file
File diff suppressed because it is too large
Load Diff
279
motor-mount/chicken-door.svg
Executable file
279
motor-mount/chicken-door.svg
Executable file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 166 KiB |
Reference in New Issue
Block a user