Hi,
I made a basic (probably not the most efficient) program to control a robot from my keyboard using the serial monitor. But would it be possible to set the speed of the robot by writting a number, or a keyword followed by a number? I have no idea how I could make this. (Just to be clear, I'm using a DFRobot motor shield and I'm using PWM to control speed).
Here is my program:
int val; //Place to store the variable.
int MR = 4; //Motor Right.
int ML = 7; //Motor Left.
int MRs = 5; //Motor Right speed (PWM).
int MLs = 6; //Motor Left speed (PWM).
int fwd = LOW; //Motor direction, forward.
int bck = HIGH; //Motor direction, backward.
int VAL;
int Speed; //Set the motors speed.
int step1;
int stepT1;
int step2;
int stepT2;
int TurnStepspeed;
int TurnSteptime;
void setup(){
pinMode(4, OUTPUT); //Setting pins 4 to 7 as OUTPUTS.
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.begin(9600); //Starts serial communication.
}
void loop(){
val = Serial.read(); //val value.
Speed = 255;
step1 = 100; //Set Step 1 speed.
stepT1 = 50; //Set Step 1 time (millis).
step2 = 200; //Set Step 2 speed.
stepT2 = 100; //Set Step 2 time (millis).
TurnStepspeed = 100; //Set the turning first step speed.
TurnSteptime = 100; //Set the turnig first step time (millis).
switch(val){
case 'w': //Go forward.
digitalWrite(ML, fwd); //Left motor direction settings.
digitalWrite(MR, fwd); //Right motor direction settings.
analogWrite(MRs, (step1)); //Smooth start Step 1.
analogWrite(MLs, (step1));
delay(stepT1); //Time of the step 1.
analogWrite(MRs, (step2)); //Smooth start Step 2.
analogWrite(MLs, (step2));
delay(stepT2); //Time of the step 2.
analogWrite(MRs, Speed); //Full speed.
analogWrite(MLs, Speed); //Full speed.
break;
case ' ': //STOP.
digitalWrite(ML, fwd);
digitalWrite(MR, fwd);
analogWrite(MRs, 0);
analogWrite(MLs, 0);
break;
case 's': //Go backward.
digitalWrite(ML, bck);
digitalWrite(MR, bck);
analogWrite(MRs, (step1));
analogWrite(MLs, (step1));
delay(stepT1);
analogWrite(MRs, (step2));
analogWrite(MLs, (step2));
delay(stepT2);
analogWrite(MRs, Speed);
analogWrite(MLs, Speed);
break;
case 'd': //Go right.
digitalWrite(ML, fwd);
digitalWrite(MR, bck);
analogWrite(MRs, TurnStepspeed);
analogWrite(MLs, TurnStepspeed);
delay(TurnSteptime);
analogWrite(MRs, (Speed));
analogWrite(MLs, (Speed));
break;
case 'a': //Go left.
digitalWrite(ML, bck);
digitalWrite(MR, fwd);
analogWrite(MRs, 150);
analogWrite(MLs, 150);
delay(TurnSteptime);
analogWrite(MRs, (Speed));
analogWrite(MLs, (Speed));
break;
case 'e': //Go right and forward.
digitalWrite(ML, fwd);
digitalWrite(MR, fwd);
analogWrite(MRs, (step1));
analogWrite(MLs, (step1));
delay(stepT1);
analogWrite(MRs, (step2));
analogWrite(MLs, (step2));
delay(stepT2);
analogWrite(MRs, (Speed-50));
analogWrite(MLs, Speed);
break;
case 'q': //Go left and forward.
digitalWrite(ML, fwd);
digitalWrite(MR, fwd);
analogWrite(MRs, (step1));
analogWrite(MLs, (step1));
delay(stepT1);
analogWrite(MRs, (step2));
analogWrite(MLs, (step2));
delay(stepT2);
analogWrite(MRs, Speed);
analogWrite(MLs, (Speed-50));
break;
}
}
Thanks!