I'm using this motor driver with 2 of these motors to control a skid steer robot. To get the robot to coast to a stop, I use this code:
analogWrite(MotLPWM, 0); //coast to stop
analogWrite(MotRPWM, 0);
digitalWrite(MotL1, HIGH);
digitalWrite(MotL2, HIGH);
digitalWrite(MotR1, HIGH);
digitalWrite(MotR2, HIGH);
to get the robot to hard stop, I use this code:
analogWrite(M1PWM, 0);
analogWrite(M2PWM, 0);
digitalWrite(M1INA, LOW);
digitalWrite(M2INA, LOW);
digitalWrite(M1INB, LOW);
digitalWrite(M2INB, LOW);
I would like for the robot to stop and/or brake with something in between so it isn't so hard on the gears. The following snippet of the whole sketch is supposed to let the motors coast for 1/4 second then hard stop. Unfortunately, it doesn't coast and goes straight to the hard stop. Any ideas how to fix it?
void allStop () {
//COAST
analogWrite(MotLPWM, 0); //coast for 1/4 second before fast stop
analogWrite(MotRPWM, 0);
digitalWrite(MotL1, HIGH);
digitalWrite(MotL2, HIGH);
digitalWrite(MotR1, HIGH);
digitalWrite(MotR2, HIGH);
//HARD STOP
if ((millis() - previousCoastMillis) > 250) {
analogWrite(MotLPWM, 0);
analogWrite(MotRPWM, 0);
digitalWrite(MotL1, LOW);
digitalWrite(MotL2, LOW);
digitalWrite(MotR1, LOW);
digitalWrite(MotR2, LOW);
previousCoastMillis = millis();
}
}
The full sketch is here:
int ledB = 5;
int MotL1 = 8;
int MotL2 = 7;
int MotLPWM = 9;
int MotR1 = 11;
int MotR2 = 12;
int MotRPWM = 10;
unsigned long previousCoastMillis = 0;
const int coastInterval = 500;
void setup() {
pinMode(MotL1, OUTPUT);
pinMode(MotL2, OUTPUT);
pinMode(MotLPWM, OUTPUT);
pinMode(MotR1, OUTPUT);
pinMode(MotR2, OUTPUT);
pinMode(MotRPWM, OUTPUT);
pinMode(ledB, OUTPUT);
}
void loop() {
go();
allStop();
}
void allStop () {
//COAST
analogWrite(MotLPWM, 0); //coast for 1/4 second before fast stop
analogWrite(MotRPWM, 0);
digitalWrite(MotL1, HIGH);
digitalWrite(MotL2, HIGH);
digitalWrite(MotR1, HIGH);
digitalWrite(MotR2, HIGH);
//HARD STOP
if ((millis() - previousCoastMillis) > 250) {
analogWrite(MotLPWM, 0);
analogWrite(MotRPWM, 0);
digitalWrite(MotL1, LOW);
digitalWrite(MotL2, LOW);
digitalWrite(MotR1, LOW);
digitalWrite(MotR2, LOW);
previousCoastMillis = millis();
}
}
void go () {
analogWrite(MotLPWM, 150);
analogWrite(MotRPWM, 150);
digitalWrite(MotL1, HIGH);
digitalWrite(MotL2, LOW);
digitalWrite(MotR1, HIGH);
digitalWrite(MotR2, LOW);
digitalWrite(ledB, HIGH);
delay(1000);
}