{"id":2473,"date":"2025-04-06T20:15:53","date_gmt":"2025-04-06T20:15:53","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=2473"},"modified":"2025-04-07T14:45:27","modified_gmt":"2025-04-07T14:45:27","slug":"modelado-y-control-de-posicion-de-un-servo-simulado","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/","title":{"rendered":"Modelado y Control de Posici\u00f3n de un Servo Simulado (2\u00aaParte)"},"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\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#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\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Funcionamiento\" >Funcionamiento<\/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\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Control_de_Posicion\" >Control de Posici\u00f3n<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Identificacion\" >Identificaci\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Resultados\" >Resultados<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Codigo_Python\" >C\u00f3digo Python<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Identificacion_v2py\" >Identificacion_v2.py<\/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\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/#Enlaces\" >Enlaces<\/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\">Esta es la segunda parte del control del servo simulado. En la <a href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/control-de-velocidad-con-un-motor-de-corriente-continua-simulado\/\" target=\"_blank\" rel=\"noreferrer noopener\">primera parte<\/a> modelamos y sintonizamos un control de velocidad. El control de velocidad a excepci\u00f3n de la ausencia de tiempo muerto, no tuvo mayor complicaci\u00f3n, nos enfrentamos a un proceso con respuesta autorregulada f\u00e1cil de identificar y sintonizar. Ahora es el turno de <strong>controlar la posici\u00f3n<\/strong> y afrontar una respuesta completamente diferente, \u00bfno te lo crees? Pues sigue leyendo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Funcionamiento\"><\/span>Funcionamiento<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recordemos que disponemos de un servo de 5 voltios que en su eje lleva acoplado un disco graduado entre 0 y 360 grados. El voltaje aplicado sobre el motor hace que \u00e9ste gire en un sentido de forma continua pudi\u00e9ndose invertir la polaridad para que el servo gire en sentido contrario. A medida que aplicamos m\u00e1s voltaje, m\u00e1s r\u00e1pido gira el disco.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Control_de_Posicion\"><\/span>Control de Posici\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Atendiendo al simulador, el rango de la posici\u00f3n (PV) va de 0 a 359 grados y el voltaje del motor (OP) va de -5 a 5 voltios. El voltaje positivo y negativo hace que el servo pueda girar en ambos sentidos pero como punto de consigna (SP) s\u00f3lo admite grados positivos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Identificacion\"><\/span>Identificaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tras jugar un poco con el simulador enseguida llegamos a la conclusi\u00f3n de que nos enfrentamos a un  integrador puro en el que cada nivel de tensi\u00f3n produce una nueva velocidad constante, y por tanto, la posici\u00f3n crece linealmente en el tiempo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1-png.webp\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1-1024x476.webp\" alt=\"\" class=\"wp-image-2479\"\/><\/a><figcaption class=\"wp-element-caption\">Imagen 1 \u2013 StepTest. Imagen creada con el script Identificacion_v2.py<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mediante un script de Python se ha identificado que la posici\u00f3n crece a una velocidad proporcional al voltaje aplicado, y esa proporci\u00f3n es de aproximadamente 5.72 \u00ba\/s por voltio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1_tramos-png.webp\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1_tramos-1024x614.webp\" alt=\"\" class=\"wp-image-2481\"\/><\/a><figcaption class=\"wp-element-caption\">Imagen 2 &#8211; Resumen de tramos resultantes identificados mediante Identificacion_v2.py<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez obtenida la pendiente estamos en disposici\u00f3n de hallar varias sinton\u00edas que en esta ocasi\u00f3n he a\u00f1adido en dos partes, Lambda y Servo.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Lambda<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">Tf=1s<\/td><td class=\"has-text-align-center\" data-align=\"center\">Tf=2s<\/td><td class=\"has-text-align-center\" data-align=\"center\">Tf=3s<\/td><td class=\"has-text-align-center\" data-align=\"center\">Tf=5s<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Kc<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.17<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.35<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.52<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.87<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Ti<\/td><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Td<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Servo<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">PI<\/td><td class=\"has-text-align-center\" data-align=\"center\">PID<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Kc<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.14<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.21<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Ti<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.5<\/td><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Td<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Resultados\"><\/span>Resultados<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1-Sintonias-png.webp\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2025\/04\/Test_v1-Sintonias-png.webp\" alt=\"\" class=\"wp-image-2482\"\/><\/a><figcaption class=\"wp-element-caption\">Imagen 3 &#8211; Prueba de Sinton\u00edas<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Lambda<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tf = 1: respuesta r\u00e1pida, pero demasiado agresiva lo que provoca oscilaciones considerables tanto en la posici\u00f3n (PV) como en la salida (OP).<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tf = 2 y 3: similar a la sinton\u00eda con Tf=1 aunque con peque\u00f1as oscilaciones y tiempos de asentamiento m\u00e1s largos.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tf = 5: respuesta muy lenta, tarda demasiado en alcanzar el punto de consigna haciendo que la se\u00f1al oscile en exceso.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Servo<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PI: consigue un buen equilibrio entre velocidad y estabilidad, sin sobresaltos ni oscilaciones excesivas.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PID: mejora el seguimiento del punto de consigna de forma m\u00e1s precisa, con algo m\u00e1s de movimiento de la salida (OP), pero sin inestabilidad.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Codigo_Python\"><\/span>C\u00f3digo Python<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Identificacion_v2py\"><\/span>Identificacion_v2.py<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Al ejecutar el script aparecer\u00e1 un cuadro de di\u00e1logo preguntando por el archivo .m. Tras la ejecuci\u00f3n nos devuelve dos im\u00e1genes png y un txt con los resultados.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import re\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nfrom tkinter import Tk, filedialog\nfrom sklearn.linear_model import LinearRegression\n\ndef corregir_salto_angular(th):\n    th_corr = th.copy()\n    for i in range(1, len(th_corr)):\n        if th_corr[i] - th_corr[i - 1] &lt; -300:\n            th_corr[i:] += 360\n    return th_corr\n\n# --- Selecci\u00f3n de archivo ---\nTk().withdraw()\nruta_archivo = filedialog.askopenfilename(\n    title=\"Selecciona el archivo .m con datos\",\n    filetypes=[(\"Archivos MATLAB\", \"*.m\")]\n)\n\nif not ruta_archivo:\n    raise FileNotFoundError(\"No se seleccion\u00f3 ning\u00fan archivo.\")\n\nbase_name = os.path.splitext(os.path.basename(ruta_archivo))[0]\nnombre_txt = f\"{base_name}_modelo.txt\"\n\nwith open(ruta_archivo, \"r\", encoding=\"utf-8\") as f:\n    contenido = f.read()\n\ncoincidencias = re.findall(r\"data\\s*=\\s*\\[([\\s\\S]+?)\\];\", contenido)\nif not coincidencias:\n    raise ValueError(\"No se encontr\u00f3 el bloque 'data = [...]' en el archivo.\")\n\nfilas = coincidencias[0].strip().split(\"\\n\")\ndatos = np.array([[float(val) for val in fila.strip().split()] for fila in filas])\n\n# Asignar columnas\nt, th, w, u, ref = datos.T\nth = corregir_salto_angular(th)\n\n# --- An\u00e1lisis de tramos ---\neps = 1e-3\ncambios = np.where(np.abs(np.diff(u)) > eps)[0] + 1\nsegmentos = [(0, cambios[0])] + [(cambios[i], cambios[i + 1]) for i in range(len(cambios) - 1)] + [(cambios[-1], len(u))]\nsegmentos = segmentos[1:]  # Eliminar arranque\n\nganancias = []\n\nplt.figure(figsize=(10, 6))\nfor i, (ini, fin) in enumerate(segmentos, start=1):\n    t_seg = t[ini:fin]\n    th_seg = th[ini:fin]\n    u_val = u[ini]\n\n    if len(t_seg) &lt; 5:\n        continue\n\n    model = LinearRegression()\n    model.fit(t_seg.reshape(-1, 1), th_seg)\n    pendiente = model.coef_[0]\n    th_fit = model.predict(t_seg.reshape(-1, 1))\n\n    ganancias.append((i, u_val, pendiente))\n\n    # Graficar\n    plt.plot(t_seg, th_seg, label=f'U={u_val:.2f} V')\n    plt.plot(t_seg, th_fit, linestyle='--', linewidth=1, color='black')\n\nplt.title(\"Tramos de posici\u00f3n (th) y regresiones lineales\")\nplt.xlabel(\"Tiempo (s)\")\nplt.ylabel(\"\u00c1ngulo (\u00b0)\")\nplt.legend()\nplt.grid()\nplt.tight_layout()\nplt.savefig(f\"{base_name}_tramos.png\", dpi=300)\nplt.show()\n\n# --- Modelo global ---\nif ganancias:\n    U_vals, vel = zip(*[(u, p) for _, u, p in ganancias])\n    modelo = LinearRegression().fit(np.array(U_vals).reshape(-1, 1), np.array(vel))\n    K = modelo.coef_[0]\n\n    with open(nombre_txt, \"w\", encoding=\"utf-8\") as ftxt:\n        ftxt.write(\"MODELO IDENTIFICADO\\n\")\n        ftxt.write(\"-------------------\\n\")\n        ftxt.write(f\"G(s) = {K:.4f} \/ s\\n\\n\")\n\n        ftxt.write(\"GANANCIAS POR TRAMO\\n\")\n        ftxt.write(\"-------------------\\n\")\n        for tramo, u_val, pend in ganancias:\n            ftxt.write(f\"Tramo {tramo}: U = {u_val:.2f} V \u2192 Velocidad \u2248 {pend:.2f} \u00b0\/s\\n\")\n        \n        ftxt.write(\"\\nSINTON\u00cdAS RECOMENDADAS\\n\")\n        ftxt.write(\"-----------------------\\n\")\n\n        # Sinton\u00eda LAMBDA (PI)\n        ftxt.write(\"M\u00e9todo LAMBDA (PI puro)\\n\")\n        for lam in [1, 2, 3, 5]:\n            Kc = lam \/ K\n            Ti = lam\n            ftxt.write(f\"\u03bb = {lam:.1f} \u2192 Kc = {Kc:.4f}, Ti = {Ti:.4f}, Td = 0\\n\")\n\n        # Sinton\u00eda tipo SERVO PI\n        Kc_servo_PI = 0.8 \/ K\n        Ti_servo_PI = 1.5\n        ftxt.write(\"\\nTipo SERVO (PI)\\n\")\n        ftxt.write(f\"Kc = {Kc_servo_PI:.4f}, Ti = {Ti_servo_PI:.4f}, Td = 0\\n\")\n\n        # Sinton\u00eda tipo SERVO PID\n        Kc_servo_PID = 1.2 \/ K\n        Ti_servo_PID = 2\n        Td_servo_PID = 0.5\n        ftxt.write(\"\\nTipo SERVO (PID)\\n\")\n        ftxt.write(f\"Kc = {Kc_servo_PID:.4f}, Ti = {Ti_servo_PID:.4f}, Td = {Td_servo_PID:.4f}\\n\")\n\n    print(f\"\\nModelo estimado: G(s) = {K:.2f} \/ s\")\n    print(f\"Archivo generado: {nombre_txt} + gr\u00e1fico PNG\")\nelse:\n    print(\"No se obtuvieron tramos v\u00e1lidos.\")\n<\/pre>\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>Simulador [<a href=\"https:\/\/garikoitz.info\/blog\/descargas\/MotorDC_SIM\/Simulador\/\" target=\"_blank\" rel=\"noreferrer noopener\">garikoitz.info<\/a>]<\/li>\n\n\n\n<li>Carpeta del Proyecto [<a href=\"https:\/\/garikoitz.info\/blog\/descargas\/MotorDC_SIM\/\" target=\"_blank\" rel=\"noreferrer noopener\">garikoitz.info<\/a>]<\/li>\n\n\n\n<li>Respuesta integradora [<a href=\"https:\/\/garikoitz.info\/blog\/2022\/05\/introduccion-al-algoritmo-pid-y-su-implementacion-en-arduino\/#Respuesta_integral\" target=\"_blank\" rel=\"noreferrer noopener\">garikoitz.info<\/a>]<\/li>\n\n\n\n<li>Laboratorio virtuales [<a href=\"https:\/\/unilabs.dia.uned.es\/mod\/data\/view.php?id=1966\" target=\"_blank\" rel=\"noreferrer noopener\">Unilabs<\/a>] [<a href=\"https:\/\/unilabs.dia.uned.es\/pluginfile.php\/10549\/mod_data\/content\/145\/ServoMotor.zip\">Simulador<\/a>]<\/li>\n\n\n\n<li>Modelado y Control de Velocidad de un servo simulado (1\u00aaparte) [<a href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/control-de-velocidad-con-un-motor-de-corriente-continua-simulado\/\" target=\"_blank\" rel=\"noreferrer noopener\">garikoitz.info<\/a>]<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci&oacute;n Esta es la segunda parte del control del servo simulado. En la primera parte modelamos y sintonizamos un control de velocidad. El control de velocidad a excepci&oacute;n de la ausencia de tiempo muerto, no tuvo mayor complicaci&oacute;n, nos enfrentamos a un proceso con respuesta autorregulada f&aacute;cil de identificar y sintonizar. Ahora es el turno de controlar la posici&oacute;n y afrontar una respuesta completamente diferente, &iquest;no te lo crees? Pues sigue leyendo. Funcionamiento Recordemos que disponemos de un servo de&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2025\/04\/modelado-y-control-de-posicion-de-un-servo-simulado\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2419,"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":[213,210],"tags":[238,159,237,17,200,126],"class_list":["post-2473","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pid","category-programacion","tag-control","tag-lambda","tag-modelado","tag-pid","tag-python","tag-servo"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2473","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=2473"}],"version-history":[{"count":16,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2473\/revisions"}],"predecessor-version":[{"id":2501,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/2473\/revisions\/2501"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/2419"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=2473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=2473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=2473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}