{"id":9305,"date":"2024-12-20T20:53:58","date_gmt":"2024-12-20T19:53:58","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9305"},"modified":"2024-12-21T17:10:03","modified_gmt":"2024-12-21T16:10:03","slug":"gimbalino","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/","title":{"rendered":"Gimbalino"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-576x1024.png\" alt=\"\" class=\"wp-image-9420\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-576x1024.png 576w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-169x300.png 169w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-768x1365.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-864x1536.png 864w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-1-1152x2048.png 1152w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading has-text-align-center\"><strong>Introducci\u00f3n<\/strong><\/h1>\n\n\n\n<div style=\"text-align: justify\"> En la era digital actual, los Dispositivos Empotrados juegan un papel crucial en una amplia variedad de aplicaciones, desde la automatizaci\u00f3n industrial hasta los dispositivos de consumo diario. Estos sistemas, que combinan Hardware y Software para realizar funciones espec\u00edficas, son fundamentales para el funcionamiento eficiente y fiable de muchos productos tecnol\u00f3gicos modernos. La importancia de los dispositivos empotrados radica en su capacidad para ofrecer soluciones personalizadas y optimizadas, mejorando la funcionalidad y la eficiencia energ\u00e9tica de estos.\n<br>\n<br>\nUno de los usos m\u00e1s destacados de los Dispositivos Empotrados es en los Estabilizadores, tambi\u00e9n conocidos como Gimbals. Estos dispositivos son esenciales para la estabilizaci\u00f3n de c\u00e1maras en drones, tel\u00e9fonos m\u00f3viles y equipos de filmaci\u00f3n profesional, permitiendo capturar im\u00e1genes y v\u00eddeos suaves y sin vibraciones. Los Gimbals utilizan sensores y motores para contrarrestar los movimientos no deseados, proporcionando una estabilidad que es crucial para la calidad del contenido visual.\n<br>\n<br>\nEn este proyecto, se desarrollar\u00e1 un Gimbal utilizando un Arduino Uno, tres servomotores y un sensor giroscopio + aceler\u00f3metro MPU6050. El objetivo es dise\u00f1ar y construir un sistema de estabilizaci\u00f3n que pueda mantener una c\u00e1mara en una posici\u00f3n estable, compensando los movimientos en tres ejes. La implementaci\u00f3n del proyecto incluir\u00e1 la programaci\u00f3n del Arduino para controlar los servomotores bas\u00e1ndose en los datos del sensor MPU6050, as\u00ed como la integraci\u00f3n de todos los componentes electr\u00f3nicos y mec\u00e1nicos necesarios.\n<br>\n<br>\nEste proyecto no solo permitir\u00e1 aplicar los conocimientos adquiridos en la asignatura de Dise\u00f1o de Sistemas Empotrados, sino que tambi\u00e9n brindar\u00e1 la oportunidad de desarrollar habilidades pr\u00e1cticas en el dise\u00f1o y construcci\u00f3n de sistemas de estabilizaci\u00f3n, que son altamente valoradas en la industria tecnol\u00f3gica actual. \n<br>\n<br>\n<\/div>\n\n\n\n<p class=\"has-text-align-left has-black-color has-text-color has-link-color wp-elements-0cca6bb5e618f63f3ef02f40acd70878\"><\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-black-color has-text-color has-link-color wp-elements-87054c6daeecf991139f5aa611d8c567\"><strong>Proyecto<\/strong><\/h1>\n\n\n\n<div style=\"text-align: justify\"> El proyecto consiste en el desarrollo de un Gimbal controlado por servomotores y un joystick. Un Gimbal es un dispositivo que permite estabilizar y controlar la orientaci\u00f3n de una c\u00e1mara u otro dispositivo, proporcionando movimientos suaves y precisos. Este proyecto tiene como objetivo crear dicho Estabilizador que adem\u00e1s pueda ser controlado manualmente mediante un joystick, permitiendo al usuario ajustar el giro torno al eje Z (yaw) y torno al eje X (roll) de la c\u00e1mara.\n<br>\n<br>\n<strong style=\"font-size: 24px\">Metodolog\u00eda<\/strong>\n<br>\n<br>\nEl proyecto se llevar\u00e1 a cabo en varias etapas:\n<br>\n<br>\n<strong>   &#8211; Dise\u00f1o del Sistema:<\/strong>\n<br>\n<br>\n        \u00b7 Selecci\u00f3n de componentes: Arduino, servomotores, joystick y MPU6050          (sensor de movimiento).\n<br>\n<br>\n        \u00b7 Dise\u00f1o del circuito: Conexi\u00f3n de los componentes seg\u00fan el esquema el\u00e9ctrico.\n<br>\n<br>\n<strong>   &#8211; Programaci\u00f3n:<\/strong> \n<br>\n<br>\n        \u00b7 Desarrollo del c\u00f3digo para leer los valores del joystick y del sensor MPU6050. \n<br>\n<br>\n        \u00b7 Implementaci\u00f3n de algoritmos para controlar los servomotores en funci\u00f3n de los valores le\u00eddos. \n<br>\n<br>\n        \u00b7 Calibraci\u00f3n del sistema para asegurar movimientos precisos y suaves.\n<br>\n<br>\n<strong>   &#8211; Construcci\u00f3n del prototipo:<\/strong> \n<br>\n<br>\n        \u00b7 Montaje de los componentes en una estructura f\u00edsica que permita el movimiento libre de la c\u00e1mara.\n<br>\n<br>\n        \u00b7 Pruebas iniciales para verificar el funcionamiento del sistema.\n<br>\n<br>\n<strong style=\"font-size: 24px\">Funciones del Gimbal<\/strong>\n<br>\n<br>\nUna vez finalizado, incluir\u00e1 las siguientes funciones:\n<br>\n<br>\n<strong>   &#8211; Control Manual:<\/strong>\n\nEl usuario podr\u00e1 controlar la orientaci\u00f3n de la c\u00e1mara mediante el joystick, ajustando la inclinaci\u00f3n, la gui\u00f1ada y el alabeo.\n<br>\n<br>\n<strong>   &#8211; Estabilizaci\u00f3n Autom\u00e1tica:<\/strong>\n\nEl sensor MPU6050 proporcionar\u00e1 datos de movimiento que permitir\u00e1n al Gimbal estabilizar autom\u00e1ticamente la c\u00e1mara, compensando movimientos no deseados.\n<br>\n<br>\n<strong>   &#8211; Calibraci\u00f3n:<\/strong> \n\nEl sistema incluir\u00e1 una funci\u00f3n de calibraci\u00f3n para ajustar los valores iniciales del sensor y asegurar una operaci\u00f3n precisa. \n<br>\n<br>\n<\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\"><strong>Reparto de tareas<\/strong><\/h1>\n\n\n\n<div style=\"text-align: justify\">Para el desarrollo y construcci\u00f3n de este Estabilizador se ha dividido a los tres componentes del grupo en distintas tareas tras una primera puesta en com\u00fan del resultado esperado.\n<br>\n<br>\nLas tareas en las que se ha dividido este proyecto son:\n<br>\n<br>\n<strong>   \u00b7 B\u00fasqueda de materiales necesarios:<\/strong> El encargado de esta parte se ha hecho cargo de seleccionar los componentes que necesitar\u00eda el prototipo para ser capaz de mover un smartphone de unos 250gr de peso y obtener las medidas que se necesitan para realizar los ajustes angulares.\n<br>\n<br>\n<strong>   \u00b7 Dise\u00f1o de la estructura:<\/strong> Realizar\u00e1 los c\u00e1lculos necesarios para contener empotrados todos los componentes del prototipo y conseguir que el movimiento de los ejes permita incorporar un tel\u00e9fono con unas medidas equivalentes al tama\u00f1o medio actual.\n<br>\n<br>\n<strong>   \u00b7 Elaboraci\u00f3n del c\u00f3digo:<\/strong> A partir del c\u00f3digo encontrado, tendr\u00e1 la responsabilidad de editarlo para conseguir que cumpla con los requisitos pedidos.\n<\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\"><strong>Materiales y coste<\/strong><\/h1>\n\n\n\n<div style=\"text-align: justify\">En este apartado se presenta un desglose detallado de los materiales utilizados para el desarrollo del proyecto, junto con su respectivo costo unitario y total. Esta informaci\u00f3n es fundamental para ofrecer una visi\u00f3n clara de los recursos empleados y facilitar la evaluaci\u00f3n econ\u00f3mica del proyecto.\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Componentes del Proyecto<\/h2>\n\n\n\n<p>Para la construcci\u00f3n del Estabilizador, hemos empleado los siguientes elementos:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Servomotores <\/strong>: Responsables de controlar los movimientos en los ejes de rotaci\u00f3n (pitch, yaw y roll), proporcionando estabilidad y precisi\u00f3n al dispositivo.<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Placa protoboard<\/strong>: Utilizada para interconectar los distintos componentes electr\u00f3nicos de forma flexible durante la fase de desarrollo.<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Interruptor<\/strong>: Permite controlar el encendido y apagado del sistema de manera manual.<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Arduino Uno<\/strong>: Act\u00faa como el controlador principal, procesando las se\u00f1ales del joystick y enviando las instrucciones a los motores.<\/li>\n<\/ol>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Joystick<\/strong>: Proporciona una interfaz intuitiva para el control manual del gimbal, permitiendo dirigir su orientaci\u00f3n.<\/li>\n<\/ol>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li><strong>Cables<\/strong>: Conectan y suministran energ\u00eda y se\u00f1ales entre los distintos componentes.<\/li>\n<\/ol>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li><strong>Bater\u00eda externa<\/strong>: Fuente de alimentaci\u00f3n aut\u00f3noma que garantiza el funcionamiento del sistema.<\/li>\n<\/ol>\n\n\n\n<div style=\"text-align: justify\">Para una mejor comprensi\u00f3n, se incluye una tabla que organiza y resume los datos de manera estructurada, destacando cada material, su cantidad requerida y el impacto econ\u00f3mico asociado.\n<\/div>\n\n\n\n<p>La tabla se detalla a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>MATERIALES<\/strong><strong><\/strong><\/td><td><strong>UNIDADES<\/strong><strong><\/strong><\/td><td><strong>PRECIO\/ UNIDAD<\/strong><strong><\/strong><\/td><td><strong>PRECIO TOTAL<\/strong><strong><\/strong><\/td><\/tr><tr><td>TUERCAS M3<\/td><td>25<\/td><td>0,07 \u20ac<\/td><td>1,74 \u20ac<\/td><\/tr><tr><td>SERVO MG996R-180\u00ba<\/td><td>3<\/td><td>5,99 \u20ac<\/td><td>17,97 \u20ac<\/td><\/tr><tr><td>KIT (PLACA PROTOBOARD, JOYSTICK, CABLES Y ARDUINO UNO)<\/td><td>1<\/td><td>39 \u20ac<\/td><td>39 \u20ac<\/td><\/tr><tr><td>BATER\u00cdA 7.4 V<\/td><td>1<\/td><td>9,59 \u20ac<\/td><td>9,59 \u20ac<\/td><\/tr><tr><td>TORNILLOS M3<\/td><td>20<\/td><td>0,06 \u20ac<\/td><td>1,25 \u20ac<\/td><\/tr><tr><td>FILAMENTO PLA IMPRESI\u00d3N 3D<\/td><td>300g<\/td><td>15 \u20ac \/1 KG<\/td><td>4,5 \u20ac<\/td><\/tr><tr><td>INTERRUPTOR<\/td><td>1<\/td><td>0,75 \u20ac<\/td><td>0,75 \u20ac<\/td><\/tr><tr><td>M\u00d3DULO MPU6050<\/td><td>1<\/td><td>2,95 \u20ac<\/td><td>2,95 \u20ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>PRECIO TOTAL<\/strong><strong><\/strong><\/td><td><strong>77,75 \u20ac<\/strong><strong><\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong><br><\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\" style=\"font-size:30px\"><strong>Implementaci\u00f3n<\/strong><\/h1>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"503\" height=\"566\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura1.png\" alt=\"\" class=\"wp-image-9310\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura1.png 503w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura1-267x300.png 267w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"247\" height=\"247\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura2.png\" alt=\"\" class=\"wp-image-9311\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura2.png 247w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura2-150x150.png 150w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Estructura2-80x80.png 80w\" sizes=\"auto, (max-width: 247px) 100vw, 247px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<div style=\"text-align: justify\">A la hora de la implementaci\u00f3n se ha realizado un primer prototipo hecho con cart\u00f3n que establecer\u00eda las bases de lo que al final ser\u00eda el prototipo final y ayudar\u00eda a tener las medidas de todas sus partes.\n<br>\n<br>\nEn el prototipo final hicimos un dise\u00f1o 3D con sus distintas partes, formadas por:\n<br>\n<br>\nUn cilindro para el mango, en cuyo interior se encuentra uno de los servos, la breadboard con las conexiones de todos los elementos y la bater\u00eda. En su exterior se encuentra el joystick y el sensor MPU.\n<br>\n<br>\nSus medidas son de 22 cm de alto, con un grosor de 0,4 cm y un radio de 3,9cm, una de las caras est\u00e1 vac\u00eda y en la otra se encuentra tres agujeros: un c\u00edrculo de 0,5 cm de radio donde pasaran los cables de los servos, un rect\u00e1ngulo en el medio, donde estar\u00e1 uno de los motores, con 2 cm de ancho y 4 cm de largo y otro rect\u00e1ngulo, donde pasar\u00edan los cables del giroscopio y joystick, con 0,5 cm de ancho y 1,5 cm de largo.\n<br>\n<br>\nLa tapa del cilindro que se encargar\u00e1 de cerrar el mango tiene como medidas un primer c\u00edrculo de 3,9 cm de radio y una altura de 0,4 cm y otro circulo interior hueco con 3,5 cm de radio y una altura de 2 cm, con un grosor de 0,2 cm.\n<br>\n<br>\nUna articulaci\u00f3n en forma de L, que contendr\u00e1 al servo encargado de la rotaci\u00f3n en el eje Y, cuya parte m\u00e1s larga medir\u00e1 7,5 cm de largo dividido en un rect\u00e1ngulo de 5,5 cm y una semicircunferencia de 2 cm de radio. A una distancia de 2 cm desde el borde curvo y 1 cm desde el lateral se tiene un recorte con forma rectangular de 2 cm de ancho y 4 cm de largo, en el cual se alojar\u00e1 el servo encargado del giro torno al eje X.\n<br>\n<br>\nLa otra cara tiene 4 cm de alto, compuesta por una semicircunferencia de 2 cm de radio y un rect\u00e1ngulo de 2 cm de alto, todo ello con una anchura de 4 cm y un grosor de 0,4 cm.\n<br>\n<br>\nLa \u00faltima articulaci\u00f3n tiene una parte central que mide 8cm de largo, y dos ramas inclinadas un \u00e1ngulo de 135\u00b0 cada una respecto a la base, ambas tienen el mismo largo, 7,5 cm y se componen de un rect\u00e1ngulo de 5,5 cm de largo y una semicircunferencia de 2 cm de radio. A una distancia de 2 cm desde el borde de la semicircunferencia y a 1 cm desde el lateral se encuentra el hueco de forma rectangular con 2 cm de ancho y 4 cm de largo, donde se situar\u00e1 el \u00faltimo motor.\n<\/div>\n\n\n\n<p>El esquema de conexi\u00f3n seguido es el siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-1024x1024.jpeg\" alt=\"\" class=\"wp-image-9312\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-1024x1024.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-300x300.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-150x150.jpeg 150w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-768x768.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-1536x1536.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-80x80.jpeg 80w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal-320x320.jpeg 320w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Esquema_Conex_Gimbal.jpeg 2000w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"text-align: justify\">La bater\u00eda aporta el voltaje, de 7.4V en este caso, y tierra al joystick, Arduino y los tres motores.\n<br>\n<br>\nEl joystick tiene conectado el VRX al pin A1 del Arduino, el cual aporta los movimientos en el eje x, y el VRY est\u00e1 conectado al pin A2 del Arduino, el cual aporta los movimientos en el eje y. Los pines GND y VCC estar\u00e1n conectados a tierra y carga respectivamente.\n<br>\n<br>\nLos tres motores est\u00e1n conectados a los pines 11, 10 y 9 del Arduino, a los cuales dar\u00e1 la informaci\u00f3n para su movimiento. El servomotor conectado al pin 11 mover\u00e1 el eje Z, el de la posici\u00f3n 10 mover\u00e1 en el eje Y y en la poci\u00f3n 9 mover\u00e1 en el eje X.\n<br>\n<br>\nEl sensor MPU tiene conectado el pin SCL al pin A5 del Arduino, el SDA al pin A4 y el INT en el pin digital 2.\n<\/div>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:30px;font-style:normal;font-weight:700\">C\u00f3digo<\/p>\n\n\n\n<div style=\"text-align: justify\">El c\u00f3digo empleado hace uso de las librer\u00edas creadas por Jeff Rowberg incluido su enlace en la Bibliograf\u00eda, las cuales nos permiten obtener los datos que genera el sensor MPU6050 utilizado y operar con el procesador dmp (Digital Motion Processor) que incluye este mismo.\n<br>\n<br>\nAdem\u00e1s se ha empleado el c\u00f3digo generado por Dejan en la web HowToMechatronics que tambi\u00e9n puede encontrarse en la Bibliograf\u00eda, a\u00f1adiendo el control con joystick y el mantenimiento de la posici\u00f3n de los ejes en la posici\u00f3n requerida.\nEste c\u00f3digo inicialmente reportaba problemas que ser\u00e1n comentados en el apartado dedicado a ello y que han llevado a a\u00f1adir modificaciones extra en las comprobaciones que realiza el c\u00f3digo.\n<br>\n<br>\n<strong>Declaraci\u00f3n de variables: <strong>\n<br>\n<br>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1365\" height=\"1735\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1.jpg\" alt=\"\" class=\"wp-image-9424\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1.jpg 1365w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1-236x300.jpg 236w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1-806x1024.jpg 806w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1-768x976.jpg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo1-1208x1536.jpg 1208w\" sizes=\"auto, (max-width: 1365px) 100vw, 1365px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"text-align: justify\">En estas primeras l\u00edneas del c\u00f3digo se tienen las variables que se utilizar\u00e1n a lo largo de todo el programa, as\u00ed como las librer\u00edas para la comunicaci\u00f3n con el sensor y los servomotores. \n<br>\n<br>\nEn un primer lugar se declaran los 3 servomotores seg\u00fan el eje al que corresponden. La variable \u201ccorrecto\u201d se utiliza para almacenar el valor correcto de \u00e1ngulo rotado del eje Z, que ser\u00e1 calculado posteriormente en un proceso de calibraci\u00f3n consistente en un bucle que realiza 300 medidas y se queda con la \u00faltima proporcionada por el sensor.\n<br>\n<br>\nSe define un umbral utilizado en la gesti\u00f3n del joystick, para generar una zona alrededor del punto neutro (no se acciona) en la que no se realice acci\u00f3n alguna para evitar desplazamientos indeseados.\n<br>\n<br>\nA continuaci\u00f3n, disponemos de las variables para la gesti\u00f3n del MPU donde se almacena si el procesador dmp que incluye est\u00e1 correctamente conectado y habilitado, las interrupciones devueltas por el sensor cuando tiene valores almacenados en el buffer de transmisi\u00f3n de datos, el estado del dispositivo tras cada acci\u00f3n realizada, el tama\u00f1o del paquete de datos, un contador para saber en todo momento la cantidad de bytes que se tiene actualmente en el buffer y el buffer de transmisi\u00f3n de datos entre el sensor y el Arduino.\n<br>\n<br>\nTambi\u00e9n se incluyen las variables que almacenan los datos medidos por el MPU como los cuaterniones, que son una forma matem\u00e1tica de representar rotaciones en el espacio tridimensional y presentan menos problemas que los \u00e1ngulos de Euler, los cuales tambi\u00e9n se obtienen de este sensor para conseguir una mayor precisi\u00f3n en la medida y c\u00e1lculo de loa grados inclinados. \n<br>\n<br>\nSe tienen variables para almacenar las aceleraciones, que ser\u00e1n importantes para el c\u00e1lculo del giro alrededor del eje Z y para almacenar el tiempo que transcurre en un movimiento, para realizar dicho c\u00e1lculo.\n<br>\n<br>\nSe termina con las variables del joystick, como sus pines de conexi\u00f3n, los valores devueltos para la posici\u00f3n neutra cuando est\u00e1 alimentado a la corriente de 7,4v aportada por la bater\u00eda, pues a 5v, estos deber\u00edan ser de 512 ya que el joystick tiene un rango de valores de 0 a 1023, sin embargo, por la forma de conexi\u00f3n establecida, los valores se ven alterados. \n<br>\n<br>\nY las variables de los servomotores como sus pines de conexi\u00f3n, el establecimiento del paso de \u00e1ngulo que cada motor debe realizar cuando se acciona el joystick en alg\u00fan sentido y los offsets de los ejes para mantener el \u00e1ngulo en el que deben permanecer estabilizados los 3 ejes tras haberlo establecido con el joystick.\n<br>\n<br>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1310\" height=\"1515\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo2.jpg\" alt=\"\" class=\"wp-image-9425\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo2.jpg 1310w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo2-259x300.jpg 259w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo2-885x1024.jpg 885w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo2-768x888.jpg 768w\" sizes=\"auto, (max-width: 1310px) 100vw, 1310px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"text-align: justify\">Para la configuraci\u00f3n de los elementos de este programa, se tiene en primer lugar el establecimiento de la conexi\u00f3n con el procesador dmp que incluye el sensor mpu6050 a una frecuencia de 400kHz y la configuraci\u00f3n de la comunicaci\u00f3n serie para imprimir en el monitor a 38400. Se contin\u00faa inicializando el dmp y estableciendo su pin de interrupciones.\n<br>\n<br>\nEs necesario indicar los valores iniciales del offset para los valores le\u00eddos por el giroscopio, que en cada caso ser\u00e1n diferentes, seg\u00fan c\u00f3mo est\u00e9 fabricado, en este caso los valores empleados son los que se muestran en la imagen anterior.\n<br>\n<br>\nSe sigue comprobando que la inicializaci\u00f3n del dmp ha sido correcta comprobando el contenido de la variable \u201cestadoDev\u201d. En caso de no haber problema se procede con su activaci\u00f3n\u00a0 y se espera a la primera interrupci\u00f3n, que indicar\u00e1 la existencia de nuevos datos, si al contrario sucede alg\u00fan problema, se imprime el mensaje de error.\n<br>\n<br>\nTermina la configuraci\u00f3n conectando cada servomotor al pin que le corresponde.\n<br>\n<br>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1110\" height=\"1690\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3.jpg\" alt=\"\" class=\"wp-image-9427\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3.jpg 1110w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3-197x300.jpg 197w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3-673x1024.jpg 673w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3-768x1169.jpg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Codigo3-1009x1536.jpg 1009w\" sizes=\"auto, (max-width: 1110px) 100vw, 1110px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"text-align: justify\">En cuanto al bucle de ejecuci\u00f3n principal, se puede observar en le primera l\u00ednea la comprobaci\u00f3n que se realiza del estado del dmp, pues este debe estar habilitado y correctamente conectado para poder realizar cualquier acci\u00f3n, en caso contrario el programa no avanzar\u00e1.\n<br>\n<br>\nSi el estado es el adecuado, se espera hasta tener datos disponibles en el buffer, implementado con el bucle while que aparece y en que se comprueba que se recibe una interrupci\u00f3n desde el sensor, la cual indicar\u00e1 la existencia de datos y permitir\u00e1 salir del bucle y continuar ejecutando.\n<br>\n<br>\nSe devuelve el estado de la interrupci\u00f3n a false,  se lee estado actual del mpu y se recibe el n\u00famero de bytes contenidos en el buffer. Esta informaci\u00f3n es importante para las comprobaciones que se realizan a continuaci\u00f3n, empezando por el estado en que se encuentra el mpu, que deber\u00e1 estar activo en ambos casos iniciales.\n<br>\n<br>\nEn el primer caso se comprueba si se produce Overflow de los datos del buffer y si se ha producido, se resetea el buffer por completo para volver a obtener datos nuevos y poder continuar con la ejecuci\u00f3n del programa sin interrumpir el funcionamiento, aunque en el resultado final se produces micro cortes en el movimiento del Estabilizador. Se devuelve el mensaje de error correspondiente a trav\u00e9s del monitor serie.\n<br>\n<br>\nPara la siguiente condici\u00f3n se establece que, si el estado de la interrupci\u00f3n devuelta por el dmp es activo, es decir, contiene datos \u00fatiles, se espera a que se devuelvan los datos producidos y se actualiza el valor de la variable contador de bytes actualmente en el buffer.\n<br>\n<br>\nA continuaci\u00f3n, se procede a obtener los datos de cuaterni\u00f3n, gravedad y \u00e1ngulo de inclinaci\u00f3n en los 3 ejes desde el dmp y almacenarlos en las variables dedicadas a estos.\n<br>\n<br>\nSe convierten los radianes de los \u00e1ngulos a grados sexagesimales para poder ser procesados por los servomotores y se inicia el proceso de calibrado del valor del eje Z, el cual consiste en una toma de 300 medidas hasta quedarse con la \u00faltima como la correcta. \n<br>\n<br>\nTras esto, se utiliza este valor para corregir la desviaci\u00f3n del valor le\u00eddo por el eje Z haciendo la resta del valor le\u00eddo con el valor \u201ccorrecto\u201d y almacenando la diferencia en ypr[0].\n<br>\n<br>\nEl siguiente elemento por ejecutar, es el c\u00e1lculo del \u00e1ngulo girado en el eje Z, el cual, se realiza a partir de los valores obtenidos y el tiempo transcurrido desde el instante en que se inicia el movimiento hasta que se desplaza el servomotor. Es necesario convertir este tiempo en segundos para poder mantener el sentido de las magnitudes que utiliza el giroscopio para los valores de aceleraci\u00f3n correspondientes.\n<br>\n<br>\nImportante recalcar que se ha establecido un factor de 0,05 para reducir la velocidad de movimiento de este eje, pues en un principio el \u00e1ngulo recorrido por este era mucho mayor que el que se quiere compensar haciendo que el Estabilizador deje de apuntar a la posici\u00f3n deseada.\n<br>\n<br>\nEn la l\u00ednea 208 se lee los valores del joystick para sus dos ejes y posteriormente se comprueba si existe se\u00f1al de movimiento, es decir, si se ha desplazado, y en caso afirmativo, se actualizan los valores de los offsets correspondientes, aumentando su valor un paso cada vez, que corresponde a un \u00e1ngulo de un grado en la vida real.\n<br>\n<br>\nA partir de este punto, ya se tienen calculados los \u00e1ngulos de cada eje, sin embargo, estos no est\u00e1n adaptados al rango de movimiento que ofrecen los servomotores empleados. Para solucionar esto, se utiliza el m\u00e9todo constrain para mantener los valores de los offsets en un rango de -90 a 90 grados, que es lo admitido por los servos, y la funci\u00f3n map encargada de transformar los datos finales antes de lanzarlos a los servos para que se encuentren en el rango de 0 a 180 grados.\n<br>\n<br>\nDebe recalcarse en este punto que el producto final debe compensar los movimientos de los 3 ejes, haciendo movimientos en el sentido contrario a estos y para ello se tiene en dichas funciones map el rango establecido al rev\u00e9s par el eje Z (de 180 a 0, en lugar de 0 a 180). \nSe termina escribiendo estos datos en los servos.\n<br>\n<br>\n<\/div>\n\n\n\n<p class=\"has-text-align-center has-black-color has-text-color has-link-color wp-elements-a01a46461cf74c8a7e20822e781eed49\" style=\"font-size:30px\"><strong>Problemas y soluciones encontradas<\/strong><\/p>\n\n\n\n<div style=\"text-align: justify\">Uno de los primeros problemas encontrados fue con los servomotores de rotaci\u00f3n continua que se adquirieron en un principio debido a que se vend\u00edan como servos de 360\u00ba, lo cual parec\u00eda interesante pues permitir\u00eda realizar rotaciones completas alrededor del eje. Sin embargo, estos servos giraban sin pausa con cualquier entrada de datos, es decir, no permit\u00edan girar con el \u00e1ngulo deseado, la soluci\u00f3n a este problema fue la compra de otro tipo de servomotores, esta vez de 180\u00ba.\n<br>\n<br>\nOtro de los problemas que tuvimos fue con el sensor, pues el primero comprado no contaba con giroscopio, solo contaba con aceler\u00f3metro y esto produc\u00eda que los movimientos fuesen menos precisos, la soluci\u00f3n a este problema ha sido la implementaci\u00f3n de un nuevo MCP6050, concretamente el modelo GY-521 que s\u00ed incluye tanto giroscopio como aceler\u00f3metro.\n<br>\n<br>\nEl mayor reto de este proyecto ha sido sin duda el c\u00f3digo, pues a pesar de partir de una base ya existente, ha resultado muy complicado conseguir alcanzar el movimiento deseado.\n<br>\n<br>\nEn un principio, el prototipo si quiera se mov\u00eda, y al comprobar los valores devueltos en el monitor serie no se obten\u00eda informaci\u00f3n que pudiera indicar un posible fallo de conexi\u00f3n con el dmp o alg\u00fan otro fallo, as\u00ed que se procedi\u00f3 a colocar prints estrat\u00e9gicos en distintos puntos del programa para comprobar hasta qu\u00e9 punto se llegaba a ejecutar, llegando a la conclusi\u00f3n de que se quedaba parado a la espera de datos en el bucle while del inicio del loop.\n<br>\n<br>\nEsto se debe probablemente a un sensor defectuoso, pues este bucle debe retener el programa hasta que se generen datos en el sensor y permitir la ejecuci\u00f3n en cuanto se tengan estos, pero en este caso, las interrupciones nunca llegaban, lo que indica que algo no funcionaba correctamente.\n<br>\n<br>\nPara solucionar este error se ha decidido ignorar esta comprobaci\u00f3n del bucle while, dejando estas l\u00edneas de c\u00f3digo comentadas, consiguiendo que al menos se moviera por unos segundos el Estabilizador.\n<br>\n<br>\nEl siguiente error se produc\u00eda a los pocos segundos de iniciar y provocaba que se quedara congelado y no reaccionara si quiera al accionamiento del joystick. Tras revisar los mensajes a trav\u00e9s del monitor serie, se pudo comprobar que siempre saltaba el error de buffer fifo lleno impidiendo continuar con la correcta ejecuci\u00f3n del programa. Esto se resolvi\u00f3 realizando un reset del buffer de comunicaci\u00f3n cada vez que se produce el llenado y evitando que este overflow impidiera la ejecuci\u00f3n del loop.\n<br>\n<br>\n<\/div>\n\n\n\n<p class=\"has-text-align-center has-black-color has-text-color has-link-color wp-elements-810772d51945fd11c5beb8ae1fd698c9\" style=\"font-size:30px\"><strong>Bibliograf\u00eda<\/strong><\/p>\n\n\n\n<p>Librer\u00edas de comunicaci\u00f3n I2c desarrolladas por Jeff Rowberg:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/jrowberg\/i2cdevlib\/tree\/master\/Arduino\/MPU6050\">https:\/\/github.com\/jrowberg\/i2cdevlib\/tree\/master\/Arduino\/MPU6050<\/a><\/p>\n\n\n\n<p>C\u00f3digo base obtenido de: <\/p>\n\n\n\n<p><a href=\"https:\/\/howtomechatronics.com\/projects\/diy-arduino-gimbal-self-stabilizing-platform\/\">https:\/\/howtomechatronics.com\/projects\/diy-arduino-gimbal-self-stabilizing-platform\/<\/a><\/p>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:30px\"><strong>V\u00eddeo explicativo<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE_G10_Gimbalino1.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE_G10_Gimbalino2.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE_G10_Gimbalino3.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE_G10_Gimbalino4.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:30px\"><strong>Autores<\/strong><\/p>\n\n\n\n<p>\u00c1lvaro D\u00edaz Fern\u00e1ndez<\/p>\n\n\n\n<p>Enrique Fern\u00e1ndez Godoy<\/p>\n\n\n\n<p>\u00c1ngel Gonz\u00e1lez Rodr\u00edguez<\/p>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:30px\"><strong>C\u00f3digo completo<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n  C\u00f3digo basado en el ejemplo MPU6050_DMP6 de la biblioteca i2cdevlib de Jeff Rowberg:\n  https:&#047;&#047;github.com\/jrowberg\/i2cdevlib\n*\/\n\/\/ I2Cdev y MPU6050 deben estar instalados como bibliotecas, o los archivos .cpp\/.h\n\/\/ para ambas clases deben estar en la ruta de inclusi\u00f3n de tu proyecto\n#include \"I2Cdev.h\"\n\n#include \"MPU6050_6Axis_MotionApps20.h\"\n\n\/\/ La biblioteca Wire de Arduino es requerida si se usa la implementaci\u00f3n I2CDEV_ARDUINO_WIRE\n\/\/ en I2Cdev.h\n#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE\n#include \"Wire.h\"\n#endif\n#include &lt;Servo.h&gt;\n\nMPU6050 mpu;\n\/\/MPU6050 mpu(0x69); \/\/ &lt;-- usar para AD0 alto\n\n\/\/ Declaraci\u00f3n de los 3 servos.\nServo servoZ;\nServo servoY;\nServo servoX;\nfloat correcto;\nint j = 0;  \/\/Contador para la calibraci\u00f3n al inicio.\n\n#define UMBRAL 100  \/\/ Zona sin movimiento del joystick, para asegurar que no se mueva \n\/\/si el jostick no se mueve.\n\n#define SALIDA_LEIBLE_YAWPITCHROLL\n\n#define PIN_INTERRUPCION 2  \/\/ usar el pin 2 en Arduino Uno y la mayor\u00eda de las placas\n\nbool estadoParpadeo = false;\n\n\/\/ Variables de control\/estado de MPU\nbool dmpListo = false;  \/\/ establecer en verdadero si la inicializaci\u00f3n de DMP fue exitosa\nuint8_t estadoIntMpu;   \/\/ contiene el byte de estado de interrupci\u00f3n actual del MPU\nuint8_t estadoDev;      \/\/ estado de retorno despu\u00e9s de cada operaci\u00f3n del dispositivo (0 = \u00e9xito, !0 = error)\nuint16_t tamanioPaquete;\/\/ tama\u00f1o esperado del paquete DMP (el valor por defecto es 42 bytes)\nuint16_t contadorFifo;  \/\/ conteo de todos los bytes actualmente en FIFO\nuint8_t bufferFifo&#091;64]; \/\/ buffer de almacenamiento FIFO\n\n\/\/ Variables de orientaci\u00f3n\/movimiento\nQuaternion q;           \/\/ &#091;w, x, y, z]         contenedor de cuaterniones\nVectorInt16 aa;         \/\/ &#091;x, y, z]            mediciones del sensor de aceleraci\u00f3n\nVectorInt16 aaReal;     \/\/ &#091;x, y, z]            mediciones del sensor de aceleraci\u00f3n sin gravedad\nVectorInt16 aaMundo;    \/\/ &#091;x, y, z]            mediciones del sensor de aceleraci\u00f3n en el marco del mundo\nVectorFloat gravedad;   \/\/ &#091;x, y, z]            vector de gravedad\nfloat euler&#091;3];         \/\/ &#091;psi, theta, phi]    contenedor de \u00e1ngulos de Euler\nfloat ypr&#091;3];           \/\/ &#091;yaw, pitch, roll]   contenedor de yaw\/pitch\/roll y vector de gravedad\nfloat anguloZ = 0; \/\/ \u00c1ngulo girado alrededor del eje Z\nunsigned long tiempoAnterior = 0; \/\/ Tiempo anterior para c\u00e1lculo de delta\n\n\/\/ Variables para el joystick\nconst int PIN_JOYSTICK_X = A0; \/\/ Pin  eje X del joystick\nconst int PIN_JOYSTICK_Y = A1; \/\/ Pin  eje Y del joystick\nconst int NEUTRAL_X = 830; \/\/ Valor neutro de eje X\nconst int NEUTRAL_Y = 815; \/\/ Valor neutro del eje Y\nconst int PASO_OFFSET = 1; \/\/ Paso  para el servo\nint offsetServoZ = 0; \/\/ Offset servo Z\nint offsetServoX = 0; \/\/ Offset servo X\n\n\n\n\/\/ ================================================================\n\/\/ ===               RUTINA DE DETECCI\u00d3N DE INTERRUPCIONES       ===\n\/\/ ================================================================\n\nvolatile bool interrupcionMpu = false;     \/\/ Indica si se produce una interrupcion por parte del mpu.\nvoid dmpDatosListos()\n{\n  interrupcionMpu = true;\n}\n\n\/\/ ================================================================\n\/\/ ===                      CONFIGURACI\u00d3N INICIAL                ===\n\/\/ ================================================================\n\nvoid setup() {\n  \/\/ unirse al bus I2C (la biblioteca I2Cdev no hace esto autom\u00e1ticamente)\n#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE\n  Wire.begin();\n  Wire.setClock(400000); \/\/ 400kHz reloj I2C. Comenta esta l\u00ednea si tienes dificultades de compilaci\u00f3n\n#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE\n  Fastwire::setup(400, true);\n#endif\n\n  \/\/ inicializar la comunicaci\u00f3n serie\n  Serial.begin(38400);\n  while (!Serial); \/\/ esperar a la enumeraci\u00f3n de Leonardo, otros contin\u00faan inmediatamente\n\n  \/\/ inicializar el dispositivo\n  Serial.println(F(\"Inicializando dispositivos I2C...\"));\n  mpu.initialize();\n  pinMode(PIN_INTERRUPCION, INPUT);\n  estadoDev = mpu.dmpInitialize();\n\n  \/\/ proporciona tus propios offsets de giroscopio aqu\u00ed, escalados para la sensibilidad m\u00ednima\n  mpu.setXGyroOffset(17);\n  mpu.setYGyroOffset(-69);\n  mpu.setZGyroOffset(27);\n  mpu.setZAccelOffset(1551); \n\n  \/\/ aseg\u00farate de que funcion\u00f3 (devuelve 0 si es as\u00ed)\n  if (estadoDev == 0) {\n    \/\/ activar el DMP, ahora que est\u00e1 listo\n    Serial.println(F(\"Activando DMP...\"));\n    mpu.setDMPEnabled(true);\n\n    attachInterrupt(digitalPinToInterrupt(PIN_INTERRUPCION), dmpDatosListos, RISING);\n    estadoIntMpu = mpu.getIntStatus();\n\n    \/\/ establecer nuestra bandera DMP Listo para que la funci\u00f3n principal loop() sepa que est\u00e1 bien usarlo\n    Serial.println(F(\"DMP listo! Esperando la primera interrupci\u00f3n...\"));\n    dmpListo = true;\n\n    \/\/ obtener el tama\u00f1o esperado del paquete DMP para comparaci\u00f3n posterior\n    tamanioPaquete = mpu.dmpGetFIFOPacketSize();\n  } else {\n    \/\/ \u00a1ERROR!\n    \/\/ 1 = carga de memoria inicial fallida\n    \/\/ 2 = actualizaciones de configuraci\u00f3n de DMP fallidas\n    \/\/ (si va a fallar, generalmente el c\u00f3digo ser\u00e1 1)\n    Serial.print(F(\"La inicializaci\u00f3n de DMP fall\u00f3 (c\u00f3digo \"));\n    Serial.print(estadoDev);\n    Serial.println(F(\")\"));\n  }\n\n  \/\/ Conexi\u00f3n de los servos.\n  servoZ.attach(11);\n  servoY.attach(10);\n  servoX.attach(9);\n}\n\/\/ ================================================================\n\/\/ ===                    BUCLE PRINCIPAL DEL PROGRAMA           ===\n\/\/ ================================================================\n\nvoid loop() {\n  \/\/ si la programaci\u00f3n fall\u00f3, no intentes hacer nada\n  if (!dmpListo) return;\n\n  \/\/ esperar a la interrupci\u00f3n del MPU o a paquetes adicionales disponibles\n  while (!interrupcionMpu &amp;&amp; contadorFifo &lt; tamanioPaquete) {\n    if (interrupcionMpu &amp;&amp; contadorFifo &lt; tamanioPaquete) {\n      \/\/ intentar salir del bucle infinito\n      contadorFifo = mpu.getFIFOCount();\n    }\n  }\n\n  \/\/ restablecer la bandera de interrupci\u00f3n y obtener el byte INT_STATUS\n  interrupcionMpu = false;\n  estadoIntMpu = mpu.getIntStatus();\n\n  \/\/ obtener el conteo actual de FIFO\n  contadorFifo = mpu.getFIFOCount();\n\n  \/\/ verificar desbordamiento (esto nunca deber\u00eda suceder a menos que nuestro c\u00f3digo sea demasiado ineficiente)\n  if ((estadoIntMpu &amp; _BV(MPU6050_INTERRUPT_FIFO_OFLOW_BIT)) || contadorFifo &gt;= 1024) {\n    \/\/ restablecer para que podamos continuar limpiamente\n    mpu.resetFIFO();\n    contadorFifo = mpu.getFIFOCount();\n    Serial.println(F(\"\u00a1Desbordamiento de FIFO!\"));\n\n    \/\/ de lo contrario, verificar la interrupci\u00f3n de datos DMP listos (esto deber\u00eda suceder con frecuencia)\n  } else if (estadoIntMpu &amp; _BV(MPU6050_INTERRUPT_DMP_INT_BIT)) {\n    \/\/ esperar a la longitud de datos disponibles correcta, deber\u00eda ser una espera MUY corta\n    while (contadorFifo &lt; tamanioPaquete) contadorFifo = mpu.getFIFOCount();\n\n    \/\/ leer un paquete de FIFO\n    mpu.getFIFOBytes(bufferFifo, tamanioPaquete);\n\n    \/\/ rastrear el conteo de FIFO aqu\u00ed en caso de que haya m\u00e1s de 1 paquete disponible\n    \/\/ (esto nos permite leer m\u00e1s inmediatamente sin esperar una interrupci\u00f3n)\n    contadorFifo -= tamanioPaquete;\n\n    \/\/ Obtener valores de Yaw, Pitch y Roll\n#ifdef SALIDA_LEIBLE_YAWPITCHROLL\n    mpu.dmpGetQuaternion(&amp;q, bufferFifo);\n    mpu.dmpGetGravity(&amp;gravedad, &amp;q);\n    mpu.dmpGetYawPitchRoll(ypr, &amp;q, &amp;gravedad);\n\n    \/\/ Valores de Yaw, Pitch, Roll - Radianes a grados\n    ypr&#091;0] = ypr&#091;0] * 180 \/ M_PI;\n    ypr&#091;1] = ypr&#091;1] * 180 \/ M_PI;\n    ypr&#091;2] = ypr&#091;2] * 180 \/ M_PI;\n    \n    \/\/ Saltar 300 lecturas (proceso de auto-calibraci\u00f3n)\n    if (j &lt;= 300) {\n      correcto = ypr&#091;0]; \/\/ Yaw comienza en un valor aleatorio, as\u00ed que capturamos el \u00faltimo valor despu\u00e9s de 300 lecturas\n      j++;\n    }\n    \/\/ Despu\u00e9s de 300 lecturas\n    else {\n      ypr&#091;0] = ypr&#091;0] - correcto; \/\/ Establecer el Yaw en 0 grados - restar el \u00faltimo valor aleatorio de Yaw del valor actual para hacer que el Yaw sea 0 grados\n\n      \/\/ Obtener la velocidad angular en el eje Z\n        int16_t gx, gy, gz;\n        mpu.getRotation(&amp;gx, &amp;gy, &amp;gz);\n\n        \/\/ Calcular el \u00e1ngulo de giro alrededor del eje Z\n        unsigned long tiempoActual = millis();\n        float deltaTiempo = (tiempoActual - tiempoAnterior) \/ 1000.0; \/\/ Convertir a segundos\n        anguloZ += (gz * deltaTiempo) * 0.05; \/\/ Integrar la velocidad angular para obtener el \u00e1ngulo\n        tiempoAnterior = tiempoActual;\n\n        \/\/ Leer los valores del joystick\n        int joystickX = analogRead(PIN_JOYSTICK_X); \/\/ Leer el eje X\n        int joystickY = analogRead(PIN_JOYSTICK_Y); \/\/ Leer el eje Y\n\n        \/\/ Controlar el servo Z con el joystick en el eje X\n        if (joystickX &lt; NEUTRAL_X - UMBRAL) {\n            offsetServoZ -= PASO_OFFSET; \/\/ Incrementar el offset\n        } else if (joystickX &gt; NEUTRAL_X + UMBRAL) {\n            offsetServoZ += PASO_OFFSET; \/\/ Decrementar el offset\n        }\n\n        \/\/ Limitar el offset del servo Z\n        offsetServoZ = constrain(offsetServoZ, -90, 90); \/\/ Limitar el rango del offset\n\n        \/\/ Controlar el servo 1 con el joystick en el eje Y\n        if (joystickY &lt; NEUTRAL_Y - UMBRAL) {\n            offsetServoX += PASO_OFFSET; \/\/ Incrementar el offset\n        } else if (joystickY &gt; NEUTRAL_Y + UMBRAL) {\n            offsetServoX -= PASO_OFFSET; \/\/ Decrementar el offset\n        }\n\n        \/\/ Limitar el offset del servo Y\n        offsetServoX = constrain(offsetServoX, -90, 90); \/\/ Limitar el rango del offset\n\n      \/\/ Mapear los valores del sensor MPU6050 de -90 a 90 a valores adecuados para el control del servo de 0 a 180\n      int valorServoZ = map(anguloZ + offsetServoZ, -90, 90, 180, 0);\n      int valorServoY = map(ypr&#091;1], -90, 90, 0, 180);\n      int valorServoX = map(ypr&#091;2] + offsetServoX, -90, 90, 0, 180);\n      \n      \/\/ Controlar los servos seg\u00fan la orientaci\u00f3n del MPU6050\n      servoZ.write(valorServoZ);\n      servoY.write(valorServoY);\n      servoX.write(valorServoX);\n    }\n#endif\n  }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n En la era digital actual, los Dispositivos Empotrados juegan un papel crucial en una amplia variedad de aplicaciones, desde la automatizaci\u00f3n industrial hasta los dispositivos de consumo diario. Estos sistemas, que combinan Hardware&#46;&#46;&#46;<\/p>\n","protected":false},"author":252,"featured_media":9309,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9305","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gimbalino - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gimbalino - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Introducci\u00f3n En la era digital actual, los Dispositivos Empotrados juegan un papel crucial en una amplia variedad de aplicaciones, desde la automatizaci\u00f3n industrial hasta los dispositivos de consumo diario. Estos sistemas, que combinan Hardware&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-20T19:53:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-21T16:10:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-576x1024.png\" \/>\n\t<meta property=\"og:image:width\" content=\"576\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"dse2425g10\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2425g10\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/\"},\"author\":{\"name\":\"dse2425g10\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/fe96bd1c549ddef1e5cf9e02d3fda0e2\"},\"headline\":\"Gimbalino\",\"datePublished\":\"2024-12-20T19:53:58+00:00\",\"dateModified\":\"2024-12-21T16:10:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/\"},\"wordCount\":3560,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Gimbal_full.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/\",\"name\":\"Gimbalino - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Gimbal_full.png\",\"datePublished\":\"2024-12-20T19:53:58+00:00\",\"dateModified\":\"2024-12-21T16:10:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Gimbal_full.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Gimbal_full.png\",\"width\":2160,\"height\":3840,\"caption\":\"Portada\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/gimbalino\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gimbalino\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/fe96bd1c549ddef1e5cf9e02d3fda0e2\",\"name\":\"dse2425g10\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g\",\"caption\":\"dse2425g10\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2425g10\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gimbalino - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/","og_locale":"es_ES","og_type":"article","og_title":"Gimbalino - Proyectos con Arduino.","og_description":"Introducci\u00f3n En la era digital actual, los Dispositivos Empotrados juegan un papel crucial en una amplia variedad de aplicaciones, desde la automatizaci\u00f3n industrial hasta los dispositivos de consumo diario. Estos sistemas, que combinan Hardware&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2024-12-20T19:53:58+00:00","article_modified_time":"2024-12-21T16:10:03+00:00","og_image":[{"width":576,"height":1024,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full-576x1024.png","type":"image\/png"}],"author":"dse2425g10","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2425g10","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/"},"author":{"name":"dse2425g10","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/fe96bd1c549ddef1e5cf9e02d3fda0e2"},"headline":"Gimbalino","datePublished":"2024-12-20T19:53:58+00:00","dateModified":"2024-12-21T16:10:03+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/"},"wordCount":3560,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/","name":"Gimbalino - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full.png","datePublished":"2024-12-20T19:53:58+00:00","dateModified":"2024-12-21T16:10:03+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Gimbal_full.png","width":2160,"height":3840,"caption":"Portada"},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/gimbalino\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Gimbalino"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/fe96bd1c549ddef1e5cf9e02d3fda0e2","name":"dse2425g10","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b9597347926773700c1d874ad0ae34c65af090635b344b725b9c45418c5b31c?s=96&d=mm&r=g","caption":"dse2425g10"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2425g10\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/252"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9305"}],"version-history":[{"count":9,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9305\/revisions"}],"predecessor-version":[{"id":9460,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9305\/revisions\/9460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/9309"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}