Cómo construir un robot micromouse que resuelve un laberinto

Autor: Oscar Gonzalez

Cómo construir un robot micromouse que resuelve un laberinto

Tiempo de lectura: 34 minutos

Aprende todo lo que necesitas para montar tu propio robot resuelve laberintos, seleccionar los componentes y algunos trucos más

Cómo construir un robot micromouse que resuelve un laberinto

  • 35

0 Intermedio

Control PID

Imagen: https://plcynergy.com/pid-controller/

Imagen: https://plcynergy.com/pid-controller/

Te voy a hablar de algo que te va a resultar muy útil para controlar de forma precisa tu robot resuelve laberintos y en realidad casi cualquier otro sistema que necesites controlar en función a lo que ocurra. 

Te voy a hablar del Control PID. ¿Te suena a chino? 

No te preocupes, aquí estoy para convertir las cosas complicadas en algo que puedas entender fácilmente.

¿Qué es un control PID y cómo funciona?

El Control PID es como el cerebro de un sistema automático. PID significa Proporcional, Integral, Derivado. Estos tres componentes trabajan juntos para mantener tu sistema funcionando como un reloj suizo, ya sea un horno, un motor o una nave espacial.

Imagina que estás en un horno (no literalmente, claro). Quieres mantener la temperatura a un cierto punto. Un sensor en el horno mide la temperatura en todo momento. La diferencia entre la temperatura deseada y la real es el error

Puedes usar un Control PID para corregir ese error.

El componente Proporcional dice: "Si el error es pequeño, vamos a hacer un pequeño ajuste. Si el error es grande, necesitamos un cambio mayor"

Básicamente, el Proporcional es la parte que se encarga de la inmediatez de la respuesta, siendo más agresiva cuanto mayor es el error.

La Integral se fija en los errores pasados. Si hemos estado durante mucho tiempo con un pequeño error, este componente acumula todo ese error y, si llega a ser significativo, empieza a actuar. Es como un elefante que nunca se olvida de nada.

Por último, el componente Derivado es nuestro vidente. Predice el error basándose en cómo este ha estado cambiando. Si el error aumenta rápidamente, este componente actúa con rapidez para contrarrestarlo.

Ahora, vamos a poner todo esto en acción con un ejemplo real. 

Imagina que tienes un motor DC controlado por un Arduino. Este motor está conectado a una rueda, y queremos que la rueda permanezca en una posición específica. Vamos a suponer que tenemos nuestro encoder conectado a la entrada A0 y un posible código de ejemplo para PID sería algo así:

/*
  Código de ejemplo control PID par aun motor con Arduino
*/
double kp = 2;
double ki = 5;
double kd = 1;
unsigned long currentTime, previousTime;
double elapsedTime;
double error;
double lastError;
double input, output, setPoint;
double cumError, rateError;

void loop(){
  input = analogRead(A0); // Leemos el pulso del encoder
  output = computePID(input);
  delay(100); // Si, uso delay y no ha explotado el universo (aunque debería, lo del universo, digo)
  analogWrite(3, output); // Actúa sobre el motor con el valor calculado
}

double computePID(double inp){ 
  currentTime = millis(); // Guarda el tiempo actual
  elapsedTime = (double)(currentTime - previousTime); // Calcula el tiempo transcurrido desde el último calculo
  error = Setpoint - inp; // Calcula el error
  cumError  = error * elapsedTime; // Calcula la integral
  rateError = (error - lastError)/elapsedTime; // Calcula la derivada
  double out = kp*error   ki*cumError   kd*rateError; // Aquí tenemos el resultado del la salida PID
  lastError = error; // Hay que guardar el error para luego
  previousTime = currentTime; // Recordamos el último tiempo
  return out;
}

Ahora que ya tienes una idea más clara de cómo funciona y cómo usar un control PID en tu robot. Realmente esto es lo suficientemente genérico para usarlo casi en cualquier sitio donde necesites un bucle cerrado. Es decir, que tu proyecto reacciones basándose en lo que digan sus sensores.

Hemos visto un trozo de código de ejemplo muy básico hecho a mano y por supuesto, también existen muchas librerías para Arduino para hacer un control PID.

Por ejemplo, la librería PID para Arduino, o esta otra llamada ArduPID.