Professional Documents
Culture Documents
18 agosto, 2015
72 Comments
Es fácil entender el Control PID estudiando un sistema Barra y Bola y utilizando como
Controlador un Arduino. El objetivo es situar la bola en el centro de la barra inclinándola de
forma conveniente mediante un lazo cerrado de control.
Vídeo Resumen de 5 minutos:
Índice
Sistema Barra y Bola
o Sensado de la posición de la Bola
Acondicionamiento de la señal del sensor
Calibración del sensor
o Actuador
o Controlador
o Alimentación de 5V
o Esquema del sistema completo
Control PID
o Período de medida y reacción
o Cálculo de la velocidad de la bola
o Primera aproximación: El término Proporcional
o Deteniendo la bola: El término Diferencial
o Incrementando la precisión: El término Integral
Sensor SHARP
Tiene un rango de medida de 6 a 80 cm. Funciona con 5V y su salida es una tensión
relacionada con la distancia medida mediante esta curva característica:
Freno
analogReference(EXTERNAL);
De esta forma, los 1024 puntos que nos proporciona el Conversor Analógico Digital de 10
bit del Arduino tendrán un fondo de escala de 3,3V en lugar de los 5V por defecto. Así,
incrementamos la resolución de 5mV/ADC a 3mV/ADC.
Calibración del sensor
Para relacionar la tensión proporcionada por el sensor con la distancia en centímetros,
desplazaremos la bola por la barra tomando nota de la lectura en ADC. En el Software
desarrollado para el Arduino, se incluye un modo de funcionamiento en el que transmite
continuamente las lecturas del sensor por el puerto serie:
if(0){// Para calibrar sensor de Distancia
Serial.print(dist);
Serial.println(measure);
int ADCcal [] = {
y para transformar las lecturas ADC del sensor, almacenadas en la variable measure, en la
posición en mm de la variable dist, aplicamos el siguiente algoritmo:
dist = map(measure,ADCcal[i],ADCcal[i+1],dcal[i],dcal[i+1]);
Actuador Servo
Como dice la Wikipedia, controlamos el giro del servo con pulsos de duración variable:
Control de la posición del servo mediante pulsos
En este servo en concreto la posición 0º se obtiene con pulsos de 0,5ms y el giro de 180º
con 2,3ms.
Nivel de burbuja
Controlador
Utilizaremos un clon de Arduino con microcontrolador ATMEL ATMEGA328-PU
equiparable al Arduino UNO o al antiguo Duemilanove original.
173,173,-5,-5$ //dist,dist,vel,vel$
que son recibidas por un PC ejecutando una aplicación desarrollada en Processing y que
nos permitirá disfrutar de gráficas de la posición y la velocidad de la bola en función del
tiempo como ésta:
Gráfica de Processing
Como bonus, enciende un led conectado a la salida 13 cuando la bola está situada a
menos de 8mm del centro.
Alimentación de 5V
El Arduino recibe los 5V necesarios para su funcionamiento a través de su conexión USB.
La potencia de su pin de 5V es insufiente para alimentar el servo, por lo que lo
alimentaremos con una fuente de alimentación auxiliar. ¡No olvides conectar la tierra de la
fuente de alimentación auxiliar con la tierra GND del Arduino! De lo contrario, las señales
de control del servo no tendrán un referencia común y no funcionará.
Conexiones
Conexiones Arduino – Breadboard
Control PID
Una vez que tenemos implementado el sistema físico, llega el momento de dar al
controlador la inteligencia necesaria para mover la barra de forma tal que consigamos
nuestro objetivo: Dejar la bola quieta en el centro de la barra.
v[i] =v[i+1];
vel=0;
vel = vel/nvel;
El valor de la velocidad lo utilizaremos para calcular la componente Derivativa del control
PID. Además lo enviamos a través del puerto serie / cable USB para que lo reciba
el software Processing y nos lo represente gráficamente.
Primera aproximación: El término Proporcional
Si de lo que se trata es de llevar la bola al centro de la barra, parece lógico que debemos
inclinar la barra más, cuanto más alejada esté la bola del centro. El giro del servo, que
determina la inclinación de la barra, lo determinamos con el valor de la variable pos que
adopta valores negativos (hacia arriba):
y positivos (hacia abajo) a partir del valor 0 que deja la barra en horizontal:
Como tenemos la posición de la bola en la variable dist, “Inclinar más la barra cuanto más
lejos esté la bola del centro” se escribe en el software como:
pos=Kp*dist
Estamos buscando el valor más pequeño que sea suficiente para inclinar la barra cuando
la bola está cerca del objetivo pero todavía no ha llegado. Valores grandes hacen que la
bola alcance demasiada velocidad y ¡luego hay que detenerla en el centro!
– Kp =1. Demasiado bajo. Con poco efecto en las proximidades del punto 0.
– Kp =100. Demasiado alto. Acelera demasiado la bola.
– Kp =2. Es adecuado para nuestro sistema.
pos=Kd*vel
En las 3 primeras líneas de programa definimos los valores de las 3 constantes del control
PID:
float Kp =0;
float Kd = 100;
float Ki =0;
Hemos puesto Kp=0 para que el término proporcional no participe y Kd=10 como punto de
partida. Se observa que es un valor insuficiente porque no reacciona suficiente como para
detener la bola.
Subimos a Kd=100: Sobre-reacciona y el sistema es inestable.
El valor correcto está entre 10 y 100. Probamos con 50, 25… observando el
comportamiento del sistema bajo control Derivativo. Un valor aceptable es Kd=35.
pos=Kp*dist+Kd*vel;
¡Esto ya funciona!
Esto nunca ocurrirá en posiciones alejadas del centro porque el término proporcional ya
tendría suficiente entidad como para que su inclinación haga que la bola se mueva.
La solución es la letra que nos falta para tener un auténtico control PID: la I de Integral.
I=I+dist*Ki;
else {
I=0;
pos=Kp*dist+Kd*vel+I;
Es decir, que mientras la bola esté a menos de 4 cm y más de 8mm del centro, vamos a
coger su distancia al centro, la vamos a multiplicar por Ki y el resultado lo vamos a ir
acumulando en I. Cuanto más tiempo pase ahí, más grande se va a hacer I.
Como conclusión, el término integral aporta más precisión pero hay que acotar
convenientemente su acción porque de lo contrario conlleva demasiada inestabilidad.