Autor: Oscar Gonzalez
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
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.
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.