Control PID para Arduino mejorado.

Un controlador PID es un mecanismo de control por realimentación ampliamente usado en sistemas de control industrial. Este calcula la desviación o error entre un valor medido y un valor deseado. (Wikipedia.)

Todo lo que se expone en esta página sólo es aplicable a encoders incrementales.

Antes de comenzar pongo un vídeo. Se trata de "arrastrar" un peso de 500gr; son tres imanes de magnetrones de microondas domésticos. En el vídeo no llega a los 500 porque para que se pudiera ver los dígitos de la báscula, tuve que inclinarla y eso hace perder un poco de peso (en apariencia). Ten en cuenta que el motor mueve directamente el carro, no hay engranajes ni reducciones para aumentar el par. El vídeo demuestra que a pesar de llevar una carga pesada y la inercia que provoca, el controlador PID sigue siendo igual de preciso. He utilizado las mismas constantes PID en los tres vídeos de esta página. Verás lucir unos leds; los extremos se encienden cuando se activa el PWM para mover el motor en un sentido u otro, y los dos del medio lucen cuando ha llegado a la posición designada. Al final de esta página pongo dos vídeos más.

En esta página presento un control PID para posicionar un motor y está basado en el algoritmo publicado por Brett Beauregard. Modifiqué el algoritmo original para "suavizar" la respuesta del motor, dándole unas características únicas, entre ellas un posicionamiento al punto designado mucho más suave y progresivo, y permite "sintonizar" las constantes PID de un modo más intuitivo y simple.

Es un Arduino Nano, pero es 100% compatible con Arduino UNO.

La diferencia entre el controlador PID con librería y el que presento en esta página es que he puesto el algoritmo dentro del mismo código para que puedas ver dónde hago las modificaciones para mejorar el comportamiento del motor.

El problema:

En un control PID de posición convencional la parte más difícil de sintonizar es el control integral. Sucede que el control integral se suma al control proporcional y como el control integral acumula las desviaciones anteriores [ITerm +=  (error * ki)], para cuando llega a la meta designada no le da tiempo a minimizar ese error (o desviación) y el motor tiene tendencia a ir un poco más allá del punto designado para luego corregirse. Normalmente lo que haríamos sería bajar la constante KI, o bien subir el valor de KD (o ambas cosas) para contrarrestar esa inercia, pero en muchos casos se hace muy difícil porque al aumentar/disminuir una de las constantes se suele necesitar reajustar las demás constantes.

La solución:

Se trata de que el control integral "ITerm" sólo sume el error proporcional por la constante integral en el caso de que no exista diferencia entre dos tiempos del valor de la entrada del encoder. Y en el caso contrario, si existe diferencia de contaje entre dos tiempos, lo que hace es sumar ese valor de diferencia (dInput) multiplicada por la constante Ki. 

Lo lógico sería poner después del "else" ITerm -= (error * ki) y lo cierto es que da buen resultado, sin embargo ITerm -= (dInput  * ki ) da mucho mejor resultado. Cuando el motor se acerca a la meta, la condición entre:  ITerm += (error * ki)  e  ITerm -= (dInput  * ki) se combinan muy rápidamente y provoca que el motor se acerque a la meta de una forma más suave y progresiva, eliminando la oscilación del control integral.

Existen otras modificaciones menores dentro del algortimo PID, como por ejemplo, multiplico la contante KD antes de pasar al filtro del control integral (así estará amplificada), y a su vez, el control integral le multiplico la constante KI antes de pasar al Output.

Comunicación a través del terminal serie.

Cuando estés en el terminal serie no importará si la letra que escribimos es en mayúscula o minúscula, dentro del programa se convertirá en mayúscula.

Posición relativa (sumar una cantidad a la posición en la que está el motor):

Desde el terminal serie, las letras que hacen mover el motor son Q-W, A-S, Z-X, 1-2. Cada par es derecha o izquierda, por ejemplo, Q es izquierda y W es derecha, así con el resto. Escribes una de esas letras y al pulsar enter (o dándole a "Enviar"), el motor se moverá cierto número de pasos. Q y W es una distancia corta, A y S una distancia media, Z y X una distancia más larga y finalmente la tecla 1 y 2 es una distancia aún más larga. Si necesitas una distancia relativa muy larga puedes poner por ejemplo "11111" y pulsar enter, aunque lo mejor para esto es usar posiciones absolutas.

Posición absoluta: Escribes 'G' junto a un valor numérico y le das a enter, por ejemplo: "G23000" e irá a esa posición. Para posicionar recomiendo hacerlo de esta manera.

Modificar las constantes PID y tiempo de muestreo:

Ponemos 'P' y el valor de la constante proporcional.

Ponemos 'I' y el valor de la constante integral.

Ponemos 'D' y el valor de la constante derivativa.

Ponemos 'T' y el valor en milisegundos del tiempo de muestreo.

Por ejemplo, en el terminal serie ponemos: "D20" (y pulsamos enter), cambiará la constante KD a 20. Se puede utilizar decimales, por ejemplo "D21.35". Nótese que el decimal es un punto, no una coma, esto es importante. También se puede poner varias a la vez y han de ir obligatoriamente separadas por un espacio.

Ejemplos:

P1 D22.1 (y pulsamos enter)

P1.5 D20.3 T14 (y pulsamos enter)

Arduino te responderá con los datos de las constantes PID y tiempo de muestreo que hay en ese momento.

Si pulsas la letra "K" y le damos a enter, también te saldrá los valores de las constantes PID y tiempo de muestreo. Esto nos sirve para consultarlas en cualquier momento, porque cuando se hace pruebas, el terminal se llena de números y es fácil olvidar cómo estaban esos parámetros.

Métete dentro del programa y modifica la cantidad de distancia que ha de recorrer a tu gusto, añadir teclas con otras distancias, otras funciones, etc.


Antes de ponerlo en marcha has de saber:

Si has venido directamente a esta página, en Control PID con Librería tienes toda la información sobre la comunicación PC-Arduino, manejo óptimo del motor, una introducción para encontrar las constantes PID óptimas y otras cuestiones. En el ZIP de descarga también tienes unas instrucciones con todas estas cuestiones.

Vídeos de demostración.