Hello,
I'm building an autonomous robot that can go in a straight line on a synthetic floor for a determined distance, in this case 30m. This is what I'm using:
- 2 magnetic encoders, pololu 12 CPR, #1523
- 2 dc motors 6v, 120:1, pololu mini plastic gearmotor, #1516
- 1 Arduino Yùn
- 2 60mm diameter wheels
And here is the code:
const int drive_distance = 3000;
const int motor_power = 220;
const int motor_offset = 5;
const int wheel_d = 60;
const float wheel_c = PI * wheel_d;
const int counts_per_rev = 1444;
const int enc_l_pin = 2;
const int enc_r_pin = 3;
const int ain1_pin = 11;
const int ain2_pin = 10;
const int bin1_pin = 5;
const int bin2_pin = 6;
volatile unsigned long enc_l = 0;
volatile unsigned long enc_r = 0;
void setup() {
Serial.begin(115200);
pinMode(enc_l_pin, INPUT_PULLUP);
pinMode(enc_r_pin, INPUT_PULLUP);
pinMode(ain1_pin, OUTPUT);
pinMode(ain2_pin, OUTPUT);
pinMode(bin1_pin, OUTPUT);
pinMode(bin2_pin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(enc_l_pin), countLeft, CHANGE);
attachInterrupt(digitalPinToInterrupt(enc_r_pin), countRight, CHANGE);
delay(1000);
driveStraight(drive_distance, motor_power);
}
void loop() {
// Do nothing
}
void driveStraight(float dist, int power) {
unsigned long num_ticks_l;
unsigned long num_ticks_r;
int power_l = motor_power;
int power_r = motor_power;
unsigned long diff_l;
unsigned long diff_r;
enc_l = 0;
enc_r = 0;
unsigned long enc_l_prev = enc_l;
unsigned long enc_r_prev = enc_r;
float num_rev = (dist * 10) / wheel_c;
unsigned long target_count = num_rev * counts_per_rev;
Serial.print("Driving for ");
Serial.print(dist);
Serial.print(" cm (");
Serial.print(target_count);
Serial.print(" ticks) at ");
Serial.print(power);
Serial.println(" motor power");
while ( (enc_l < target_count) && (enc_r < target_count) ) {
num_ticks_l = enc_l;
num_ticks_r = enc_r;
Serial.print(num_ticks_l);
Serial.print("\t");
Serial.println(num_ticks_r);
drive(power_l, power_r);
diff_l = num_ticks_l - enc_l_prev;
diff_r = num_ticks_r - enc_r_prev;
enc_l_prev = num_ticks_l;
enc_r_prev = num_ticks_r;
if ( diff_l > diff_r ) {
power_l -= motor_offset;
power_r += motor_offset;
}
if ( diff_l < diff_r ) {
power_l += motor_offset;
power_r -= motor_offset;
}
delay(20);
}
brake();
}
void drive(int power_a, int power_b) {
// Constrain power to between -255 and 255
power_a = constrain(power_a, -255, 255);
power_b = constrain(power_b, -255, 255);
// Left motor direction
if ( power_a < 0 ) {
digitalWrite(ain1_pin, LOW);
digitalWrite(ain2_pin, HIGH);
} else {
digitalWrite(ain1_pin, HIGH);
digitalWrite(ain2_pin, LOW);
}
// Right motor direction
if ( power_b < 0 ) {
digitalWrite(bin1_pin, LOW);
digitalWrite(bin2_pin, HIGH);
} else {
digitalWrite(bin1_pin, HIGH);
digitalWrite(bin2_pin, LOW);
}
// Set speed
}
void brake() {
digitalWrite(ain1_pin, LOW);
digitalWrite(ain2_pin, LOW);
digitalWrite(bin1_pin, LOW);
digitalWrite(bin2_pin, LOW);
}
void countLeft() {
enc_l++;
}
void countRight() {
enc_r++;
}
I have a problem, it still doesn't go straight. I guess it's a problem in the code but I don't know what. Can anyone help me?