Las primeras pruebas de movimiento autónomo topan con el primer problema serio: cuando el robot detecta un obstáculo, se detiene y da marcha atrás pero desde ese momento se queda sin potencia. El efecto es como si perdiera toda la energía. De hecho la batería se queda como inútil y sólo funciona con la corriente suministrada por el portátil a través del USB.
En el video se observa cómo el robot arranca a velocidad normal pero, tras detectar el obstáculo, intenta ir marcha atrás y se pierde toda la potencia.
Después de muchas pruebas parece ser que es un comportamiento anómalo del Arduino Motor Shield de DFRobot que sólo ocurre cuando se conmuta la marcha atrás a plena potencia.
Consigo solucionarlo acelerando poco a poco, es decir, llegando a la velocidad máxima de forma progresiva. El efecto es inapreciable pero al menos consigo esquivar el problema.
/*
Intrucciones de retroceso del robot
(acelera por partes para evitar bloqueo imprevisto del MotorShield)
*/
void retrocede() {
Serial.print("Retrocede...");
analogWrite(Izquierdo, 0); // Paro de los motores
analogWrite(Derecho, 0);
digitalWrite(M1, LOW); // Orden de marcha atrás
digitalWrite(M2, LOW);
analogWrite(Izquierdo, 90); // Velocidad baja
analogWrite(Derecho, 90);
delay(100); // Espera una decima de segundo
analogWrite(Izquierdo, 175); // Velocidad media
analogWrite(Derecho, 175);
delay(100); // Espera una decima de segundo
analogWrite(Izquierdo, 255); // Velocidad máxima
analogWrite(Derecho, 255);
Serial.println("OK");
}