Espasmitos
A veces es complicado de creer las teoría que nos cuentan en clase sobre automatización, reguladores PID y tantas otras cosas que no llegamos a programar hasta el último año de carrera. Sin embargo, la utilización de reguladores está a la orden del día en el mundo de la robótica. Por ello, y para facilitar el aprendizaje en clase, se diseñó y fabricó este ejemplo de regulador PID que estabiliza una pelota de ping pong en el centro de una barra que se inclina solidaria a un servomotor.
En esta página te vamos a contar cómo funciona nuestro robot Espasmitos, desde su diseño hasta su programación.
El proyecto tuvo una primera versión en la que se utilizaba MatLab para mostrar por pantalla gráficas que reflejasen el comportamiento del sistema y realizar en directo ajustes sobre los distintos parámetros del regulador para observar los cambios. Posteriormente, se realizó una segunda versión menos didáctica para poder llevar el robot a distintas exposiciones en las que primaba la autonomía, con lo que ya no había interacción con MatLab. Este es el modelo que probablemente hayas visto si has venido a alguno de los eventos de la ETSII en los que participamos.
Diseño
Tras varios bocetos en papel, se finalizó el diseño que se observa en la imagen. Estructuralmente consta de un perfil en L a 45º donde se apoya la pelota, un perfil circular como eje de rotación y dos perfiles cuadrados como columnas laterales.
Varias piezas en impresas en 3D forman los pies para el anclaje a una base de madera, el soporte del servomotor, la unión entre el servomotor y el eje, el soporte del rodamiento para el eje de rotación, la unión entre el perfil en L y el circular, una cesta para guardar la pelota y por último los topes para que la pelota no se salga de la barra y que sirven de soporte para el sensor de distancia. Como ves, la impresión 3D es nuestra amiga para cualquier cosa que hagamos.
Electrónica
Todo regulador tiene 3 partes fundamentales: un controlador, un sensor y un actuador. En este caso, la misión es mantener la pelota de ping-pong en el centro de la barra. Para ello necesitamos un sensor que mida distancia y le pase la información al controlador. El controlador, por su parte, interpreta la información del sensor y le da órdenes al actuador para que coloque la pelota en el centro, si es que no lo estaba ya. Este mismo esquema es que se utiliza tanto para los robots siguelíneas de nuestra competición Cybertech como para controlar el nivel de depósitos en plantas industriales.
El circuito, por tanto, es muy simple: como controlador utilizaremos un Arduino UNO, el que había disponible, realmente valdría cualquiera. Como sensor, un sensor láser de distancia VL53L0X; se eligió un sensor láser por el rango de mediciones que aportaba, ya que es capaz de medir con precisión en rangos pequeños, aunque se podría realizar también con un infrarrojo o ultrasónico. Como actuador, un servomotor S3003. Simplemente hay que conectar estos dos elementos al Arduino y ponerse a programar.
Programa
La parte complicada del proyecto. Los servomotores permiten decirles un ángulo y ellos se colocan en posición. Esto parece útil para nuestro caso, pero es muy lento y se movería a tirones (video). Para evitarlo vamos a usar el servo de la misma forma que los motores de dron, por ejemplo, con la función servo.writeMicroseconds. De esta forma conseguiremos un movimiento fluido.
Para la comunicación con MatLab utilizaremos el puerto serie: de la misma que forma que mostramos información por pantalla en la IDE de Arduino podemos comunicarnos con un programa que hagamos en MatLab. De esta forma conectaremos el Arduino a MatLab y podremos enviar datos de control de MatLab a Arduino y datos de posición de Arduino a MatLab.
En MatLab se diseño una interfaz sencilla (a la derecha) con las gráficas que creíamos útiles y dos barras de control para ajustar el regulador PD. Estos dos valores son los que enviaremos al Arduino a través del puerto serie. En Arduino programaremos un control PD que regule el movimiento del servo con los valores que reciba de MatLab, además de enviar por serial los valores de la lectura del sensor y el ángulo del servo.
Si queréis echarle un vistazo al código, aquí os dejamos el de Arduino (sin comunicación con MatLab) por si queréis hacer algo parecido en casa. Para ejecutarlo necesitáis las librerías de Arduino Wire y Servo, y la librería para leer el sensor fácilmente VL53L0X.
#include <Wire.h> #include <Servo.h> #include <VL53L0X.h> /*** SENSOR ***/ VL53L0X sensor; int pos; //posición de la pelota float e, ed = 0; //errores /*** ACTUADOR ***/ Servo servo; int ang; //ángulo del servomotor /*** CONTROLADOR ***/ float kp, kd, ki = 0; //constantes PD unsigned long t; /************************************/ void setup() { Serial.begin(9600); Serial.setTimeout(10); //tiempo menor que en millis - t > 50 Wire.begin(); sensor.init(); sensor.setTimeout(500); sensor.startContinuous(10); //una lectura cada x milisegundos servo.attach(9); //Pin del servo } /************************************/ void loop() { //Leer Sensor pos = sensor.readRangeContinuousMillimeters(); if (sensor.timeoutOccurred()){ Serial.print(" TIMEOUT"); Serial.println(); } //Filtro sensor if (pos > 450){pos = 450;} // De 0 a 450 //Cálculo del error if (e>80){kp = 0.2;} else{kp=0.7;} kd = 9; e = (pos - 210); //Introducir la distancia al punto de equilibrio (centro) ang = 1530 + (kp*e + kd*(e-ed)); // Introducir el ángulo en equilibrio (97) y sumo error ed = e; //Mover servo servo.writeMicroseconds(ang); }
Con esto terminamos la explicación/tutorial sobre nuestro querido Espasmitos. Os dejamos unos vídeos para que lo veáis en acción y os animamos a venir a cualquier jornada de puertas abiertas en la ETSII, días de Asociaciones o eventos como AULA para probarlo vosotros mismos. Como hemos dicho al principio, no dudéis en preguntarnos si queréis hacer uno vosotros y hay algo que no entendáis bien. Nuestras redes y correo están siempre abiertos al público. Por último, si queréis aprender más sobre Arduino para hacer proyectos como este y muchos otros, no dudéis en consultar nuestra página de tutoriales.