// Nikola Šljivić jun 2024
// stepper motor slider with endstops , car dor lock actuator controled with pwm h-bridge
// Connection to the BTS7960 board:
// BTS7960 Pin 1 (RPwm) to Arduino pin 5(Pwm)
// BTS7960 Pin 2 (LPwm) to Arduino pin 6(Pwm)
// BTS7960 Pin 3 (R_EN), 4 (L_EN), 7 (VCC) to Arduino 5V pin
// BTS7960 Pin 8 (GND) to Arduino GND
// BTS7960 Pin 5 (R_IS) and 6 (L_IS) not connected
//int SENSOR_PIN = 0; // center pin of the potentiometer
int UnLockPwm = 3; // Actuator unlock Pwm output pin 5; connect to IBT-2 pin 1 (RPwm)
int LockPwm = 5; // Actuator lock Pwm output pin 6; connect to IBT-2 pin 2 (LPwm)
int StopOpenPin = 4; // Slide open endstop pin
int StopClosePin = 6; // Slide close endstop pin
int StepPin = 7; // Slide open endstop pin
int DirPin = 8; // Slide close endstop pin
int TasterOpenPin = 10 ;// Slide open endstop pin
int TasterClosePin = 9; // Slide close endstop pin
int StartTorque = 200;// *torque is in the range 0 to 255
int HoldTorque = 10;// *torque is in the range 0 to 255
int Speed = 70; // step interval (lower number higher the speed)
int StartTime = 500000; //
unsigned long isPressedSince = 0;
boolean buttonIsPressed = false;
unsigned int cekanje = 1000; //vreme zadržavanja u milisekundama
//koje je potrebno da bi se aktiviralo zaklucavanje
int pwmpinstate = 0;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
int unlock = 0;
int button = TasterClosePin;
boolean OpenCommand = 0; // variable for reading the open switch status
boolean StopOpening = 0; // variable that stops motor when opening
boolean CloseCommand = 0; // variable for reading the close switch status
boolean StopClosing = 0; //variable that stops the motor when closing
//boolean Lockhard = 0;
//boolean Unlockhard = 0;
//boolean Locsoft = 0;
//boolean Unlocksoft = 0;
//boolean Relax = 0;
void setup()
{
pinMode( UnLockPwm, OUTPUT);
pinMode( LockPwm, OUTPUT);
pinMode( StepPin, OUTPUT);
pinMode( DirPin, OUTPUT);
pinMode( StopOpenPin, INPUT);
pinMode( StopClosePin, INPUT);
pinMode( TasterOpenPin, INPUT);
pinMode( TasterClosePin, INPUT);
pinMode(button, INPUT);
Serial.begin(9600);
digitalRead(OpenCommand);
}
void SlideOpen()
{
// turn motor foward:
digitalWrite(DirPin, HIGH); //Writes the direction to the Stepper Driver DIR pin. (HIGH is clockwise).
/*turns the motor 1 step*/
for (int i = 0; i < 1; i++)
digitalWrite(StepPin, HIGH);
delayMicroseconds(Speed);
digitalWrite(StepPin, LOW);
delayMicroseconds(Speed);
}
void SlideClose()
{
// turn motor foward:
digitalWrite(DirPin, LOW); //Writes the direction to the Stepper Driver DIR pin. (HIGH is clockwise).
/*turns the motor 1 step*/
for (int i = 0; i < 1; i++)
digitalWrite(StepPin, HIGH);
delayMicroseconds(Speed);
digitalWrite(StepPin, LOW);
delayMicroseconds(Speed);
}
/**
Stop the motor form moving
*/
void StopSlide() {
digitalWrite(StepPin, LOW);
}
/**
energize actuator in unlock mode
*/
void Unlockhard() {
analogWrite(UnLockPwm, StartTorque);
analogWrite(LockPwm, 0);
delayMicroseconds(StartTime);
}
void Unlocksoft() {
analogWrite(UnLockPwm, HoldTorque);
analogWrite(LockPwm, 0);
delayMicroseconds(StartTime);
}
/**
energize actuator in unlock mode
*/
void Lockhard() {
analogWrite(UnLockPwm, 0);
analogWrite(LockPwm, StartTorque);
delayMicroseconds(StartTime);
}
/**
energize actuator in lock soft mode
*/
void Locksoft() {
analogWrite(UnLockPwm, 0);
analogWrite(LockPwm, HoldTorque);
delayMicroseconds(StartTime);
}
void Relax() {
analogWrite(UnLockPwm, 0);
analogWrite(LockPwm, 0);
delayMicroseconds(StartTime);
}
void loop()
{
// read the state of the input pins value:
OpenCommand = digitalRead(TasterOpenPin);
StopOpening = digitalRead(StopOpenPin);
CloseCommand = digitalRead(TasterClosePin);
StopClosing = digitalRead(StopClosePin);
if (OpenCommand == HIGH && StopClosing == HIGH && StopOpening == LOW)
{
Unlockhard();
delayMicroseconds(StartTime);
SlideOpen();
}
if (OpenCommand == HIGH && StopClosing == LOW && StopOpening == LOW)
{
Unlocksoft();
delayMicroseconds(StartTime);
SlideOpen();
}
if (OpenCommand == HIGH && StopClosing == LOW && StopOpening == HIGH)
{
StopSlide();
}
if (OpenCommand == LOW && StopClosing == LOW && StopOpening == LOW)
{
StopSlide();
delayMicroseconds(StartTime);
Unlocksoft();
}
if (OpenCommand == LOW && StopClosing == HIGH && StopOpening == LOW)
{
StopSlide();
delayMicroseconds(StartTime);
//Locksoft();
Relax();
}
if (CloseCommand == HIGH && StopOpening== HIGH && StopClosing == LOW )
{
Unlockhard();
delayMicroseconds(StartTime);
SlideClose();
}
if(CloseCommand == HIGH && StopOpening == LOW && StopClosing == LOW)
{
Unlocksoft();
delayMicroseconds(StartTime);
SlideClose();
}
if (CloseCommand == HIGH && StopOpening == LOW && StopClosing == HIGH)
{
StopSlide();
Lockhard();
}
if (CloseCommand == LOW && StopClosing == LOW && StopOpening == LOW)
{
StopSlide();
delayMicroseconds(StartTime);
Relax();
}
if (CloseCommand == LOW && StopClosing == LOW && StopOpening == HIGH)
{
StopSlide();
delayMicroseconds(StartTime);
Relax();
}
if (CloseCommand == HIGH && StopClosing == HIGH)
{
Lockhard();
delayMicroseconds(StartTime);
Relax();
}
if (CloseCommand == HIGH && OpenCommand == LOW && StopClosing == HIGH)
{
Lockhard();
delayMicroseconds(StartTime);
Relax();
}
}
void loop1()
{
unsigned long currentMillis = millis();
buttonState = digitalRead(button);
//pwmpinstate = digitalRead(pwmpin);
unlock = digitalRead(OpenCommand);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
isPressedSince = currentMillis;
buttonIsPressed=true;
}
lastButtonState = buttonState;
}
if (buttonState==true && isPressedSince+cekanje < currentMillis){
Serial.println("Zakljucano");
//digitalWrite(pwmpin, HIGH );
isPressedSince = currentMillis;
}}