LUIS LLAMAS
Ingeniería, informática y diseño
TUTORIALES ARDUINO AVANZADOS
CÓMO IMPLEMENTAR UN CONTROLADOR PID EN
ARDUINO
1 DICIEMBRE, 2019
Seguimos con la serie de entradas dedicadas a teoría de controladores viendo cómo
implementar un control PID en un microprocesador como Arduino.
En entradas anteriores hemos visto una introducción a la teoría de control, presentado el
controlador todo/nada con histéresis, el poderoso controlador PID, y visto cómo ajustar los
parámetros de un controlador PID.
Ahora toca dejar la teoría, desempolvar el teclado, ver cómo se implementa un
controlador PID en un microprocesador como Arduino. Afortunadamente, es bastante sencillo
hacer un PID básico y, como veremos en la segunda parte, tenemos disponible una librería muy
completa para que sea incluso más sencillo.
Un PID es un elemento esencial a la hora de abordar una gran cantidad de proyectos
interesantes, como regular automáticamente el nivel de luz, mantener la temperatura,
conseguir que un motor gire a velocidad constante, plataformas estabilizadoras, hacer que un
robot avance recto o incluso robots que se mantienen en equilibrio sobre dos ruedas.
Anuncio:
Conéctate Con Tus Clientes
Con Google Ads, no hay
Anuncio
Anuncio contratos ni mínimo de inversión.
Google Ads
Más información
CONTROLADOR PID A MANO
Primero vamos a ver cómo implementar un controlador sencillo por nosotros mismos.
En realidad, el código no es excesivamente complejo. Supongamos que nuestro controlador
toma la entrada de la variable controlada en A0, y efectúa la salida mediante una señal PWM en
el pin 3.
El código de un PID básico podría ser el siguiente
1 // Asignaciones pins
2 const int PIN_INPUT = A0;
3 const int PIN_OUTPUT = 3;
4
5 // Constantes del controlador
6 double Kp=2, Ki=5, Kd=1;
7
8 // variables externas del controlador
9 double Input, Output, Setpoint;
10
11 // variables internas del controlador
12 unsigned long currentTime, previousTime;
13 double elapsedTime;
14 double error, lastError, cumError, rateError;
15
16 void setup()
17 {
18 Input = analogRead(PIN_INPUT);
19 Setpoint = 100;
20 }
21
22 void loop(){
23
24 pidController.Compute();
25
26 Input = analogRead(PIN_INPUT); // leer una entrada del controlador
27 Output = computePID(Input); // calcular el controlador
28 delay(100);
29 analogWrite(PIN_OUTPUT, Output); // escribir la salida del controlador
30 }
31
32 double computePID(double inp){
33 currentTime = millis(); // obtener el tiempo actual
34 elapsedTime = (double)(currentTime - previousTime); // calcular el tiempo transc
urrido
35
36 error = Setpoint - Input; // determinar el error entre
la consigna y la medición
37 cumError += error * elapsedTime; // calcular la integral del er
ror
38 rateError = (error - lastError) / elapsedTime; // calcular la derivada del e
rror
39
40 double output = kp*error + ki*cumError + kd*rateError; // calcular la salida del
PID
41
42 lastError = error; // almacenar error anterior
43 previousTime = currentTime; // almacenar el tiempo anter
ior
44
45 return output;
46 }
Como vemos no es demasiado difícil. Tenemos una función 'computePID()' que realiza todo
el trabajo. En esta función calculamos el tiempo transcurrido entre llamadas, que necesitamos
para calcular tanto la derivada como la integral del error.
A continuación, comparamos la entrada del controlador con la consigna para
determinar el error y realizamos las 'pseduo' integrales y derivadas (su equivalente discreto).
Finalmente, calculamos la respuesta del sistema mediante la fórmula del PID, y guardamos los
valores para el siguiente ciclo.
¿No ha sido tan duro, verdad? Sin embargo, aunque es completamente funcional, nuestro
controlador PID es bastante simple. Por tanto, tiene ciertas carencias ante situaciones que
ocurren frecuentemente en la realidad.
Podríamos mejorar nuestro código, pero ya no iba a ser tan sencillo ni rápido hacerlo. Y lo
mejor ¡no hace falta! Para nuestra alegría alguien ha hecho todo el trabajo por nosotros, como
veremos en el siguiente apartado.
CONTROLADOR PID CON LIBRERÍA
Afortunadamente tenemos disponible la librería Arduino PID desarrollada por Brett
Beauregard. Una pequeña maravilla que contiene muchas mejoras respecto a un PID básico,
que están detalladas en este enlace del autor.
Os recomiendo que leáis la documentación de la librería porque es toda una clase sobre
controladores PID.
La librería incluye varios ejemplos sobre su uso, hasta dispone de funciones de auto
tunning. Aquí tenéis un ejemplo sencillo que muestra cómo sería su uso en un proyecto, que
es equivalente al ejemplo anterior mejorado con la librería.
1 #include <PID_v1.h>
2
3 // Asignaciones pins
4 const int PIN_INPUT = A0;
5 const int PIN_OUTPUT = 3;
6
7 // Constantes del controlador
8 double Kp=2, Ki=5, Kd=1;
9
10 // variables externas del controlador
11 double Input, Output, Setpoint;
12
13 PID pidController(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
14
15 void setup()
16 {
17 Input = analogRead(PIN_INPUT);
18 Setpoint = 100;
19
20 pidController.SetMode(AUTOMATIC); // encender el PID
21 }
22
23 void loop()
24 {
25 Input = analogRead(PIN_INPUT);
26 pidController.Compute(); // actualizar el PID
27 analogWrite(PIN_OUTPUT, Output);
28 }
Hemos visto que resulta bastante sencillo implementar un controlador PID en un
microprocesador como Arduino. Y es incluso más sencillo a la pequeña joya de librería Arduino
PID. Así que no hay motivos para tener escusas o miedos a la hora de implementar un
controlador PID en nuestros proyectos.
En las próximas entradas de la serie empezaremos a ver ejemplos prácticos de proyectos
donde podemos implementar un control PID en Arduino. ¡Hasta pronto!
Anuncio:
Arduino,Controlador,PID
PREVIOUS NEXT
POLLY, UNA LIBRERÍA DE PATRONES DE CÓMO SERVIR UN API REST CON JSON
RESILIENCIA PARA .NET DESDE ESP8266
TAMBIÉN TE PUEDE GUSTAR
MEDIR TENSIÓN, INTENSIDAD Y PULSÍMETRO Y OXÍMETRO CON CÓMO USAR ARDUINO Y EL IMU 9
POTENCIA CON ARDUINO Y INA219 ARDUINO Y MAX30102 EJES L3GD20 + LSM303D
DETECTOR DE MOVIMIENTO CON ENVIAR Y RECIBIR POR I2C DATOS CÓMO AJUSTAR UN CONTROLADOR
ARDUINO Y RADAR DE MICROONDAS EN FORMATO JSON EN ARDUINO PID EN ARDUINO
RCWL-0516
Únete a la conversación...
1 0 0 1
newest oldest
Gabriel
Buenas Luis en primer lugar gracias por tus aportes son increíbles, te llevo siguiendo desde hace
algunos años y la verdad me has solventado muchas dudas, gracias!
Y segundo creo que tiene una pequeña errata tu código.
double Input, Output, setPoint; entiendo que es SetPoint
Un saludo y sigue así!
Reply 5 months ago
Buscar
NOS VEMOS EN
ENCUENTRA LO QUE TE INTERESA
NUESTRAS SECCIONES
INFORMÁTICA
INGENIERIA
PROGRAMACION
TUTORIALES ARDUINO
ZONA GEEK
DESCUBRE LAS ÚLTIMAS ENTRADAS
ENTRADAS RECIENTES
MEDIR TENSIÓN, INTENSIDAD Y POTENCIA CON ARDUINO Y INA219
10 MAYO, 2020
APLICACIONES MULTIPLATAFORMA CON ASP.NET CORE Y ELECTRON.NET
8 MAYO, 2020
ANALIZADOR LÓGICO BARATO Y EL SOFTWARE PULSEVIEW
4 MAYO, 2020
OPENROBOT, PCB OPEN HARDWARE PARA TUS PROYECTOS DE ARDUINO
30 ABRIL, 2020
PARTES Y FUNCIONAMIENTO DEL CABEZAL DE UNA IMPRESORA 3D
27 ABRIL, 2020
CEGUERA DIGITAL
24 ABRIL, 2020
Excepto notación
expresa, los contenidos
de este sitio se ofrecen
bajo licencia Creative MEDIR TENSIÓN,
INTENSIDAD Y JAVIER
Commons License BY-NC-
POTENCIA CON on Cómo programar
SA. Arduino con Visual Studio
ARDUINO Y Code
INA219
10 MAYO, 2020 Hola, Lo primero darte
la enhorabuena, el
post es genial, muy
Más información APLICACIONES claro y fácil de…
MULTIPLATAFOR
MA CON ASP.NET
CORE Y
JUAN
ELECTRON.NET
on Teoría de control en
8 MAYO, 2020 Arduino: El controlador
PID
Esta muy bueno la
ANALIZADOR
explicación te felicito,
LÓGICO BARATO
ahora podrías
Y EL SOFTWARE
adentrarte en el
PULSEVIEW
controlador difuso
4 MAYO, 2020
que…
Copyright ©2018, Todos los derechos reservados
Aviso legal Política de cookies