{"id":2215,"date":"2024-03-18T23:28:46","date_gmt":"2024-03-18T23:28:46","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=2215"},"modified":"2024-12-02T20:49:16","modified_gmt":"2024-12-02T20:49:16","slug":"sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/","title":{"rendered":"SINTONIZAR PID CON ARDUINO \u2013 Control de posici\u00f3n de una pelota en levitaci\u00f3n"},"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\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#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\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Componentes\" >Componentes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Esquema_de_conexion\" >Esquema de conexi\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Montaje\" >Montaje<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Identificacion\" >Identificaci\u00f3n<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Adecuacion_de_la_senal_del_sensor_de_distancia\" >Adecuaci\u00f3n de la se\u00f1al del sensor de distancia<\/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\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Limitaciones_del_sensor_de_distancia\" >Limitaciones del sensor de distancia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Ajuste_de_la_senal_PWM\" >Ajuste de la se\u00f1al PWM<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Identificacion_de_un_proceso_integrador\" >Identificaci\u00f3n de un proceso integrador<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Control_PID\" >Control PID<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Esquema_de_control\" >Esquema de control<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Implementacion\" >Implementaci\u00f3n<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Conclusiones\" >Conclusiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Enlaces\" >Enlaces<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/#Libros_y_publicaciones\" >Libros y publicaciones<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><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\">Recientemente, me encontr\u00e9 por casualidad con un v\u00eddeo que mostraba c\u00f3mo un secador de pelo puede hacer levitar una pelota de ping-pong, ilustrando el principio de Bernoulli. Esto despert\u00f3 mi curiosidad sobre la posibilidad de ajustar la potencia del secador para controlar la altura a la que se mantiene la pelota. Inspirado por esta idea, esa misma noche comenc\u00e9 a experimentar con algunos componentes que ten\u00eda guardados y, poco a poco, di forma a la maqueta que les presento hoy. Es un proyecto bastante sencillo de realizar, aunque presenta algunos desaf\u00edos a la hora de identificar el sistema. La maqueta consiste en una pelota de ping-pong situada dentro de un tubo, la cual se eleva venciendo la fuerza de la gravedad gracias al aire suministrado por un ventilador.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Componentes\"><\/span>Componentes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Arduino UNO<\/strong> <strong>R3<\/strong>.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.amazon.es\/dp\/B09JBJ824V?psc=1&amp;ref=ppx_yo2ov_dt_b_product_details\" target=\"_blank\" rel=\"noreferrer noopener\">Tubo transparente<\/a><\/strong>. Yo he usado uno de 305mm de longitud con di\u00e1metro interno de 42mm para que pueda alojar una pelota de ping-pong de 40mm de di\u00e1metro.<\/li>\n\n\n\n<li><strong>Sensor de medida<\/strong>. La implementaci\u00f3n final est\u00e1 realizada con el viejo conocido <strong><a href=\"https:\/\/www.amazon.es\/Ultrasonidos-Arduino-Medidor-Distancia-Ultrasonico\/dp\/B075MDMDL2\/ref=sr_1_8?crid=F8I9P0YYYQE0&amp;dib=eyJ2IjoiMSJ9.hy8l4o8DzdWrV_mW0mQRT5n6dgqG5Iz-PLnh_hbCA9GIhq_V9TksYfC0RP0c4hwORHSnI3w88IQSe5lhg0XjIINZm6Jj7SesuX9YzNbkTg9K7HrEy-pjvFj7uCWqfy6Fiba3_tu3roPEK17OfAVGmVrOl7d1iYMMYSViSouHiX1IIzTO9yeDdM58yW3MWJSPH6LXmSOXsJeF0YhyxTJmfbl8kU1PNrZAHHTHEZKxcl7YkpmugKlBY5pfu5S9LEIipwqwQ-mDlvPMnMSjdNXhZTCFZhChH0HO6TjDWsiPPQw.K19kdxK4PuRWvAkNbAxXpqcchyw05QkS5PAnJEXe8EU&amp;dib_tag=se&amp;keywords=hcsr04&amp;qid=1709586478&amp;sprefix=hc%2Caps%2C145&amp;sr=8-8\" target=\"_blank\" rel=\"noreferrer noopener\">HC-SR04<\/a><\/strong> aunque os dejo en la carpeta del proyecto el c\u00f3digo con el sensor gemelo <strong><a href=\"https:\/\/www.amazon.es\/Ultras%C3%B3nico-Reemplazo-Distancia-El%C3%A9ctrica-Anal%C3%B3gico\/dp\/B0C9YLK2F2\/ref=sr_1_2?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=250PXECQJB2GY&amp;dib=eyJ2IjoiMSJ9.m-T10KIB0eDbAtTF5hxOBo5LyBeIWQs7qWiXn_eCT6tdUuiaN_pyvXRcAcdWhq_DX-xX8OVrssAs2aoLOtV8klcCjNcV1qqIdwZeNkp0KTDswoRp6eXQWKLcWzT03bZM8NM5L6tdnQeQpzi9qv4iNudQEyfKvj05XCtJh7aRMeaKRelZbjwP2r19gHnRNaLDTyahvdoL3Bu80sARraadlVdv3Nl3mdeO6HkBBDgJ6nTDaVV7QI70psK9CGJm2dGFerW638H4Xwy4F3RubwccLxwjYZ0yBRFzwnOhY-bUKx4.452DZXcAiQ_29X1Ma33C1BmQFNQWiA1I2_xgccBDo4o&amp;dib_tag=se&amp;keywords=us-016&amp;qid=1709586530&amp;sprefix=us-016%2Caps%2C117&amp;sr=8-2-spons&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;psc=1\" target=\"_blank\" rel=\"noreferrer noopener\">US-016<\/a><\/strong>. La diferencia entre ambos es que el HC-SR04 usa dos pines digitales mientras que el US-016 usa un pin anal\u00f3gico.<\/li>\n\n\n\n<li><strong>Ventilador<\/strong>. He usado un <a href=\"https:\/\/www.amazon.es\/dp\/B09RK64BQH?ref=ppx_yo2ov_dt_b_product_details&amp;th=1\" target=\"_blank\" rel=\"noreferrer noopener\">Arctic S4028-15K<\/a> de 40x40x28mm y la verdad que me he quedado muy impresionado de la gran calidad que ofrece por unos m\u00edseros 12\u20ac. Ya de saque nos ofrece velocidades de entre 1400 y 15000 RPMs, conexi\u00f3n de 4 pines con sensor y PWM, cable de 40cm y podemos alimentarlo de 5 a 12V con un consumo de menos de media amperio, vamos que no tiene un pero. Eso s\u00ed, si quieres las 15000 RPMs tienes que alimentarlo a 12V, pero es que a 5V te da 7000 RPMs, vamos, una maravilla.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"221\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM-300x221.png\" alt=\"\" class=\"wp-image-2222\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM-300x221.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM-768x565.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM-367x270.png 367w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Artic_RPM_PWM.avif 778w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Gr\u00e1fico RPMs \/ PWM<\/figcaption><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/PelotaLevita\/00%20-%20Modelos%203D\/\" target=\"_blank\" rel=\"noreferrer noopener\">Modelos 3D<\/a><\/strong>. He dise\u00f1ado para la ocasi\u00f3n dos piezas, una que hace de base y otra de conexi\u00f3n con el tubo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El coste de la maqueta completa puede oscilar entre 25-65\u20ac dependiendo de donde compr\u00e9is.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Esquema_de_conexion\"><\/span>Esquema de conexi\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"270\" height=\"300\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-270x300.png\" alt=\"\" class=\"wp-image-2224\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-270x300.png 270w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-768x854.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-920x1024.png 920w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-1381x1536.png 1381w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-1841x2048.png 1841w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb-243x270.png 243w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Pelota_levita_bb.avif 2025w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/a><figcaption class=\"wp-element-caption\">Esquema de conexi\u00f3n<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Montaje\"><\/span>Montaje<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Maquetal_pelota_vent.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Maquetal_pelota_vent.png\" alt=\"\" class=\"wp-image-2229\" style=\"width:280px;height:auto\"\/><\/a><figcaption class=\"wp-element-caption\">Dimensiones y principales componentes<\/figcaption><\/figure>\n<\/div>\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\" style=\"grid-template-columns:36% auto\"><figure class=\"wp-block-media-text__media\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"300\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-225x300.jpg\" alt=\"\" class=\"wp-image-2231 size-full\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-225x300.jpg 225w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-768x1024.jpg 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-1152x1536.jpg 1152w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-1536x2048.jpg 1536w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-203x270.jpg 203w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/PXL_20240304_175235843.MP_-scaled.avif 1920w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Las piezas amarillas est\u00e1n impresas en 3D y sirven para asegurar el caudal de aire y conectar el tubo. En la parte superior, el sensor HC-SR04 encaja justo con las dimensiones del di\u00e1metro interior del tubo. Si opt\u00e1is por usar el sensor US-016 deber\u00e9is pegarlo con celo o dise\u00f1ar una pieza para anclarlo.<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Identificacion\"><\/span>Identificaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Adecuacion_de_la_senal_del_sensor_de_distancia\"><\/span>Adecuaci\u00f3n de la se\u00f1al del sensor de distancia<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La se\u00f1al del sensor de distancia no es muy ruidosa, a\u00fan as\u00ed he implementado un <strong>filtro EMA<\/strong> como en la maqueta de control de velocidad. Para no repetir toda la explicaci\u00f3n os dejo el <a href=\"https:\/\/garikoitz.info\/blog\/2024\/01\/sintonizar-pid-con-arduino-control-de-velocidad-de-un-motor\/#Adecuacion_de_la_senal\" target=\"_blank\" rel=\"noreferrer noopener\">enlace<\/a> y os invito a ver el <strong><a href=\"https:\/\/www.youtube.com\/watch?v=WHUFHLzo4Hg\" target=\"_blank\" rel=\"noreferrer noopener\">v\u00eddeo de ajuste del par\u00e1metro alpha<\/a><\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Limitaciones_del_sensor_de_distancia\"><\/span>Limitaciones del sensor de distancia<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voy a explicar algo importante que aplica tanto al sensor HC-SR04 como al US-016. Estos dispositivos pueden medir distancias en un rango que va desde los 4 hasta los 400 cent\u00edmetros. Funcionan perfectamente dentro de este rango. Sin embargo, si un objeto se sit\u00faa a menos de 4 cent\u00edmetros del sensor, este \u00faltimo no puede medir correctamente y, en su lugar, indica que el objeto est\u00e1 al l\u00edmite m\u00e1ximo de su capacidad de detecci\u00f3n. Esta limitaci\u00f3n es particularmente problem\u00e1tica cuando se utiliza en sistemas de control PID, ya que una distancia menor a 4 cent\u00edmetros podr\u00eda hacer que el controlador PID interprete err\u00f3neamente que el objeto se ha movido de estar muy cerca a estar muy lejos, desestabilizando as\u00ed el sistema de control. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para mitigar este problema, existen dos estrategias posibles y ambas requieren esfuerzos adicionales. La primera estrategia implica ajustar mediante programaci\u00f3n la salida del sensor a un valor que refleje de manera fidedigna la posici\u00f3n real del objeto. Este ajuste requiere realizar un test preliminar para determinar la duraci\u00f3n del eco del sensor con el objeto tanto en la distancia m\u00ednima como m\u00e1xima de detecci\u00f3n, a fin de establecer un valor fijo a ser aplicado. Este procedimiento puede realizarse incluso antes del montaje final del proyecto, y he incluido el c\u00f3digo necesario para este test en la <a href=\"https:\/\/garikoitz.info\/blog\/descargas\/PelotaLevita\/01%20-%20Arduino\/\" target=\"_blank\" rel=\"noreferrer noopener\">carpeta del proyecto<\/a>. La segunda estrategia consiste en la instalaci\u00f3n de una barrera f\u00edsica que evite que el objeto se posicione a menos de 4 cent\u00edmetros del sensor.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Control_pelota_vent_limitaciones2.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Control_pelota_vent_limitaciones2.png\" alt=\"\" class=\"wp-image-2283\" style=\"width:406px;height:auto\"\/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ajuste_de_la_senal_PWM\"><\/span>Ajuste de la se\u00f1al PWM<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La Modulaci\u00f3n por Ancho de Pulso (PWM, por sus siglas en ingl\u00e9s Pulse Width Modulation) es una t\u00e9cnica utilizada para simular una se\u00f1al anal\u00f3gica a partir de una fuente digital, como es el caso de los microcontroladores Arduino. En la pr\u00e1ctica, PWM implica alternar r\u00e1pidamente el estado de un pin entre HIGH y LOW a una frecuencia determinada, variando la proporci\u00f3n de tiempo que el pin permanece en cada estado dentro de cada ciclo. Esta \u00abproporci\u00f3n de tiempo\u00bb se conoce como el \u00abciclo de trabajo\u00bb de la se\u00f1al PWM, y se expresa com\u00fanmente en porcentaje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>frecuencia de las se\u00f1ales PWM en Arduino UNO<\/strong> es fija y <strong>depende del temporizador que controle el pin espec\u00edfico<\/strong>. Por defecto, los pines 5 y 6 operan a aproximadamente 976 Hz, mientras que los pines 3, 9, 10, y 11 funcionan a aproximadamente 490 Hz. Esta diferencia se debe a c\u00f3mo est\u00e1n configurados los temporizadores internos del ATmega328P.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modificar la frecuencia de la se\u00f1al PWM puede ser interesante e incluso necesario para una variedad de aplicaciones, por varias razones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Compatibilidad con Dispositivos:<\/strong> Algunos dispositivos, como ciertos tipos de motores o luces LED, pueden requerir frecuencias espec\u00edficas de PWM para operar correctamente o de manera \u00f3ptima. Por ejemplo, una frecuencia m\u00e1s alta puede ser necesaria para evitar el parpadeo visible en LEDs o para lograr una operaci\u00f3n m\u00e1s suave de motores sin escobillas.<\/li>\n\n\n\n<li><strong>Reducci\u00f3n de Ruido:<\/strong> En aplicaciones de control de motores, frecuencias espec\u00edficas de PWM pueden ayudar a reducir el ruido audible generado por la conmutaci\u00f3n el\u00e9ctrica, mejorando as\u00ed el rendimiento ac\u00fastico del sistema.<\/li>\n\n\n\n<li><strong>Eficiencia y Calor:<\/strong> La eficiencia de los dispositivos de potencia (como los transistores que controlan motores en puentes H) puede variar con la frecuencia de PWM. Frecuencias inadecuadas pueden resultar en un calentamiento excesivo y p\u00e9rdida de eficiencia.<\/li>\n\n\n\n<li><strong>Control Preciso:<\/strong> Algunas aplicaciones pueden beneficiarse de ajustar la frecuencia de PWM para obtener un control m\u00e1s fino sobre el ciclo de trabajo y, por lo tanto, sobre la potencia entregada al dispositivo controlado.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Modificar la frecuencia de PWM en un Arduino UNO implica interactuar directamente con los registros de bajo nivel del microcontrolador, lo que nos permite ajustar la configuraci\u00f3n de los temporizadores para adecuarlo al proyecto. Sin embargo, <strong>esta modificaci\u00f3n debe realizarse con precauci\u00f3n<\/strong>, ya que tambi\u00e9n <strong>puede afectar el funcionamiento de otras bibliotecas o funciones<\/strong> que dependen de los mismos temporizadores. En el caso que nos ocupa, la modificaci\u00f3n del timer no afecta al c\u00f3digo implementado.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/image.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/image.png\" alt=\"\" class=\"wp-image-2247\" style=\"width:658px;height:auto\"\/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Para ilustrar el efecto que puede tener modificar la frecuencia, <strong>a la izquierda<\/strong>, la se\u00f1al PWM de Arduino por defecto, que tiene una frecuencia aproximada de 490 Hz. Se puede observar que la se\u00f1al tiene menos ciclos dentro del mismo per\u00edodo de tiempo en comparaci\u00f3n con la se\u00f1al de 25 kHz. <strong>A la derecha<\/strong>, la se\u00f1al PWM ajustada a 25 kHz para \u00e9ste proyecto. Esta se\u00f1al presenta muchos m\u00e1s ciclos en el mismo intervalo de tiempo debido a su mayor frecuencia, lo que har\u00e1 que el ventilador responda mejor.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Identificacion_de_un_proceso_integrador\"><\/span>Identificaci\u00f3n de un proceso integrador<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Durante la realizaci\u00f3n de pruebas en modo manual, hemos determinado que nos enfrentamos a un proceso integrador. Esto significa que ante un cambio escalonado en la salida del controlador (OP), la variable de proceso (PV) experimentar\u00e1 un incremento o decremento continuo e indefinido. Al principio, consider\u00e9 aplicar el m\u00e9todo del rel\u00e9 para la identificaci\u00f3n del proceso, pero lo descart\u00e9 para probar un m\u00e9todo propuesto por Tore Hagglund en su nuevo libro Process Control in Practice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El procedimiento recomendado por Tore Hagglund para identificar este tipo de procesos consiste en efectuar un ajuste manual en la OP hasta conseguir que la PV quede en estado estacionario. Una vez estable debemos efectuar un cambio en la OP que provocar\u00e1 un cambio en la PV, generando un perfil en forma de rampa similar al observado en la figura adjunta. A partir de este ensayo y su an\u00e1lisis visual, estamos capacitados para calcular tanto la <strong>velocidad de cambio de la salida del proceso<\/strong> (definida en la ecuaci\u00f3n 1) como la <strong>ganancia de velocidad<\/strong> (expresada en la ecuaci\u00f3n 2).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Ident_pelotalevita02-1.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Ident_pelotalevita02-1.png\" alt=\"\" class=\"wp-image-2257\"\/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-katex-display-block katex-eq\" data-katex-display=\"true\"><pre>\\begin{align}\n&amp; v = \\frac{\u0394PV}{\\ T0}=\\frac{3}{\\ 1,2}=2,5s\\\\\n&amp; Kv = \\frac{v}{\\ \u0394OP} = \\frac{2,5}{\\ 3} = 2,08s^{-1}\n\\end{align}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Con estos par\u00e1metros, podemos establecer un conjunto de valores para la sintonizaci\u00f3n del controlador PID. Es probable que estos valores requieran ajustes finos, pero nos proporcionan un punto de partida v\u00e1lido para la optimizaci\u00f3n del control.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/pelota_levita_sintov2.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/pelota_levita_sintov2.png\" alt=\"\" class=\"wp-image-2285\" style=\"width:312px;height:auto\"\/><\/a><figcaption class=\"wp-element-caption\">Sinton\u00edas calculadas<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Control_PID\"><\/span>Control PID<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Esquema_de_control\"><\/span>Esquema de control<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Control_pelota_vent.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2024\/03\/Esquema_Control_pelota_vent.png\" alt=\"\" class=\"wp-image-2234\" style=\"width:178px;height:auto\"\/><\/a><figcaption class=\"wp-element-caption\">Esquema de control<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementacion\"><\/span>Implementaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nuestro prop\u00f3sito es posicionar con precisi\u00f3n la pelota en un lugar espec\u00edfico dentro del tubo. Utilizamos un sensor de distancia ultras\u00f3nico para medir la distancia exacta de la pelota, expresada en cent\u00edmetros. A continuaci\u00f3n, ajustamos la velocidad de giro del ventilador empleando una se\u00f1al de modulaci\u00f3n de ancho de pulso (PWM, por sus siglas en ingl\u00e9s). Este m\u00e9todo nos permite variar finamente la potencia aplicada al ventilador y, por ende, controlar la altura a la que se mantiene la pelota.<\/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_kyfIPwP09Ao\"><div id=\"lyte_kyfIPwP09Ao\" data-src=\"\/\/i.ytimg.com\/vi\/kyfIPwP09Ao\/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\/kyfIPwP09Ao\" rel=\"nofollow\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i.ytimg.com\/vi\/kyfIPwP09Ao\/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><\/figcaption><\/figure>\n\n\n<h2 class=\"wp-block-heading\"><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\">Se ha desarrollado una maqueta de dise\u00f1o compacto y construcci\u00f3n sencilla, la cual ha facilitado la exploraci\u00f3n de una diversidad de conceptos t\u00e9cnicos importantes. La experiencia ha incluido el enfrentamiento a retos vinculados con el sensor de distancia, as\u00ed como la implementaci\u00f3n y ajuste de la modulaci\u00f3n por ancho de pulso (PWM), sin olvidar la identificaci\u00f3n del proceso integrador. Adem\u00e1s, ha sido revelador el uso del peque\u00f1o ventilador Arctic, que ha permitido una regulaci\u00f3n eficaz con m\u00ednimo ruido. En lo personal, ha sido sorprendente el amplio aprendizaje y el valor educativo que ha ofrecido esta compacta maqueta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Enlaces\"><\/span>Enlaces<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/garikoitz.info\/blog\/descargas\/PelotaLevita\/\" target=\"_blank\" rel=\"noreferrer noopener\">Carpeta del proyecto<\/a><\/li>\n\n\n\n<li>Ventilador Artic S4028-15K [<a href=\"https:\/\/www.arctic.de\/media\/bf\/04\/0a\/1690275231\/Spec_Sheet_S4028-15K_EN.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Hoja de datos<\/a>] [<a href=\"https:\/\/support.arctic.de\/en\/S4028-15K\" target=\"_blank\" rel=\"noreferrer noopener\">Web<\/a>]<\/li>\n\n\n\n<li><a href=\"https:\/\/www.arduino.cc\/en\/Main\/Software\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino IDE<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/garikoitz.info\/blog\/?p=674\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino COM Plotter<\/a><\/li>\n\n\n\n<li>Fritzing [<a href=\"https:\/\/fritzing.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Oficial<\/a>] [<a href=\"https:\/\/arduinofactory.fr\/en\/download-fritzing-for-free\/\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino Factory<\/a>]<\/li>\n\n\n\n<li>Librer\u00eda PID de Brett Beauregard&nbsp;[<a href=\"https:\/\/github.com\/br3ttb\/Arduino-PID-Library\" target=\"_blank\" rel=\"noreferrer noopener\">Github<\/a>]<\/li>\n\n\n\n<li>Funcionamiento del sensor HC-SR04 [<a href=\"https:\/\/proyectosconarduino.com\/sensores\/sensor-de-distancia-hc-sr04\/?expand_article=1\" target=\"_blank\" rel=\"noreferrer noopener\">proyectosconarduino<\/a>] [<a href=\"https:\/\/naylampmechatronics.com\/blog\/10_tutorial-de-arduino-y-sensor-ultrasonico-hc-sr04.html\" target=\"_blank\" rel=\"noreferrer noopener\">naylamp<\/a>]<\/li>\n\n\n\n<li>Funcionamiento del sensor US-016 [<a href=\"https:\/\/sensorestec.com\/otros-sensores\/sensor-ultrasonido-analogico-us-016\/\" target=\"_blank\" rel=\"noreferrer noopener\">sensorstec<\/a>]<\/li>\n\n\n\n<li>Filtro exponencial EMA (Exponential Moving Average) [<a href=\"https:\/\/arduino.cl\/filtro-exponencial-ema-exponential-moving-average\/\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino.cl<\/a>] [<a href=\"https:\/\/www.luisllamas.es\/arduino-paso-bajo-exponencial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Luis Llamas<\/a>]<\/li>\n\n\n\n<li>Introducci\u00f3n al algoritmo PID y su implementaci\u00f3n en Arduino [<a href=\"https:\/\/garikoitz.info\/blog\/2022\/05\/introduccion-al-algoritmo-pid-y-su-implementacion-en-arduino\/\" target=\"_blank\" rel=\"noreferrer noopener\">garikoitz.info<\/a>]<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Libros_y_publicaciones\"><\/span>Libros y publicaciones<span class=\"ez-toc-section-end\"><\/span><\/h2>\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] Tore Hagglund. Process Control in Practice, De Gruyter, ISBN: 9783111104959<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[3] Myke King. \u00ab<em>Process Control \u2013 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","protected":false},"excerpt":{"rendered":"<p>Introducci&oacute;n Recientemente, me encontr&eacute; por casualidad con un v&iacute;deo que mostraba c&oacute;mo un secador de pelo puede hacer levitar una pelota de ping-pong, ilustrando el principio de Bernoulli. Esto despert&oacute; mi curiosidad sobre la posibilidad de ajustar la potencia del secador para controlar la altura a la que se mantiene la pelota. Inspirado por esta idea, esa misma noche comenc&eacute; a experimentar con algunos componentes que ten&iacute;a guardados y, poco a poco, di forma a la maqueta que les presento&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2024\/03\/sintonizar-pid-con-arduino-control-de-posicion-de-una-pelota-en-levitacion\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2219,"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,128,213,210],"tags":[94,16,143,142,17,101,98],"class_list":["post-2215","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-impresion-3d","category-pid","category-programacion","tag-acp","tag-arduino","tag-i-pd","tag-pi-d","tag-pid","tag-sintonia-pid","tag-sintonizacion-pid"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2215","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=2215"}],"version-history":[{"count":55,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2215\/revisions"}],"predecessor-version":[{"id":2355,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2215\/revisions\/2355"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/2219"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=2215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=2215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=2215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}