Here is a video of the first tests of our remote-controlled robot with 2-wheel drive.
The control for this is based on the calculations we described in an earlier post: https://coderdojoathenry.org/2019/02/24/hackers-how-to-control-a-robots-wheel-motors-based-on-joystick-movements/
Here is the code:
// Code by Luke Madden, CoderDojo Athenry, with some comments added by Michael.
// This code controls a robot with 2-wheel drive, based on movements of a joystick.
// These are the motor H bridge control pins
#define in1 8
#define in2 9
#define in3 10
#define in4 11
// These hold values read from channels of the LemonRX receiver
int ch1;
int ch2; // not currently used
int ch3;
// These are the min and max values we read on each channel when we move the joystick
int joymin = 950;
int joymax = 1950;
// X and Y are joystick values in range -1 to +1
float X;
float Y;
// M1 and M2 are values for Motors 1 and 2, in range -1 to +1
int M1;
int M2;
void setup() {
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
Serial.begin(9600);
}
void loop() {
// read pulse width values from each channel of lemonRX
ch1 = pulseIn(5, HIGH, 25000);
ch2 = pulseIn(6, HIGH, 25000);
ch3 = pulseIn(7, HIGH, 25000);
// Convert them to floats in range -1 to 1: map uses int, so set it to int in range -1000 to 1000 and then divide by 1000.0
X = map(ch1, joymin, joymax, -1000, 1000)/1000.0;
Y = map(ch3, joymin, joymax, -1000, 1000)/-1000.0;
// This is the fomula for how much power to send to each motor
// Motor values should be in range -255 to 255, not -1 to 1, so multiply by 255
M1 = (X + Y) * 255;
M2 = (X - Y) * 255;
// Our fomula can end up with values greater than 255, so constrain them to this range
M1 = constrain(M1, -255, 255);
M2 = constrain(M2, -255, 255);
// Call our function to actually drive the motors
drive(M1,M2);
// print out for debugging
Serial.print("Channels: C1=\t"); // Print the value of
Serial.print(ch1); // each channel
Serial.print("\t M1=\t");
Serial.print(M1);
Serial.print("\t M2=\t");
Serial.print(M2);
Serial.print("\t C3:\t");
Serial.println(ch3);
// this delay seems to help reading joystick
delay(300);
}
void drive(int M1, int M2) {
// drive both motors at speeds M1, M2 in range -255, 255
if (M1 > 0) {
analogWrite(in1, M1);
analogWrite(in2, 0);
}
else {
analogWrite(in1, 0);
analogWrite(in2, -M1);
}
if (M2 > 0) {
analogWrite(in3, M2);
analogWrite(in4, 0);
}
else {
analogWrite(in3, 0);
analogWrite(in4, -M2);
}
}