control pid de barra y bola con arduino

Upload: richard-l-torres

Post on 07-Aug-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    1/17

    Control PID de Barra y Bola con Arduino

      Es fácil entender el Control PID estudiando un sistema de 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.

     

    Sistema de Barra y Bola

    Es un sistema clásico en la Ingeniería de Control.

      . ediante un Sensor de distancia! medimos la "osici#n de la bola.

      . Con un Controlador! mediante control PID! calculamos el ángulo en el $ue

    deberíamos inclinar la barra "ara colocar y

    estabilizar la bola en el centro de la barra.

      . %n Actuador modi&ca la inclinaci#n de la barra.

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    2/17

    Sensado de la posición de la Bola

    'a realizamos mediante el sensor de distancia mediante luz infrarroja y

    detector P(D) (*A+P ,P-/A-0

     1iene un rango de 2 a 3/ cm. 4unciona con 56 y su salida es una tensi#n

    relacionada con la distancia medida mediante esta curva característica)

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    3/17

    (i la bola se acerca más de 2/cm al sensor! la medida es err#nea. 'imitamos el

    movimiento de la bola en esa distancia.

    Acondicionamiento de la señal del sensor

    Para &ltrar 7"aso bajo8 la se9al del sensor y tener una se9al más "recisa y

    re"etitiva! conectaremos un condensador electrolítico de 0/ %4 entre la salida

    del sensor y tierra.

    Como la tensi#n má:ima $ue vamos a medir es de ;!06! con&guraremos la

    referencia de tensi#n del Arduino a ;!;6 mediante la instrucci#n)

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    4/17

      conectaremos el "in A+E4 con la salida de ;!;6 del Arduino)

    Cone:i#n de la +eferencia anal#gica a la (alida de ;!;6

    De esta forma! los 0/-< "untos $ue nos "ro"orciona el Conversor Analógico

    digital de 0/ bit del Aduino tendrán un fondo de escala de ;!;6 en lugar de los

    56 "or defecto. Así! incrementaremos la resoluci#n de 5m6=ADC a ;m6=ADC.

    Calibración del sensor

    Para relacionar la tensi#n "ro"orcionada "or el sensor con la distancia encentímetros! des"lazaremos la bola "or la barra tomando nota de la lectura en

    ADC. En el Software desarrollado para el Arduino! se incluye un modo de

    funcionamiento en el $ue transmite continuamente las lecturas del sensor "or

    el "uerto serie)

    Con > "untos a lo largo de la barra es su&ciente. ?btenemos la curva de

    calibraci#n del sensor.

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    5/17

    @ue en el (oftare $ueda de&nida "or)

      "ara transformar las lecturas ADC del sensor! almacenadas en la variable

    measure, en la "osici#n de mm de la variable dist, a"licamos el siguiente

    algoritmo)

    'a variable dist tiene valores negativos y "ositivos) 0>;mm en el e:tremo

    iz$uierdo de la barra! 0-/mm en el dereco y / en el centro. Como nuestro

    objetivo es dejar la bola en el "unto central! esta variable dist e$uivale al error

    utilizado en la bibliografía de control PID.

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    6/17

    Actuador

    Inclinaremos la barra con un (ervo *E1+?IF *F5/0/ de 2!>Gg.cm de "ar

    motor y una biela de &bra de vidrio anclada a un e:tremo de la barra.

      Actuador (ervo

    Como dice la HiGi"edia! controlamos el giro del servo con "ulsos de duraci#n

    variable)

    Control de la

    "osici#n del servo mediante "ulsos

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    7/17

    En este servo en concreto la posición 0º se obtiene con pulsos de 0,5ms y el giro de 180º con

    2,3ms.

    La biblioteca estándar (incluida en el IDE de Arduino)servo, incluye la instrucciónwrite(angle),

    siendo angle uninteger entre 0 y 180, que nos permite ajustar la posición del servo. Ésta es lainstrucción que se usa habitualmente, pero como nosotros queremos la máxima precisión en

    el giro del servo, utilizaremoswriteMicroseconds en su lugar. Su sintaxis

    es:servo.writeMicroseconds(μS), siendoμS los microsegundos de duración del pulso.

    Dispondremos de valores entre 500 (posición arriba) y 2300 (posición abajo), teniendo 1800

    puntos distintos en lugar de sólo 180 usando la instrucción más básica:write(angle).

    Durante la puesta en marcha y ajuste, calcularemos la posición de reposo (barra horizontal)

    con la ayuda de un nivel de burbuja.

    ivel de burbuja

    Controlador

    Utilizaremos un clon de Arduino con microcontrolador ATMEL ATMEGA328-PU equiparable alArduino UNO o al antiguo Duemilanove original.

    Recibe la medida de la posición de la bola en su entrada analógica A0.

    Emite pulsos para controlar el servo en su salida digital 12.

    A través de su conexión USB envía distintos juegos de datos para debug o tramas de

    la forma:

    https://www.arduino.cc/en/Reference/Servohttps://www.arduino.cc/en/Reference/Inthttps://www.arduino.cc/en/Reference/ServoWriteMicrosecondshttps://www.arduino.cc/en/Reference/Inthttps://www.arduino.cc/en/Reference/ServoWriteMicrosecondshttps://www.arduino.cc/en/Reference/Servo

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    8/17

    que son recibidas por un PC ejecutando unaaplicación desarrollada enProcessing 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á.

    Esquema del sistema completo

    http://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.ziphttps://processing.org/http://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.ziphttps://processing.org/

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    9/17

    squema Control PID de Barra y Bola con Arduino

     

    Conexiones

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    10/17

    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.

    Software para Arduino: _70_Barra_y_Bola_v5_MicroSegundos

    Período de medida y reacción

    Las secuencias de medida y reacción (los ciclos de programa) no se harán tan rápido como

    pueda el microcontrolador, sino cada50ms (valor almacenado en la variable period). Lo

    hacemos así porque los sistemas de control PID funcionan mejor si los ciclos de medida y

    reacción siempre tienen la misma duración.

    El microcontrolador, con reloj de 16MHz, tiene velocidad suficiente para hacer el ciclo de

    programa en menos de 10ms. Pero con ciclos tan rápidos, la medida de la velocidad de la bola

    pierde precisión porque las diferencias en la posición de la bola entre ciclos son ínfimas y

    nosotros calculamos la velocidad de la bola como la diferencia en su posición en 2 ciclosconsecutivos de programa.

    http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.ziphttp://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.zip

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    11/17

    Si alargamos el periodo a 100ms, la medida de la velocidad es más precisa, pero el servo

    funciona de una forma perceptiblemente intermitente.

    Tras las pruebas realizadas, un período de 50ms aporta mediciones aceptables de la

    velocidad de la bola y un funcionamiento del servo fluido.

    Cálculo de la velocidad de la bola

    En elSoftware que implementa el control PID en el Arduino calculamos la velocidad como ladiferencia entre la posición actual de la bola (variabledist) y la que tenía en el ciclo anterior

    (variablelastDist). Vamos a mejorar la precisión de está medida mediante unfiltro digital de

    paso bajo (Promediador) que consiste en obtener la media de la últimas 5 velocidades

    medidas. Las almacenamos en la matrizv[], y las tratamos con el siguiente algoritmo en cada

    ciclo de programa:

    http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.ziphttps://es.wikipedia.org/wiki/Filtro_digitalhttps://es.wikipedia.org/wiki/Filtro_digitalhttp://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.ziphttps://es.wikipedia.org/wiki/Filtro_digitalhttps://es.wikipedia.org/wiki/Filtro_digital

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    12/17

    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 elsoftware

    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):

     pos < 0 : Servo Arriba

    http://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.ziphttp://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.ziphttp://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.ziphttp://roble.uno/wp-content/uploads/2015/08/52_Barra_y_Bola.zip

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    13/17

    y positivos (hacia abajo) a partir del valor 0 que deja la barra en horizontal:

     pos > 0 : Servo Abajo

    Como tenemos la posición de la bola en la variabledist, “Inclinar más la barra cuanto máslejos esté la bola del centro” se escribe en el software como:

    siendo Kp una constante.

    Así ya tenemos implementado el Término Proporcional del control PID.

    – ¡No me digas que no es sencillo!

    – Sí, claro… y que valor asignamos a Kp.

    Para asignar un valor a Kp (como para los posteriores Kdiferencial y Kintegral) comenzaremos

    por asignarle un valor cualquiera: 1, 100, 235, 0.01 o el que te apetezca y observaremos el

    comportamiento del sistema.

    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 bolaalcance demasiada velocidad y ¡luego hay que detenerla en el centro!

    Para el sistema construido, un valor adecuado es 2. Sólo con el término proporcional, la bola

    nunca se estabiliza.

    En el siguiente vídeo se muestran los efectos de:

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    14/17

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    15/17

    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.

    ¡Conseguimos detener la bola con bastante eficacia!

    Nuestro objetivo es detener la bola en el punto medio. El control proporcional acerca la bola al

    centro inclinando la barra más cuanto más lejos esté. El control derivativo inclina la barra más

    cuanto más rápido se mueva la bola y consigue detenerla. Observemos ahora la acción

    conjunta de los 2 términos, definiendo la posición del servo como:

    ¡Esto ya funciona!

    La acción combinada del término Proporcional y Derivativo es un control PD, suficiente para

    muchas aplicaciones. Una de sus debilidades es que cuando la bola se ha detenido cerca del

    punto central ya no reacciona. Como la velocidad es 0, el término diferencial no actúa. Como

    está cerca del punto central, la inclinación de la barra por el término proporcional es pequeño y

    puede no ser suficiente como para que la bola se mueva. Es lo que ocurre en esta ocasión:

    sto 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.

    – ¿Incrementamos el término Proporcional?

    Valores altos de Kp conllevan inestabilidad en el sistema como vimos en el vídeo anterior con

    Kp=100.

    La solución es la letra que nos falta para tener un auténtico control PID: la I de Integral.

    Incrementando la precisión: El término Integral

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    16/17

    El término Integral considera la posición de la bola (como el término Proporcional) y cuánto

    tiempo lleva allí. Dicho de una forma más rigurosa: De la misma manera que el término

    Derivativo actúa sobre la velocidad, que es la derivada de la posición de la bola a lo largo del

    tiempo, el término Integral actúa sobre el área que queda bajo la curva de la posición a lo

    largo del tiempo.

    Base de los términos

    Ese área depende del intervalo de integración. Si integramos ininterrumpidamente el área bajo

    la curva, el término integral sólo aporta inestabilidad en el sistema. Sólo vamos a integrar la

    posición de la bola cuando ésta se encuentre a menos de 4 cm del centro de la barra. Cuandoesté a menos de 8 mm del centro, damos por cumplido el objetivo y dejamos de integrar. Si se

    sale de un intervalo reiniciamos I (I=0). Lo escribimos en el software como:

  • 8/20/2019 Control PID de Barra y Bola Con Arduino

    17/17

    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 enI. 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.