Ahora tengo un chasis simple con dos ruedas que funcionan con motores de encoder. Conecté Arduino Uno con el chasis e hice un programa simple para simplemente contar el número de señales (en términos simples) de cada uno de los motores del codificador.
Ahora, teóricamente, cuando el chasis se mueve en línea recta, ambas lecturas deberían ser exactamente iguales (lo he comprobado, ¡lo son!). Y cuando un motor es más rápido, cierta lectura debería ser más.
Así que hice un programa simple que mantiene un control de estas lecturas del codificador y cuando la diferencia excede un cierto valor, apaga un motor hasta que los valores no se vuelven iguales y luego lo encienden.
En teoría, el chasis debe ir en línea recta, pero no lo hace y realiza cosas raras. (El código se adjunta a continuación).
Ahora, a veces, el código se atasca en uno de los bucles while. También he jugado mucho con mi código. Por ejemplo, en lugar de while(left_counter != right_counter)
, incluso he hecho while ((left_counter - right_counter) > Certain_Range
El único problema que se me ocurre es que los motores tardan en apagarse y en ese momento las interrupciones están causando estragos. (Soy nuevo en la programación de microcontroladores y demás, aunque tengo mucha experiencia en C ++, etc.)
Por favor, ¿alguien puede explicar por qué este enfoque no funciona para mantener el motor en orden?
Código (Arduino UNO):
int motor_vcc_left = 12; //LEFT TIRE - BLUE
int pull_up_left = 3; //LEFT TIRE - GREEN
int motor_vcc_right = 11; //RIGHT TIRE - ORANGE
int pull_up_right = 2; //RIGHT TIRE - BLUE
int encoder_vcc_pin = 7;
volatile int left_counter = 0;
volatile int right_counter = 0;
void setup() {
pinMode(motor_vcc_left, OUTPUT);
pinMode(motor_vcc_right, OUTPUT);
pinMode(encoder_vcc_pin, OUTPUT);
digitalWrite(encoder_vcc_pin, HIGH);
pinMode(3, INPUT_PULLUP); //LEFT TIRE
attachInterrupt(1, blinkleft, CHANGE); //LEFT TIRE
pinMode(2, INPUT_PULLUP); //RIGHT TIRE
attachInterrupt(0, blinkright, CHANGE); //RIGHT TIRE
digitalWrite(motor_vcc_left, HIGH);
digitalWrite(motor_vcc_right, HIGH);
}
void loop() {
if ((left_counter - right_counter) > 10) {
while (left_counter != right_counter) {
digitalWrite(motor_vcc_left, LOW);
}
digitalWrite(motor_vcc_left, HIGH);
} else if ((right_counter - left_counter) > 10) {
while (right_counter != left_counter) {
digitalWrite(motor_vcc_right, LOW);
}
digitalWrite(motor_vcc_right, HIGH);
}
}
void blinkleft() {
left_counter++;
}
void blinkright() {
right_counter++;
}