Hi to all,
I'm using Arduino UNO in order to control a tracked skid steering vehicle which has two hydraulic motors.
I'm using a Futaba RC transmitter and, for the moment, I'm able to make the vehicle move forward/backward if I move stick #1 and to turn on the right or on the left if I use stick #2.
At the moment, I cannot move both sticks at the same time and so I'm forced to choose between driving straight or steering.
I would like to be able to mix both sticks in order to make the vehicle to move more smoothly.
I think I should consider stick #1 as throttle and stick #2 as steering and then mix the values coming from both sticks and compute how much each motor should spin.
Can you have any ideas on how to do this?
Can you help me, please?
The most important aspect is this:
Timer1.pwm(9, PWM); // SET PWM FOR SX VALVE
Timer1.pwm(10, PWM); // SET PWM FOR DX VALVE
I need to set the PWM for the proportional valves (pins 9 and 10) depending on the velocity for each motor.
This is the code I'm using:
if ((ch1 > 1520) && (ch1 < 1926) && (ch2 > 1489) && (ch2 < 1521) ){
Serial.println("LEFT");
ch1 = map(ch1, 1520, 1914, 0, 1023);
ch1 = constrain(ch1, 0, 1023);
if (ch1 > 0){
digitalWrite(A0, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A3, HIGH);
digitalWrite(A5, LOW);
delay(50);
Timer1.pwm(9, ch1-30); // SET PWM FOR SX VALVE
Timer1.pwm(10, ch1); // SET PWM FOR DX VALVE
}
else {
Serial.println("STOP");
Timer1.pwm(9, 0); // TURN OFF PWM FOR SX VALVE
Timer1.pwm(10, 0); // TURN OFF PWM FOR DX VALVE
delay(50);
digitalWrite(A0, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, LOW);
}
}
else if ((ch1 < 1490) && (ch1 > 1095) && (ch2 > 1489) && (ch2 < 1521) ){
Serial.println("RIGHT");
ch1 = map(ch1, 1103, 1500, 1023, 0);
ch1 = constrain(ch1, 0, 1023);
if (ch1 > 0){
digitalWrite(A0, LOW);
digitalWrite(A2, HIGH);
digitalWrite(A3, LOW);
digitalWrite(A5, HIGH);
delay(50);
Timer1.pwm(9, ch1-30); // SET PWM FOR SX VALVE
Timer1.pwm(10, ch1); // SET PWM FOR DX VALVE
}
else {
Serial.println("STOP");
Timer1.pwm(9, 0); // TURN OFF PWM FOR SX VALVE
Timer1.pwm(10, 0); // TURN OFF PWM FOR DX VALVE
delay(50);
digitalWrite(A0, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, LOW);
}
}
else if ((ch2 > 1520) && (ch2 < 1926) && (ch1 > 1491) && (ch1 < 1519)){
Serial.println("BACKWARD");
ch2 = map(ch2, 1520, 1918, 0, 1023);
ch2 = constrain(ch2, 0, 1023);
if (ch2 > 0){
digitalWrite(A0, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, HIGH);
delay(50);
Timer1.pwm(9, ch2-30); // SET PWM FOR SX VALVE
Timer1.pwm(10, ch2); // SET PWM FOR DX VALVE
}
else {
Serial.println("STOP");
Timer1.pwm(9, 0); // TURN OFF PWM FOR SX VALVE
Timer1.pwm(10, 0); // TURN OFF PWM FOR DX VALVE
delay(50);
digitalWrite(A0, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, LOW);
}
}
else if ( (ch2 < 1490) && (ch2 > 1095) && (ch1 > 1491) && (ch1 < 1519)){
Serial.println("FORWARD");
ch2 = map(ch2, 1103, 1500, 1023, 0);
ch2 = constrain(ch2, 0, 1023);
if (ch2 > 5){
digitalWrite(A0, LOW);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A5, LOW);
delay(50);
Timer1.pwm(9, ch2-30); // SET PWM FOR SX VALVE
Timer1.pwm(10, ch2); // SET PWM FOR DX VALVE
}
else {
Serial.print("STOP");
Timer1.pwm(9, 0); // TURN OFF PWM FOR SX VALVE
Timer1.pwm(10, 0); // TURN OFF PWM FOR DX VALVE
delay(50);
digitalWrite(A0, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, LOW);
}
}
else {
Serial.println("----------------------- STOP -----------------------------");
Timer1.pwm(9, 0); // TURN OFF PWM FOR SX VALVE
Timer1.pwm(10, 0); // TURN OFF PWM FOR DX VALVE
delay(50);
digitalWrite(A0, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A5, LOW);
}