Un sistema de control es un conjunto de componentes que regulan el comportamiento de una planta para llevar sus variables a un estado deseado y mantenerlas ahí, independientemente de lo que ocurra en el exterior.
Dentro de este mundo, la primera y más importante clasificación que debemos hacer es cómo se relaciona nuestro controlador con la planta. Existen dos filosofías opuestas: el lazo abierto y el lazo cerrado.
Entender esta diferencia es el primer paso real para dejar de programar secuencias estáticas y empezar a programar sistemas dinámicos inteligentes.
Control en lazo abierto (open loop)
Un sistema de control en lazo abierto es aquel en el que la acción de control es totalmente independiente de la salida del sistema. Es decir, el controlador emite una orden basándose únicamente en la entrada o en una calibración previa, pero no comprueba si la orden se ha cumplido.
A este tipo de control me gusta llamarlo “control por fe” o “confiar a ciegas”.
Ejemplos en el mundo real
El ejemplo clásico es una tostadora. Tú le dices que tueste el pan durante 3 minutos (esa es la entrada). El temporizador activa las resistencias térmicas durante ese tiempo y luego las apaga. La tostadora no tiene ni idea de si el pan ha salido blanco, dorado o carbonizado. Simplemente ejecuta su tiempo y termina.
En el mundo maker, un motor paso a paso (stepper) operado sin un encoder es un lazo abierto. Le mandas 200 pulsos para que dé una vuelta completa. Si el motor se atasca a mitad de camino, el microcontrolador no se entera; él sigue mandando pulsos creyendo que el motor está girando.
¿Cómo se ve en código?
El código de un lazo abierto suele basarse en temporizadores o mapeos directos (calibración previa):
// Ejemplo de lazo abierto: Motor de riego automático
void regar_plantas() {
encender_bomba();
delay(60000); // Asumimos que en 1 minuto caen 2 litros. Confiamos.
apagar_bomba();
}
El control en lazo abierto no es necesariamente malo. Es muy barato, sencillo de implementar y nunca tiene problemas de inestabilidad (no puede oscilar porque no se retroalimenta). Si el entorno es muy predecible, es perfectamente válido.
El gran problema del lazo abierto son las perturbaciones. Si la presión del agua de la red baja a la mitad, nuestro código anterior regará las plantas con 1 litro en lugar de 2, y se nos secarán. El sistema es ciego.
Control en lazo cerrado (closed loop)
En un sistema de control en lazo cerrado (o sistema con realimentación o feedback), la acción de control depende de la salida del sistema.
Para lograr esto, necesitamos introducir un componente imprescindible: el sensor. Medimos constantemente la realidad (la salida), la comparamos con lo que queríamos obtener (la referencia), y tomamos decisiones basándonos en la diferencia entre ambas.
La anatomía del lazo cerrado
Para hablar con propiedad, vamos a definir los términos que usaremos de aquí en adelante en todo el curso:
- Setpoint (SP) o referencia
r(t): El valor objetivo que queremos alcanzar (por ejemplo, 200 °C en la impresora 3D). - Variable de proceso (PV) o salida
y(t): El estado real del sistema medido por nuestros sensores (por ejemplo, 195 °C medidos por el termistor). - Error
e(t): Es la diferencia matemática entre lo que queremos y lo que tenemos. Se calcula comoe(t) = r(t) - y(t).
El controlador toma ese error y calcula qué señal enviar al actuador para reducirlo a cero.
Ejemplos en el mundo real
El control de crucero de un coche moderno. Tú le pides ir a 120 km/h (Setpoint). El velocímetro mide que vas a 115 km/h (PV). El ordenador del coche calcula un error de +5 km/h y decide inyectar más gasolina. Si de repente el coche empieza a subir una cuesta (perturbación), la velocidad bajará, el error aumentará de nuevo, y el sistema inyectará aún más gasolina para compensar la cuesta, todo sin que tú toques el pedal.
¿Cómo se ve en código?
La estructura de un lazo cerrado siempre se ejecuta dentro de un bucle continuo de evaluación y actuación.
// Ejemplo conceptual de lazo cerrado (Control Proporcional muy básico)
float setpoint_temperatura = 200.0;
void loop() {
// 1. Medir la realidad (Retroalimentación)
float temperatura_actual = leer_termistor();
// 2. Calcular el error
float error = setpoint_temperatura - temperatura_actual;
// 3. Actuar sobre la planta para corregir el error
float potencia_pwm = calcular_controlador(error);
aplicar_potencia_resistencia(potencia_pwm);
delay(100); // Esperar al siguiente ciclo de control
}
La gran ventaja del lazo cerrado es que puede compensar perturbaciones externas (alguien abre la ventana y enfría la habitación) y variaciones internas (los engranajes del motor se desgastan con los años). El resultado dependerá del sensor, del controlador y de los márgenes de estabilidad; la realimentación no garantiza por sí sola una respuesta robusta.
Comparación entre ambos lazos
Para tenerlo siempre a mano, aquí tienes las diferencias clave entre ambos enfoques:
| Característica | Lazo Abierto | Lazo Cerrado |
|---|---|---|
| Arquitectura | Controlador → Actuador → Planta | Controlador ⇆ Planta ← Sensor |
| Complejidad | Baja. Fácil de diseñar y programar. | Mayor. Requiere sensores y un controlador bien ajustado. |
| Perturbaciones | Totalmente vulnerable. No reacciona a los cambios. | Robusto. Las detecta y las corrige automáticamente. |
| Precisión | Depende de la calibración y de que no cambien las condiciones. | Puede reducir el error, pero depende del sensor y del diseño del controlador. |
| Estabilidad | Siempre estable (si la planta lo es). | Peligro de inestabilidad. Un mal diseño puede hacer que el sistema oscile salvajemente. |
El último punto de la tabla es lo importante. Al meter retroalimentación, si reaccionamos demasiado tarde o con demasiada fuerza, podemos hacer que el sistema se vuelva inestable (imagina un coche que corrige el volante tan bruscamente que acaba haciendo eses hasta salirse de la carretera).