I have a little project going on. Was going fine but then I came up with the problem. I should be able to record PWM duty level right before STOP button was pressed. And then continue the same duty level when left or right button is pressed. Code works so far.
Could somebody help me?
Here is my code:
//cuttingmachine
// board PIC32MZ
// motordriver cytron MD10C R3
// motor from ebay JGY-371
int switchPin1 = 11;
int switchPin2 = 12;
int switchPin3 = 10;
int MotorPWM = 3;
int MotorDIR = 4;
int Leftbutton = 6;
int Rightbutton = 7;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean lastButton2 = HIGH;
boolean currentButton2 = HIGH;
int MotorPWMlevel = 0;
int buttonState = 1;
int buttonState2 = 1;
int buttonState3 = 1;
void setup()
{
pinMode(switchPin1, INPUT_PULLUP); // speed +
pinMode(switchPin2, INPUT_PULLUP); //speed -
pinMode(switchPin3, INPUT_PULLUP); //stop
pinMode(MotorPWM, OUTPUT); // output to cytron md10c R3 pwm pin
pinMode(MotorDIR, OUTPUT); // output to cytron md10c R3 dir pin
pinMode(Leftbutton, INPUT_PULLUP); // rotation direction pin
pinMode(Rightbutton, INPUT_PULLUP); //rotation direction pin
}
boolean debounce(boolean last) //speed up
{
boolean current = digitalRead(switchPin1);
if (last != current)
{
delay(5);
current = digitalRead(switchPin1);
}
return current;
}
boolean debounce2(boolean last2) // speed down
{
boolean current2 = digitalRead(switchPin2);
if (last2 != current2)
{
delay(5);
current2 = digitalRead(switchPin2);
}
return current2;
}
void loop()
{
{
currentButton = debounce(lastButton); //speed up
if (lastButton == HIGH && currentButton == LOW)
{
MotorPWMlevel = MotorPWMlevel + 10;
}
lastButton = currentButton;
// if (MotorPWMlevel > 255) MotorPWMlevel = 0;
analogWrite(MotorPWM, MotorPWMlevel);
}
{
currentButton2 = debounce2(lastButton2); // speed down
if (lastButton2 == HIGH && currentButton2 == LOW)
{
MotorPWMlevel = MotorPWMlevel - 10;
}
lastButton2 = currentButton2;
//if (MotorPWMlevel > 0) MotorPWMlevel = 255;
analogWrite(MotorPWM, MotorPWMlevel);
}
buttonState = digitalRead(switchPin3); //stop
if (buttonState == LOW) {
MotorPWMlevel = MotorPWMlevel = 0;
digitalWrite(MotorPWM, MotorPWMlevel );
}
buttonState2 = digitalRead(Leftbutton); // rotation left
if (buttonState2 == LOW) {
digitalWrite(MotorDIR, HIGH );
delay(500);
}
buttonState3 = digitalRead(Rightbutton); // rotation right
if (buttonState3 == LOW) {
digitalWrite(MotorDIR, LOW );
delay(500);
}
}
In your stop routine, right before you assign the speed to 0, save a copy to a new global variable and then apply it when you detect the left or right button
//cuttingmachine
// board PIC32MZ
// motordriver cytron MD10C R3
// motor from ebay JGY-371
const int switchPin1 = 11;
const int switchPin2 = 12;
const int switchPin3 = 10;
const int MotorPWM = 3;
const int MotorDIR = 4;
const int Leftbutton = 6;
const int Rightbutton = 7;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean lastButton2 = HIGH;
boolean currentButton2 = HIGH;
byte MotorPWMlevel = 0;
byte PreviousMotorPWMlevel;
int buttonState = 1;
int buttonState2 = 1;
int buttonState3 = 1;
void setup()
{
pinMode(switchPin1, INPUT_PULLUP); // speed +
pinMode(switchPin2, INPUT_PULLUP); //speed -
pinMode(switchPin3, INPUT_PULLUP); //stop
pinMode(MotorPWM, OUTPUT); // output to cytron md10c R3 pwm pin
pinMode(MotorDIR, OUTPUT); // output to cytron md10c R3 dir pin
pinMode(Leftbutton, INPUT_PULLUP); // rotation direction pin
pinMode(Rightbutton, INPUT_PULLUP); //rotation direction pin
}
boolean debounce(boolean last) //speed up
{
boolean current = digitalRead(switchPin1);
if (last != current)
{
delay(5);
current = digitalRead(switchPin1);
}
return current;
}
boolean debounce2(boolean last2) // speed down
{
boolean current2 = digitalRead(switchPin2);
if (last2 != current2)
{
delay(5);
current2 = digitalRead(switchPin2);
}
return current2;
}
void loop()
{
{
currentButton = debounce(lastButton); //speed up
if (lastButton == HIGH && currentButton == LOW)
{
MotorPWMlevel = MotorPWMlevel + 10;
}
lastButton = currentButton;
// if (MotorPWMlevel > 255) MotorPWMlevel = 0;
analogWrite(MotorPWM, MotorPWMlevel);
}
currentButton2 = debounce2(lastButton2); // speed down
if (lastButton2 == HIGH && currentButton2 == LOW)
{
MotorPWMlevel = MotorPWMlevel - 10;
}
lastButton2 = currentButton2;
//if (MotorPWMlevel > 0) MotorPWMlevel = 255;
analogWrite(MotorPWM, MotorPWMlevel);
buttonState = digitalRead(switchPin3); //stop
if (buttonState == LOW) {
PreviousMotorPWMlevel = MotorPWMlevel;
MotorPWMlevel = 0;
digitalWrite(MotorPWM, MotorPWMlevel );
}
buttonState2 = digitalRead(Leftbutton); // rotation left
if (buttonState2 == LOW) {
digitalWrite(MotorDIR, HIGH );
MotorPWMlevel = PreviousMotorPWMlevel;
analogWrite(MotorPWM, MotorPWMlevel);
delay(500);
}
buttonState3 = digitalRead(Rightbutton); // rotation right
if (buttonState3 == LOW) {
digitalWrite(MotorDIR, LOW );
MotorPWMlevel = PreviousMotorPWMlevel;
analogWrite(MotorPWM, MotorPWMlevel);
delay(500);
}
}
You already have the PWM value saved in 'MotorPWMLevel'. There is no need to set it to 0 when the stop button is pressed. If you move the 'analogWrite(MotorPWM, MotorPWMlevel)' lines from the speed setting buttons to the Left and Right buttons the motor will go back to the set speed when you set a direction.
void loop()
{
{
currentButton = debounce(lastButton); //speed up
if (lastButton == HIGH && currentButton == LOW)
{
MotorPWMlevel += 10;
if (MotorPWMlevel > 255)
MotorPWMlevel = 255;
}
lastButton = currentButton;
}
{
currentButton2 = debounce2(lastButton2); // speed down
if (lastButton2 == HIGH && currentButton2 == LOW)
{
MotorPWMlevel -= 10;
if (MotorPWMlevel < 0)
MotorPWMlevel = 0;
}
lastButton2 = currentButton2;
}
buttonState = digitalRead(switchPin3); //stop
if (buttonState == LOW)
{
analogWrite(MotorPWM, 0);
}
buttonState2 = digitalRead(Leftbutton); // rotation left
if (buttonState2 == LOW)
{
analogWrite(MotorPWM, MotorPWMlevel);
digitalWrite(MotorDIR, HIGH );
delay(500);
}
buttonState3 = digitalRead(Rightbutton); // rotation right
if (buttonState3 == LOW)
{
analogWrite(MotorPWM, MotorPWMlevel);
digitalWrite(MotorDIR, LOW );
delay(500);
}
}