{"id":1301,"date":"2021-09-27T10:12:54","date_gmt":"2021-09-27T10:12:54","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=1301"},"modified":"2024-12-30T15:35:47","modified_gmt":"2024-12-30T15:35:47","slug":"sintonizar-pid-con-arduino-sistema-bola-viga","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/","title":{"rendered":"Sintonizar PID con Arduino \u2013 Sistema Bola-Viga"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u00cdndice<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Alternar tabla de contenidos\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Introduccion\" >Introducci\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Sistema_empleado\" >Sistema empleado<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Componentes\" >Componentes<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Sensor_de_distancia\" >Sensor de distancia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Servomotor\" >Servomotor<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Esquema_de_conexiones\" >Esquema de conexiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Codigo_de_Arduino\" >C\u00f3digo de Arduino<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Adecuando_la_senal_del_sensor\" >Adecuando la se\u00f1al del sensor<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Identificacion_del_sistema\" >Identificaci\u00f3n del sistema<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Metodo_del_rele_de_Astrom_y_Hagglund\" >M\u00e9todo del rel\u00e9 de Astr\u00f6m y H\u00e4gglund<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Sintonias_resultantes\" >Sinton\u00edas resultantes<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Resultados\" >Resultados<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Z-N_Pessen_Integral_Rule_PI-D\" >Z-N (Pessen Integral Rule) (PI-D)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Pettit_and_Carr_PI-D\" >Pettit and Carr (PI-D)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Tyreus_and_Luyben_PI-D\" >Tyreus and Luyben (PI-D)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Conclusiones\" >Conclusiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Descargas\" >Descargas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Referencias\" >Referencias<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Enlaces\" >Enlaces<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/#Libros_y_Publicaciones\" >Libros y Publicaciones<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\" id=\"introduccion\"><span class=\"ez-toc-section\" id=\"Introduccion\"><\/span>Introducci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Esta maqueta es un sistema muy empleado en el mundo educativo debido a que posee unas caracter\u00edsticas que la hacen muy interesante de analizar y sintonizar. Una caracter\u00edstica interesante es que su respuesta tiene car\u00e1cter integrador, lo que conlleva recurrir a m\u00e9todos de identificaci\u00f3n en lazo cerrado y solamente eso, ya nos saca de nuestra zona de confort. En este caso implementaremos un control <a href=\"http:\/\/www.dia.uned.es\/~fmorilla\/Web_FMorilla_Julio_2013\/MaterialDidactico\/El%20controlador%20PID.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">PID<\/a> pero podemos encontrar por la red controladores m\u00e1s sofisticados como el <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Linear%E2%80%93quadratic_regulator\" target=\"_blank\">LQR <\/a>o el <a rel=\"noreferrer noopener\" href=\"https:\/\/es.wikipedia.org\/wiki\/Control_lineal_cuadr%C3%A1tico_gaussiano\" target=\"_blank\">LQG<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sistema-empleado\"><span class=\"ez-toc-section\" id=\"Sistema_empleado\"><\/span>Sistema empleado<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La maqueta est\u00e1 realizada con piezas impresas en 3D para la ocasi\u00f3n y un par de varillas met\u00e1licas por donde se desliza la bola. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"137\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga-300x137.png\" alt=\"\" class=\"wp-image-1765\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga-300x137.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga-768x351.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga-590x270.png 590w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga.avif 772w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Maqueta Bola-Viga<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">El funcionamiento es muy sencillo, disponemos de un micro interruptor para cambiar entre modo manual y autom\u00e1tico, y de un potenci\u00f3metro que en modo manual mueve el \u00e1ngulo del servo y por ende la inclinaci\u00f3n de la viga (OP), y en modo autom\u00e1tico cambia el punto de consigna (SP) de posici\u00f3n de la bola en la viga. El objetivo es situar una bola en una posici\u00f3n determinada de la viga mediante un controlador PID.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga_control.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"191\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga_control-300x191.png\" alt=\"\" class=\"wp-image-1781\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga_control-300x191.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga_control-424x270.png 424w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Boceto03_bolaviga_control.avif 690w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Esquema de control<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"componentes\"><span class=\"ez-toc-section\" id=\"Componentes\"><\/span>Componentes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sensor de distancia<\/strong>.<\/li>\n\n\n\n<li><strong>Servomotor<\/strong>.<\/li>\n\n\n\n<li><strong>Micro interruptor<\/strong>.<\/li>\n\n\n\n<li><strong>Potenci\u00f3metro<\/strong>.<\/li>\n\n\n\n<li><strong>Arduino <\/strong>UNO o similar.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"sensor-de-distancia\"><span class=\"ez-toc-section\" id=\"Sensor_de_distancia\"><\/span>Sensor de distancia<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Investigando un poco que tipo de sensores de distancia asequibles existen para Arduino, encontr\u00e9 unos cuantos y muchos ejemplos de uso, pero es diferente cuando se hace una prueba de un sensor a cuando le das un uso en el que se requiere cierta precisi\u00f3n. De todo lo que encontr\u00e9 me quedo con cuatro sensores de los que os dejo una tabla comparativa.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/12\/Tabla_sensores.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"156\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/12\/Tabla_sensores-300x156.png\" alt=\"\" class=\"wp-image-1490\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/12\/Tabla_sensores-300x156.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/12\/Tabla_sensores-520x270.png 520w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/12\/Tabla_sensores.avif 560w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Tabla comparativa sensores de distancia<\/figcaption><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GP2Y0A21YK0F<\/strong>: Buena precisi\u00f3n incluso fuera de rango. Requiere calibraci\u00f3n. Requiere objetos (en este caso bolas) de mayor dimensi\u00f3n para medir correctamente.<\/li>\n\n\n\n<li><strong>TOF10120<\/strong>: Buena precisi\u00f3n incluso fuera de rango. La se\u00f1al necesita ser tratada para hacer control con ella.<\/li>\n\n\n\n<li><strong>VL53L0X<\/strong>: Buena precisi\u00f3n incluso fuera de rango. La se\u00f1al necesita ser tratada para hacer control con ella.<\/li>\n\n\n\n<li><strong>HC-SR04<\/strong>: Buena precisi\u00f3n incluso fuera de rango. Requiere objetos (en este caso bolas) de mayor dimensi\u00f3n para medir correctamente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Con cualquiera de ellos se pueden conseguir resultados aceptables pero yo finalmente eleg\u00ed el sensor <a href=\"https:\/\/www.st.com\/resource\/en\/datasheet\/vl53l0x.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">VL53L0X<\/a> por utilizar un sensor diferente al que solemos encontrar en este tipo de maquetas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"servomotor\"><span class=\"ez-toc-section\" id=\"Servomotor\"><\/span>Servomotor<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\" style=\"grid-template-columns:20% auto\"><figure class=\"wp-block-media-text__media\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995-300x300.jpg\" alt=\"\" class=\"wp-image-1411 size-medium\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995-300x300.jpg 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995-150x150.jpg 150w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995-768x768.jpg 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995-270x270.jpg 270w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2021\/10\/mg995.avif 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-normal-font-size wp-block-paragraph\">En esta ocasi\u00f3n he utilizado un <a rel=\"noreferrer noopener\" href=\"https:\/\/www.electronicoscaldas.com\/datasheet\/MG995_Tower-Pro.pdf\" target=\"_blank\">servo MG995<\/a> con un torque de entre 8,5 y 10 Kg\/cm, pero valdr\u00eda cualquier otro de caracter\u00edsticas similares. En la parte de programaci\u00f3n se opera con microsegundos en lugar de con \u00e1ngulos para ganar precisi\u00f3n.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">El coste de la maqueta puede oscilar entre 30 y 50\u20ac dependiendo del servo y Arduino elegidos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"esquema-de-conexiones\"><span class=\"ez-toc-section\" id=\"Esquema_de_conexiones\"><\/span>Esquema de conexiones<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"599\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-1024x599.png\" alt=\"\" class=\"wp-image-1767\" style=\"width:498px;height:auto\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-1024x599.png 1024w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-300x175.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-768x449.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-1536x898.png 1536w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-2048x1198.png 2048w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Conexiones_bolaViga_VL53L0X_bb-462x270.png 462w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Conexiones del sistema<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"codigo-de-arduino\"><span class=\"ez-toc-section\" id=\"Codigo_de_Arduino\"><\/span>C\u00f3digo de Arduino<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/***************************************************************\n* Desarrollado por Garikoitz Mart\u00ednez [garikoitz.info] [06\/2022]\n* https:\/\/garikoitz.info\/blog\/?p=1301\n***************************************************************\/\n\/***************************************************************\n* Librer\u00edas\n***************************************************************\/\n#include &lt;Wire.h>\n#include &lt;PID_v1.h>\n#include \"Adafruit_VL53L0X.h\"\n#include &lt;Servo.h>\n\/***************************************************************\n* Variables\n***************************************************************\/\nServo myservo;\nconst int Interruptor = 12;\nunsigned long previousMillis = 0; \nint Ts = 50, pos = 0;\nunsigned long contador = 0; \n\/\/Control PID\nboolean modo = false;                       \/\/false=auto true=manual\nfloat tmp=0.0, tmp_ant=0.0, OP=0, angulo=0.0, angulo_ant=0.0, media=0.0;\ndouble SetpointP, InputP, OutputP;\n\/***************************************************************\n* Sinton\u00edas calculadas (Rel\u00e9 --> Ku=0.99 y Tu=4.6 segundos)\n***************************************************************\/\n\/\/double Kc=0.59, Ki=0.26, Kd=0.34; \t\/\/Z-N classic PID\n\/\/double Kc=0.69, Ki=0.38, Kd=0.48; \t\/\/Z-N Pessen Integral Rule \n\/\/double Kc=0.33, Ki=0.14, Kd=0.49; \t\/\/Z-N some overshoot\n\/\/double Kc=0.20, Ki=0.09, Kd=0.30; \t\/\/Z-N no overshoot\n\/\/double Kc=0.33, Ki=0.07, Kd=0.15;\t\t\/\/Farrington\n\/\/double Kc=0.49, Ki=0.11, Kd=0.57;\t\t\/\/Farrington\n\/\/double Kc=0.53, Ki=0.12, Kd=0.49;\t\t\/\/McAvoy and Johnson\n\/\/double Kc=0.25, Ki=0.07, Kd=0.28;\t\t\/\/Atkinson and Davey (20% overshoot)\n\/\/double Kc=0.99, Ki=0.43, Kd=0.57;\t\t\/\/Pettit and Carr (Underdamped)\n\/\/double Kc=0.66, Ki=0.14, Kd=0.50;\t\t\/\/Pettit and Carr (Critically damped)\n\/\/double Kc=0.49, Ki=0.07, Kd=0.38;\t\t\/\/Pettit and Carr (Overdamped)\n\/\/double Kc=0.44, Ki=0.16, Kd=0.38;\t\t\/\/Tinham (Less than quarter decay ratio response)\n\/\/double Kc=0.74, Ki=0.26, Kd=0.34;\t\t\/\/Corripio (Quarter decay ratio)\n\/\/double Kc=0.62, Ki=0.27, Kd=0.24;\t\t\/\/ABB (P+D tuning rule)\n\/\/double Kc=0.45, Ki=0.04, Kd=0.33;\t\t\/\/Tyreus and Luyben\n\/\/double Kc=0.33, Ki=0.14, Kd=0.19;\t\t\/\/Yu (Some overshoot)\n\/\/double Kc=0.20, Ki=0.09, Kd=0.11;\t\t\/\/Yu (No overshoot)\n\/\/double Kc=0.74, Ki=0.26, Kd=0.34;\t\t\/\/Smith\n\/\/double Kc=0.99, Ki=0.34, Kd=0.45;\t\t\/\/Alfaro Ruiz (Quarter decay ratio)\n\/\/double Kc=1.65, Ki=0.57, Kd=0.76;\t\t\/\/Alfaro Ruiz (Quarter decay ratio)\n\/\/double Kc=0.39, Ki=0.09, Kd=0.29;\t\t\/\/Lloyd (Non self-regulating processes)\n\/\/double Kc=0.59, Ki=0.26, Kd=0.33;\t\t\/\/NI Labview (Quarter decay ratio)\n\/\/double Kc=0.25, Ki=0.11, Kd=0.14;\t\t\/\/NI Labview (Some overshoot)\n\/\/double Kc=0.15, Ki=0.06, Kd=0.08;\t\t\/\/NI Labview (Little overshoot)\n\/\/---------------------------------------------------------------\ndouble Kc=0.45, Ki=0.1, Kd=0.35;    \t\/\/Tyreus and Luyben mod\n\/\/---------------------------------------------------------------\nPID myPID(&amp;InputP, &amp;OutputP, &amp;SetpointP, Kc, Ki, Kd,P_ON_E, REVERSE);\/\/PI-D\n\/\/PID myPID(&amp;InputP, &amp;OutputP, &amp;SetpointP, Kc, Ki, Kd,P_ON_M, REVERSE);  \/\/I-PD\n\/\/\nAdafruit_VL53L0X lox = Adafruit_VL53L0X();\n\/***************************************************************\n* SETUP\n***************************************************************\/\nvoid setup() \n{ \n  Wire.begin();\n  if (!lox.begin()) {\n    Serial.println(F(\"Error al conectar al sensor VL53L0X\"));\n    while(1);\n  }\n  lox.startRangeContinuous();\n  myservo.attach(3); \/\/ asignamos el pin al servo.\n  Serial.begin(9600);\n  myPID.SetOutputLimits(0, 100);\n  SetpointP = 70;\n}\n\/***************************************************************\n* BUCLE PRINCIPAL\n***************************************************************\/\nvoid loop() \n{\n  VL53L0X_RangingMeasurementData_t measure;\n  lox.rangingTest(&amp;measure, false);\n  if (measure.RangeStatus != 4) {\n    \/\/media =  measure.RangeMilliMeter;\n    media = Rolling_avg(measure.RangeMilliMeter);\n    media = media * 0.1; \/\/Pasamos a cm\n  }\n  if (millis() - previousMillis > Ts) \/\/Bucle de control cada Ts milisegundos\n  {\n    previousMillis = millis();\n    contador +=1;\n    if (digitalRead(12) == HIGH){\n      modo=true;                              \/\/Modo Manual\n      myPID.SetMode(MANUAL);\n    }else{\n      modo=false;                             \/\/Modo Autom\u00e1tico\n      myPID.SetMode(AUTOMATIC);\n    }\n      InputP = mapf(media, 2, 26, 0, 100);    \/\/PV en cm a porcentaje\n      \/\/InputP = media;\n    \/***************************************************************\n    * Modo MANUAL - Potenci\u00f3metro ---> \u00c1ngulo Servo\n    ***************************************************************\/\n    if (modo==true){\n      \/\/----------------------\n      \/\/   M\u00e9todo del Rel\u00e9\n      \/\/----------------------\n      if (1){\n         if (InputP &lt;60){\n          pos=950;                       \/\/arriba -> bola hacia la izq\n          myservo.writeMicroseconds(pos);  \n         }else if (InputP >60){     \n          pos=1475;                       \/\/abajo -> bola hacia la dcha\n          myservo.writeMicroseconds(pos);  \n         }\n         OP = mapf(pos, 850, 1575, 0, 100);\n      }\n      \/\/----------------------\n      \/\/     Potenci\u00f3metro \n      \/\/----------------------\n      if (0){\n        SetpointP=0;\n        tmp = analogRead(A1);\n        tmp = mapf(tmp, 1023.0, 0.0, 850, 1575);        \/\/ escalamos potenciometro al servo\n        if(abs(tmp-tmp_ant)>1){\n          angulo = tmp;\n        }\n        tmp_ant=angulo;\n        OP = mapf(tmp,850, 1575, 0, 100);\n        if (angulo>=850 || angulo&lt;=1575) myservo.writeMicroseconds(angulo);\n      }   \n      \/***************************************************************\n      * DEBUG PUERTO SERIE (Para Arduino COM Plotter)\n      ***************************************************************\/\n      Serial.print(\"#\");              \/\/Char inicio\n      Serial.print(0);                \/\/SP\n      Serial.write(\" \");              \/\/Char separador\n      Serial.print(InputP,0);         \/\/PV InputP\n      Serial.write(\" \");              \/\/Char separador\n      Serial.print(OP,0);             \/\/OP\n      Serial.println();\n      }\n      \/***************************************************************\n      * Modo AUTOM\u00c1TICO - PID\n      ***************************************************************\/\n      if (modo==false){\n\t\tif (0){\t\/\/SetPoint mediante Potenci\u00f3metro\n\t\t\ttmp = analogRead(A1);\n\t\t\ttmp = mapf(tmp, 0.0, 1023.0, 0, 100);\n\t\t\tif(abs(tmp-tmp_ant)>4){\n\t\t\t\tSetpointP = tmp;\n\t\t\t}\n\t\t\ttmp_ant=SetpointP;\n\t\t}\n\t\tif (1){\n\t\t\t\/\/ SetpointP automatizado\n\t\t\tif (contador &lt; 1000) SetpointP = 70;  \n\t\t\tif (contador >= 1000 &amp;&amp; contador &lt; 2000) SetpointP = 60; \n\t\t\tif (contador >= 2000 &amp;&amp; contador &lt; 3000) SetpointP = 50; \n\t\t\tif (contador >= 3000 &amp;&amp; contador &lt; 4000) SetpointP = 60; \n\t\t\tif (contador > 4000) contador = 0;\n\t\t}\n        \n        angulo = mapf(OutputP, 0, 100, 850, 1575);\n\t\t\n        if (abs(SetpointP-InputP)>5){   \/\/Banda muerta del 5%\n          myPID.Compute();\n          myservo.writeMicroseconds(angulo);\n          angulo_ant = angulo;  \n        }else{\n          myservo.writeMicroseconds(angulo_ant); \n        }\n\t\t\n        \/***************************************************************\n        * DEBUG PUERTO SERIE (Para Arduino COM Plotter)\n        ***************************************************************\/\n        Serial.print(\"#\");                \/\/Char inicio\n        Serial.print(SetpointP,0);        \/\/SP\n        Serial.write(\" \");                \/\/Char separador\n        Serial.print(InputP,0);           \/\/PV\n        Serial.write(\" \");                \/\/Char separador\n        Serial.print(OutputP,0);          \/\/OP\n        Serial.println();  \n      }\n  }\/\/millis            \n}\/\/Loop\n\/***************************************************************\n* FUNCIONES\n***************************************************************\/\n\/\/Funci\u00f3n MAP adaptada a punto flotante.\ndouble mapf(double val, double in_min, double in_max, double out_min, double out_max) {\n    return (val - in_min) * (out_max - out_min) \/ (in_max - in_min) + out_min;\n}\n\/\/High-pass Filter\n    \/\/A low \u03b1 will be very slow to rapid input changes and take many samples into account. \n    \/\/A high \u03b1 will be fast, but average over fewer samples. You can look at \u03b1 as kind of a cutoff frequency in a low-pass filter.\n    \/\/OP = HPS(tmp,0.1,EMA_s_pot);\n    \/\/OP = tmp-EMA_s_pot;\ndouble HPS(double sensorValue, float EMA_a, int EMA_S) {\n    return (EMA_a*sensorValue) + ((1-EMA_a)*EMA_S);\n}\n\/\/Funci\u00f3n Promedio\nfloat Rolling_avg(float value) {\n  const byte nvalues = 10;             \/\/ Moving average window size\n  static byte current = 0;            \/\/ Index for current value\n  static byte cvalues = 0;            \/\/ Count of values read (&lt;= nvalues)\n  static float sum = 0;               \/\/ Rolling sum\n  static float values[nvalues];\n  sum += value;\n  if (cvalues == nvalues)\n    sum -= values[current];\n  values[current] = value;          \/\/ Replace the oldest with the latest\n  if (++current >= nvalues)\n    current = 0;\n  if (cvalues &lt; nvalues)\n    cvalues += 1;\n  return sum\/cvalues;\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"adecuando-la-senal-del-sensor\"><span class=\"ez-toc-section\" id=\"Adecuando_la_senal_del_sensor\"><\/span>Adecuando la se\u00f1al del sensor<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La se\u00f1al del sensor por defecto presenta bastante ruido por lo que para hacer control con ella he optado en esta ocasi\u00f3n por la implementaci\u00f3n de una funci\u00f3n promedio que nos devuelve una se\u00f1al m\u00e1s limpia. En realidad la funci\u00f3n realiza una media m\u00f3vil en la que podemos especificar el n\u00famero de medidas que intervienen para adecuar el resultado a nuestras necesidades.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"identificacion-del-sistema\"><span class=\"ez-toc-section\" id=\"Identificacion_del_sistema\"><\/span>Identificaci\u00f3n del sistema<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center\" style=\"grid-template-columns:auto 34%\"><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Como hemos comentado, la identificaci\u00f3n es diferente a maquetas anteriores debido a que <strong>tiene un comportamiento integrador<\/strong>, me explico, si alteramos el \u00e1ngulo de la viga la bola se mover\u00e1 en una direcci\u00f3n y no parar\u00e1. En maquetas anteriores los sistemas ten\u00edan respuesta autorregulada, lo que les hac\u00eda llegar a una situaci\u00f3n estable con el tiempo ante cualquier alteraci\u00f3n. <\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/AutorreVSIntv2.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/AutorreVSIntv2.png\" alt=\"\" class=\"wp-image-1776 size-full\"\/><\/a><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfQu\u00e9 significa esto?, pues que principalmente no podemos recurrir a realizar una identificaci\u00f3n de saltos escal\u00f3n (en lazo abierto) y obtener las constantes del sistema como en maquetas anteriores, nos vemos obligados a recurrir a otras t\u00e9cnicas de lazo cerrado como el de oscilaci\u00f3n mantenida de <a href=\"https:\/\/www.wikiwand.com\/en\/John_G._Ziegler\" target=\"_blank\" rel=\"noreferrer noopener\">Ziegler <\/a>y <a href=\"https:\/\/www.wikiwand.com\/en\/Nathaniel_B._Nichols\" target=\"_blank\" rel=\"noreferrer noopener\">Nichols <\/a>o el del rel\u00e9 de <a href=\"https:\/\/scholar.google.es\/citations?user=ZS-RjQsAAAAJ&amp;hl=es\" target=\"_blank\" rel=\"noreferrer noopener\">Astr\u00f6m <\/a>y <a href=\"https:\/\/scholar.google.es\/citations?user=qzGsdrQAAAAJ&amp;hl=es\" target=\"_blank\" rel=\"noreferrer noopener\">H\u00e4gglund<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"metodo-del-rele-de-astrom-y-hagglund\"><span class=\"ez-toc-section\" id=\"Metodo_del_rele_de_Astrom_y_Hagglund\"><\/span>M\u00e9todo del rel\u00e9 de Astr\u00f6m y H\u00e4gglund <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Este m\u00e9todo consiste en programar un rel\u00e9, en nuestro caso moviendo el servo de igual forma en ambos sentidos. Lo interesante es conseguir la oscilaci\u00f3n continua sin llegar a los l\u00edmites 0-100% de la PV. Del ensayo obtenemos 3 datos que nos sirven para estimar las ganancias del controlador PID, la <strong>amplitud de la PV (a)<\/strong>, la <strong>amplitud de la OP (d)<\/strong> y el <strong>periodo de oscilaci\u00f3n (Tc)<\/strong>. Se ha usado un rel\u00e9 ideal sin hist\u00e9resis.<\/p>\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"lyte-wrapper fourthree\" style=\"width:420px;max-width:100%;margin:5px;\"><div class=\"lyMe\" id=\"WYL_QZ0CDWbWw8Y\"><div id=\"lyte_QZ0CDWbWw8Y\" data-src=\"\/\/i.ytimg.com\/vi\/QZ0CDWbWw8Y\/hqdefault.jpg\" class=\"pL\"><div class=\"tC\"><div class=\"tT\"><\/div><\/div><div class=\"play\"><\/div><div class=\"ctrl\"><div class=\"Lctrl\"><\/div><div class=\"Rctrl\"><\/div><\/div><\/div><noscript><a href=\"https:\/\/youtu.be\/QZ0CDWbWw8Y\" rel=\"nofollow\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i.ytimg.com\/vi\/QZ0CDWbWw8Y\/0.jpg\" alt=\"YouTube video thumbnail\" width=\"420\" height=\"295\" \/><br \/>Ver este v\u00eddeo en YouTube<\/a><\/noscript><\/div><\/div><div class=\"lL\" style=\"max-width:100%;width:420px;margin:5px;\"><\/div><figcaption>M\u00e9todo del rel\u00e9 implementado<\/figcaption><\/figure>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"149\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1-300x149.png\" alt=\"\" class=\"wp-image-1771\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1-300x149.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1-768x382.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1-543x270.png 543w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/ACP_Rele3-1.avif 939w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Datos obtenidos mediante el m\u00e9todo del rel\u00e9<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Los datos obtenidos del ensayo son <strong>a = 93%, d = 72% y Tc = 4,6 segundos<\/strong>, con los cuales calcularemos la ganancia \u00faltima <strong>Ku<\/strong> y el periodo de oscilaci\u00f3n \u00faltimo <strong>Tu<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-katex-display-block katex-eq\" data-katex-display=\"true\"><pre>\\begin{align}\n&amp; Ku = \\frac{4d}{\\pi a}=\\frac{4\\times 72}{\\pi\\times 93}=0.99\\\\\n&amp; Tu = Tc = 4.6 segundos\n\\end{align}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Con Ku y Tu podemos calcular la sinton\u00eda del controlador siguiendo las reglas de Ziegler y Nichols entre otras.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sintonias-resultantes\"><span class=\"ez-toc-section\" id=\"Sintonias_resultantes\"><\/span>Sinton\u00edas resultantes <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"172\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46-300x172.png\" alt=\"\" class=\"wp-image-1773\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46-300x172.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46-768x440.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46-472x270.png 472w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/SintKu099Tu46.avif 856w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"resultados\"><span class=\"ez-toc-section\" id=\"Resultados\"><\/span>Resultados<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Me gustar\u00eda aprovechar la ocasi\u00f3n para recordar que las sinton\u00edas calculadas ya sea en lazo abierto como en lazo cerrado son un punto de partida de las que con peque\u00f1os retoques se consigue la sinton\u00eda \u00abfinal\u00bb. Este es el ejemplo perfecto ya que la mayor\u00eda de las sinton\u00edas necesitan retocar alguno de los t\u00e9rminos para que el resultado sea aceptable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n unos comentarios sobre tres sinton\u00edas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"chen-lambda-i-pd\"><span class=\"ez-toc-section\" id=\"Z-N_Pessen_Integral_Rule_PI-D\"><\/span>Z-N (Pessen Integral Rule) (PI-D)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La combinaci\u00f3n de <em>alta <\/em>ganancia integral y derivativa hace que el servo se mueva demasiado, no consiguiendo estabilizar cerca del setpoint en la mayor\u00eda de los casos.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"146\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd-300x146.png\" alt=\"\" class=\"wp-image-1784\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd-300x146.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd-768x373.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd-556x270.png 556w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_demasiadaKiyKd.avif 961w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Sinton\u00eda usada: Kc = 0,59 Ki = 0,26 Kd = 0,34 (Demasiada Ki y Kd)<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"lee-y-sung-lambda-i-pd\"><span class=\"ez-toc-section\" id=\"Pettit_and_Carr_PI-D\"><\/span>Pettit and Carr (PI-D)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se aprecia una gran mejor\u00eda comparada con la anterior aunque da la impresi\u00f3n de que la ganancia integral es algo peque\u00f1a.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"146\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben-300x146.png\" alt=\"\" class=\"wp-image-1786\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben-300x146.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben-768x373.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben-556x270.png 556w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben.avif 961w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Sinton\u00eda usada: Kc = 0,49 Ki = 0,07 Kd = 0,38<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tyreus_and_Luyben_PI-D\"><\/span>Tyreus and Luyben (PI-D)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Es la sinton\u00eda que mejores resultados arroja aunque le falta un poco de ganancia integral. A\u00fan as\u00ed, dependiendo de donde queramos estabilizar la bola, no siempre conseguimos una estabilidad total.<\/p>\n\n\n<div class=\"wp-block-image is-resized\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"146\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod-300x146.png\" alt=\"\" class=\"wp-image-1787\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod-300x146.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod-768x373.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod-556x270.png 556w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/BV_TyreusandLuyben_mod.avif 961w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Sinton\u00eda usada: Kc = 0,45 Ki = 0,04 Kd = 0,33<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Al probar las sinton\u00edas he llegado a la conclusi\u00f3n de que nos podemos mover entre:<\/p>\n\n\n\n<div class=\"wp-block-katex-display-block katex-eq\" data-katex-display=\"true\"><pre>\\begin{align}\n&amp; 0.3\\leq K{c} \\leq 0.65\\\\\n&amp; 0.1\\leq K{i} \\leq 0.15\\\\\n&amp; 0.3\\leq K{d} \\leq 0.45\\\\\n\\end{align}<\/pre><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Tabla_ranking.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"214\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Tabla_ranking-300x214.png\" alt=\"\" class=\"wp-image-1789\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Tabla_ranking-300x214.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Tabla_ranking-378x270.png 378w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/06\/Tabla_ranking.avif 666w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Ranking<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusiones\"><span class=\"ez-toc-section\" id=\"Conclusiones\"><\/span>Conclusiones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tengo que reconocer que llevaba tiempo detr\u00e1s de la realizaci\u00f3n de esta maqueta y que como esperaba, ha sido puro disfrute. Ya inicialmente, el que <strong>no sea un sistema auto regulado<\/strong> nos hace salir de la zona de confort e ingeni\u00e1rnoslas para programar un rel\u00e9 y empezar a obtener sinton\u00edas. Una vez que tenemos las sinton\u00edas, nos vemos obligados a probar varias para familiarizarnos con el punto en que podemos considerar las ganancias altas o bajas y conseguir resultados aceptables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La verdad es que es una maqueta en la que es dif\u00edcil presentar unos resultados \u00abbonitos\u00bb en cuanto a las gr\u00e1ficas se refiere. <strong>No es dif\u00edcil de estabilizar la bola en el centro<\/strong>, de hecho, mediante prueba error podemos obtener una sinton\u00eda decente en pocos minutos, pero ya sab\u00e9is que lo que realmente me interesa es la obtenci\u00f3n de sinton\u00edas mediante m\u00e9todos anal\u00edticos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"descargas\"><span class=\"ez-toc-section\" id=\"Descargas\"><\/span>Descargas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Archivos del proyecto<\/strong> (1.69MB) [<a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/BolaViga.7z\">Descargar<\/a>] [<a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/\" target=\"_blank\" rel=\"noreferrer noopener\">Carpeta<\/a>]\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/BolaViga_3Dfiles.7z\">Fuentes impresi\u00f3n 3D<\/a><\/strong>. Los archivos 3D son modificaciones de los creados por <a href=\"https:\/\/github.com\/HenarB\/controldedistanciapelota\/tree\/master\/3D%20files\" target=\"_blank\" rel=\"noreferrer noopener\">Henar Brenlla<\/a> para su proyecto fin de grado. Os dejo mis STLs y los archivos fuente de Solid Edge.<\/li>\n\n\n\n<li><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/BolaViga_conexiones_VL53L0X.fzz\">Esquema de <strong>conexiones <\/strong>Fritzing<\/a>.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/BolaViga_TOF_VL53L0X.ino\" target=\"_blank\" rel=\"noreferrer noopener\">C\u00f3digo de Arduino<\/a><\/strong>.<\/li>\n\n\n\n<li><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/BolaViga\/BolaViga_Sinton%c3%adas_KuTu.xlsx\"><strong>Excel <\/strong>con las <strong>sinton\u00edas<\/strong> calculadas<\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"referencias\"><span class=\"ez-toc-section\" id=\"Referencias\"><\/span>Referencias<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"enlaces\"><span class=\"ez-toc-section\" id=\"Enlaces\"><\/span>Enlaces<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/garikoitz.info\/blog\/2020\/05\/arduino-com-plotter\/\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino Com Plotter (ACP)<\/a> [garikoitz.info]<\/li>\n\n\n\n<li><a href=\"https:\/\/roble.uno\/control-pid-barra-y-bola-arduino\/\" target=\"_blank\" rel=\"noreferrer noopener\">Control PID de Barra y Bola con Arduino<\/a> [Estudio Roble]<\/li>\n\n\n\n<li>PID Seesaw <a href=\"https:\/\/www.norwegiancreations.com\/2016\/08\/pid-seesaw-part-1-the-design\/\" target=\"_blank\" rel=\"noreferrer noopener\">part 1<\/a> and <a href=\"https:\/\/www.norwegiancreations.com\/2016\/08\/the-seesaw-part-2-basic-pid-theory-and-arduino-implementation\/\" target=\"_blank\" rel=\"noreferrer noopener\">part 2<\/a> [Norwegian Creations]<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/HenarB\/controldedistanciapelota\" target=\"_blank\" rel=\"noreferrer noopener\">Control distancia pelota<\/a> [Henar Brenlla]<\/li>\n\n\n\n<li><a href=\"http:\/\/mechatronicstutorials.blogspot.com\/2014\/07\/balancing-of-ball-on-beam-using-arduino.html\" target=\"_blank\" rel=\"noreferrer noopener\">Balancing of a Ball on Beam using Arduino as a PID controller<\/a> [Mechatronics Tutorials]<\/li>\n\n\n\n<li><a href=\"https:\/\/www.electroniclinic.com\/tof10120-laser-rangefinder-arduino-display-interfacing-code\/\" target=\"_blank\" rel=\"noreferrer noopener\">TOF10120 laser Rangefinder interfacing &amp; code<\/a> [Engr Fahad]<\/li>\n\n\n\n<li><a href=\"https:\/\/www.dia.uned.es\/~fmorilla\/MaterialDidactico\/P2000_PID_Presentaciones.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Ajuste emp\u00edrico de controladores PID- M\u00e9todo del rel\u00e9 (p\u00e1g. 14)<\/a> [Fernando Morilla]<\/li>\n\n\n\n<li><a href=\"https:\/\/revistas.ucr.ac.cr\/index.php\/ingenieria\/article\/view\/604\/665\" target=\"_blank\" rel=\"noreferrer noopener\">Identificaci\u00f3n de procesos sobreamortiguados utilizando t\u00e9cnicas de lazo cerrado<\/a> [V\u00edctor M. Alfaro]<\/li>\n\n\n\n<li><a href=\"https:\/\/garikoitz.info\/blog\/2022\/05\/introduccion-al-algoritmo-pid-y-su-implementacion-en-arduino\/\" target=\"_blank\" rel=\"noreferrer noopener\">Introducci\u00f3n al algoritmo PID y su implementaci\u00f3n en Arduino<\/a> [garikoitz.info]<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"libros-y-publicaciones\"><span class=\"ez-toc-section\" id=\"Libros_y_Publicaciones\"><\/span>Libros y Publicaciones<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">[1] Karl J. Astrom, Tore Hagglund. Control PID avanzado, Pearson, ISBN: 978-84-8322-511-0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[2] Myke King. \u00ab<em>Process Control &#8211; A Practical Approach<\/em>\u00ab, 2nd Edition, Chapter&nbsp;2.4, Integrating Processes and Chapter 3.23, Suggested Tuning Method for Integrating Processes, Wiley, ISBN: 9781119157755<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[3] O&#8217;Dwyer, Aidan. Handbook of PI and PID Controller Tuning Rules. 3rd Edition, Chapter 3.10, Non-Model Specific. Imperial College Press, ISBN: 978-1-84816-242-6<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci&oacute;n Esta maqueta es un sistema muy empleado en el mundo educativo debido a que posee unas caracter&iacute;sticas que la hacen muy interesante de analizar y sintonizar. Una caracter&iacute;stica interesante es que su respuesta tiene car&aacute;cter integrador, lo que conlleva recurrir a m&eacute;todos de identificaci&oacute;n en lazo cerrado y solamente eso, ya nos saca de nuestra zona de confort. En este caso implementaremos un control PID pero podemos encontrar por la red controladores m&aacute;s sofisticados como el LQR o el&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2021\/09\/sintonizar-pid-con-arduino-sistema-bola-viga\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1783,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"footnotes":""},"categories":[15],"tags":[16,121,116,124,22,143,120,118,123,122,142,17,126,117,119,125],"class_list":["post-1301","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","tag-arduino","tag-ball-beam","tag-bola-viga","tag-gp2y0a21yk0f","tag-hc-sr04","tag-i-pd","tag-metodo-del-rele","tag-mg995","tag-pd","tag-pi","tag-pi-d","tag-pid","tag-servo","tag-sistema-integrador","tag-tof10120","tag-vl53l0x"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/comments?post=1301"}],"version-history":[{"count":84,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1301\/revisions"}],"predecessor-version":[{"id":2372,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1301\/revisions\/2372"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/1783"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=1301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=1301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=1301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}