{"id":9112,"date":"2024-12-20T13:00:00","date_gmt":"2024-12-20T12:00:00","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9112"},"modified":"2024-12-20T20:45:33","modified_gmt":"2024-12-20T19:45:33","slug":"caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/","title":{"rendered":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin"},"content":{"rendered":"\n<p>Caja de seguridad de apertura autom\u00e1tica. Dispone de autenticaci\u00f3n facial, de huella y de c\u00f3digo pin. Permite proteger de una manera mucho m\u00e1s segura lo que se quiera guardar dentro.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"610\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-1024x610.jpeg\" alt=\"\" class=\"wp-image-9325\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-1024x610.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-300x179.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-768x457.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-1536x914.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-2048x1219.jpeg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La madera de contrachapado junto con los bordes met\u00e1licos, permiten hacer de esta caja un espacio seguro en el que guardar tus artilugios de mayor valor. Con sus autenticaciones biom\u00e9tricas, adem\u00e1s de la clave, podr\u00e1s asegurarte de que estos artilugios s\u00f3lo lleguen a las manos de las personas en las que m\u00e1s conf\u00edas.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Mi-pelicula.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u00cdndice<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Introducci\u00f3n<\/li>\n\n\n\n<li>Funcionamiento<\/li>\n\n\n\n<li>Material usado y costes<\/li>\n\n\n\n<li>Dise\u00f1o<\/li>\n\n\n\n<li>Implementaci\u00f3n<\/li>\n\n\n\n<li>Construcci\u00f3n<\/li>\n\n\n\n<li>Problemas y soluciones encontradas<\/li>\n\n\n\n<li>Posibles mejoras<\/li>\n\n\n\n<li>Demostraci\u00f3n<\/li>\n\n\n\n<li>Autores<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-left\">Para llevar a cabo este proyecto, se comenz\u00f3 planteando un problema que quer\u00edamos solucionar. Las cajas fuertes que vemos normalmente s\u00f3lo disponen de un c\u00f3digo pin. Esto las hace vulnerables a robo, puesto que, al final, \u00fanicamente un c\u00f3digo pin como seguridad puede no ser suficiente. <\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"207\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/image-1.png\" alt=\"\" class=\"wp-image-9120\" \/><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<p>Esto nos llev\u00f3 a desarrollar la idea de crear una caja fuerte que tuviera m\u00e1s opciones de seguridad, mediante el uso de sistemas extras adem\u00e1s del pin, como las autenticaciones biom\u00e9tricas.<\/p>\n\n\n\n<p>Inicialmente, se ide\u00f3 \u00fanicamente hacerlo con una autenticaci\u00f3n de huella, pero, al considerarlo insuficiente, decidimos a\u00f1adir el reconocimiento facial al proyecto, lo que, posteriormente, ser\u00eda lo que m\u00e1s dificultad traer\u00eda a su desarrollo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento<\/h2>\n\n\n\n<p>El funcionamiento del proyecto, realmente, es sencillo. Al final, se trata de una puerta que, en el caso de que todas las autenticaciones necesarias para cada caso se lleven a cabo correctamente, se dispondr\u00e1 de distintas funciones, como puede ser la de desbloquear la puerta de la caja fuerte, entrar en el \u00abmodo administrador\u00bb, insertar una nueva huella permitida, etc.<\/p>\n\n\n\n<p>Se diferencian varios casos de uso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si un usuario no permitido intenta abrir la caja insertando su huella, el LCD mostrar\u00e1 que se trata de un usuario no identificado, y la puerta no se desbloquear\u00e1, mostr\u00e1ndose eso mismo en la pantalla del LCD de nuevo.<\/li>\n\n\n\n<li>Si un usuario permitido, sin ser usuario administrador, intenta abrir la caja insertando su huella, el LCD mostrar\u00e1 que se trata de un usuario identificado, y la puerta se desbloquear\u00e1, mostr\u00e1ndose el mensaje correspondiente tambi\u00e9n en pantalla.<\/li>\n\n\n\n<li>Si un usuario administrador intenta abrir la caja con su huella, ocurrir\u00e1 lo mismo que con un usuario permitido, pero, adem\u00e1s, este usuario, una vez identificado por el reconocimiento facial, y habiendo metido el c\u00f3digo correspondiente para su correspondiente acceso, podr\u00e1 insertar m\u00e1s huellas por medio del teclado hexadecimal. En el teclado, la &#8216;#&#8217; tiene la funci\u00f3n de \u00abContinuar\u00bb, y el &#8216;*&#8217; la de \u00abCancelar\u00bb, las cuales ser\u00e1n necesarias para usar el \u00abmodo administrador\u00bb.<\/li>\n\n\n\n<li>Como caso de uso incorrecto, debe mencionarse que cualquier usuario que trate de acceder a funciones que no corresponden con su rol, al necesitar acceder a las mismas por medio de las autenticaciones biom\u00e9tricas, simplemente no ser\u00e1 capaz de conseguirlo.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Material usado y costes<\/h2>\n\n\n\n<p>Por parte de los materiales, detallamos en la tabla a continuaci\u00f3n los finalmente utilizados, adem\u00e1s del coste de los mismos.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Materiales<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Costes<\/strong><\/td><\/tr><tr><td>ESP32 USB C ESP32 CAM Placa de Desarrollo, WLAN\/Bluetooth, ESP32 DC 5V Placa de Desarrollo de Doble n\u00facleo con m\u00f3dulo de c\u00e1mara 2640<\/td><td class=\"has-text-align-center\" data-align=\"center\">11,99 \u20ac<\/td><\/tr><tr><td>M\u00f3dulo USB a UART TTL (CP2102 DTR PIN ARCP2102P6)<\/td><td class=\"has-text-align-center\" data-align=\"center\">7 \u20ac<\/td><\/tr><tr><td>Adaptador USB C a entrada USB de Carga y Datos<\/td><td class=\"has-text-align-center\" data-align=\"center\">3 \u20ac<\/td><\/tr><tr><td>Sensor de huellas dactilares FPM10A<\/td><td class=\"has-text-align-center\" data-align=\"center\">10,02 \u20ac<\/td><\/tr><tr><td>Interruptor de fin de carrera<\/td><td class=\"has-text-align-center\" data-align=\"center\">3,21 \u20ac<\/td><\/tr><tr><td>Teclado hexadecimal 4&#215;4<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>LCD con Bus I2C<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>Servomotor<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>Resistencias<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>Cables<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>Placa Arduino UNO<\/td><td class=\"has-text-align-center\" data-align=\"center\">Proporcionado en el kit<\/td><\/tr><tr><td>Tabl\u00f3n de madera 60&#215;60 cm (2 unidades)<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Tabl\u00f3n de madera fina 60&#215;60 cm (2 unidades)<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Manillar peque\u00f1o<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Tornillos (Aprox. 20 unidades)<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Piezas de metal<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Extras (para montaje, decoraci\u00f3n, etc.)<\/td><td class=\"has-text-align-center\" data-align=\"center\">36,40 \u20ac<\/td><\/tr><tr><td><strong>Coste total<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">71,62<strong> \u20ac<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Por parte de los materiales de 0 \u20ac, se trata de los materiales que han sido proporcionados de manera gratuita por parte de un familiar de una de las integrantes del grupo, permiti\u00e9ndonos ahorrar considerablemente en su montaje.<\/p>\n\n\n\n<p>Adem\u00e1s, los materiales cuyo precio se define por \u201cProporcionado en el kit\u201d se refiere a materiales que han sido proporcionados por los docentes en un kit entregado a principio de curso, o a materiales de los que los integrantes del grupo ya dispon\u00edamos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dise\u00f1o<\/h2>\n\n\n\n<p>Para el dise\u00f1o del circuito electr\u00f3nico, este se ha creado con ayuda de la aplicaci\u00f3n Tinkercad, con la cual se pudo hacer un dise\u00f1o m\u00e1s cercano a la realidad, tal y como se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"399\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Copy-of-Super-Allis-1-1-1024x399.png\" alt=\"\" class=\"wp-image-9316\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Copy-of-Super-Allis-1-1-1024x399.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Copy-of-Super-Allis-1-1-300x117.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Copy-of-Super-Allis-1-1-768x299.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Copy-of-Super-Allis-1-1.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para explicar las conexiones realizadas en el circuito, lo dividiremos por componentes en los siguientes apartados para un mejor entendimiento.<\/p>\n\n\n\n<p><strong>Placa ESP32 con C\u00e1mara OV2640<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Placa ESP32<\/strong><\/td><td><strong>Placa Protoboard<\/strong><\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><tr><td>+5V<\/td><td>5V<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Es necesario destacar que, debido a que el puerto de la ESP32 del que se dispone es de tipo USB C, ha sido necesario comprar dos adaptadores, un adaptador USB C a entrada USB, y un adaptador USB a TTL, consiguiendo as\u00ed conectarla con la placa Arduino.<\/p>\n\n\n\n<p><strong>Sensor de Huella Dactilar<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Puertos Arduino<\/strong><\/td><td><strong>Pines Sensor de Huella Dactilar<\/strong><\/td><\/tr><tr><td>2<\/td><td>TXD<\/td><\/tr><tr><td>3<\/td><td>RXD<\/td><\/tr><tr><td>5V<\/td><td>+5V<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Fin de carrera (Bot\u00f3n en el dise\u00f1o con Tinkercad)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Puertos Arduino<\/strong><\/td><td><strong>Pines <strong>Servomotor<\/strong><\/strong><\/td><\/tr><tr><td>4<\/td><td>NO (Placa Protoboard)<\/td><\/tr><tr><td>5V<\/td><td>NO (Placa Protoboard)<\/td><\/tr><tr><td>GND<\/td><td>COM<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Cabe destacar que para la implementaci\u00f3n del bot\u00f3n se han usado dos patillas NO y COM. Para hacerlo, primero se ha limitado la transmisi\u00f3n de corriente mediante una resistencia de 10 k\u03a9, y despu\u00e9s se ha conectado al circuito el bot\u00f3n mediante la patilla NO, la cual proporciona los datos al puerto Arduino 4 y la corriente al mismo tiempo, posteriormente cerrando el circuito desde la patilla COM del bot\u00f3n, la cual conecta al GND.<\/p>\n\n\n\n<p><strong>Servomotor<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Puertos Arduino<\/strong><\/td><td><strong>Pines <strong>Servomotor<\/strong><\/strong><\/td><\/tr><tr><td>5<\/td><td>Data<\/td><\/tr><tr><td>5V<\/td><td>VCC<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Teclado Hexadecimal 4&#215;4<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Puertos Arduino<\/strong><\/td><td><strong>Pines <strong>Teclado Hexadecimal 4&#215;4<\/strong><\/strong><\/td><\/tr><tr><td>6<\/td><td>Columna 4<\/td><\/tr><tr><td>7<\/td><td>Columna 3<\/td><\/tr><tr><td>8<\/td><td>Columna 2<\/td><\/tr><tr><td>9<\/td><td>Columna 1<\/td><\/tr><tr><td>10<\/td><td>Fila 4<\/td><\/tr><tr><td>11<\/td><td>Fila 3<\/td><\/tr><tr><td>12<\/td><td>Fila 2<\/td><\/tr><tr><td>13<\/td><td>Fila 1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>LCD con un Bus I2C<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Puertos Arduino<\/strong><\/td><td><strong><strong>Pines <strong>LCD I2C<\/strong><\/strong><\/strong><\/td><\/tr><tr><td>A4<\/td><td>SDA<\/td><\/tr><tr><td>A5<\/td><td>SCL<\/td><\/tr><tr><td>5V<\/td><td>VCC<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n<\/h2>\n\n\n\n<p>Por parte de la implementaci\u00f3n software, el proyecto se cre\u00f3 con el siguiente c\u00f3digo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Archivo para que se abra el servidor web, y para que los pines de la c\u00e1mara se establezcan y conecten correctamente (c\u00f3digo de ejemplo).<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"esp_camera.h\"\n#include &lt;WiFi.h&gt;\n\n\/\/\n\/\/ WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality\n\/\/            Ensure ESP32 Wrover Module or other board with PSRAM is selected\n\/\/            Partial images will be transmitted if image exceeds buffer size\n\/\/\n\/\/            You must select partition scheme from the board menu that has at least 3MB APP space.\n\/\/            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15\n\/\/            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well\n\n\/\/ ===================\n\/\/ Select camera model\n\/\/ ===================\n\/\/#define CAMERA_MODEL_WROVER_KIT \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_ESP_EYE  \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_ESP32S3_EYE \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_PSRAM \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_V2_PSRAM \/\/ M5Camera version B Has PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_WIDE \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_ESP32CAM \/\/ No PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_UNITCAM \/\/ No PSRAM\n\/\/#define CAMERA_MODEL_M5STACK_CAMS3_UNIT  \/\/ Has PSRAM\n#define CAMERA_MODEL_AI_THINKER \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_TTGO_T_JOURNAL \/\/ No PSRAM\n\/\/#define CAMERA_MODEL_XIAO_ESP32S3 \/\/ Has PSRAM\n\/\/ ** Espressif Internal Boards **\n\/\/#define CAMERA_MODEL_ESP32_CAM_BOARD\n\/\/#define CAMERA_MODEL_ESP32S2_CAM_BOARD\n\/\/#define CAMERA_MODEL_ESP32S3_CAM_LCD\n\/\/#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 \/\/ Has PSRAM\n\/\/#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 \/\/ Has PSRAM\n#include \"camera_pins.h\"\n\n\/\/ ===========================\n\/\/ Enter your WiFi credentials\n\/\/ ===========================\nconst char *ssid = \"iPhone de Paula\";\nconst char *password = \"***********\";\n\nvoid startCameraServer();\nvoid setupLedFlash(int pin);\n\nvoid setup() {\n  Serial.begin(115200);\n  Serial.setDebugOutput(true);\n  Serial.println();\n\n  camera_config_t config;\n  config.ledc_channel = LEDC_CHANNEL_0;\n  config.ledc_timer = LEDC_TIMER_0;\n  config.pin_d0 = Y2_GPIO_NUM;\n  config.pin_d1 = Y3_GPIO_NUM;\n  config.pin_d2 = Y4_GPIO_NUM;\n  config.pin_d3 = Y5_GPIO_NUM;\n  config.pin_d4 = Y6_GPIO_NUM;\n  config.pin_d5 = Y7_GPIO_NUM;\n  config.pin_d6 = Y8_GPIO_NUM;\n  config.pin_d7 = Y9_GPIO_NUM;\n  config.pin_xclk = XCLK_GPIO_NUM;\n  config.pin_pclk = PCLK_GPIO_NUM;\n  config.pin_vsync = VSYNC_GPIO_NUM;\n  config.pin_href = HREF_GPIO_NUM;\n  config.pin_sccb_sda = SIOD_GPIO_NUM;\n  config.pin_sccb_scl = SIOC_GPIO_NUM;\n  config.pin_pwdn = PWDN_GPIO_NUM;\n  config.pin_reset = RESET_GPIO_NUM;\n  config.xclk_freq_hz = 20000000;\n  config.frame_size = FRAMESIZE_UXGA;\n  config.pixel_format = PIXFORMAT_JPEG;  \/\/ for streaming\n  \/\/config.pixel_format = PIXFORMAT_RGB565; \/\/ for face detection\/recognition\n  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;\n  config.fb_location = CAMERA_FB_IN_PSRAM;\n  config.jpeg_quality = 12;\n  config.fb_count = 1;\n\n  \/\/ if PSRAM IC present, init with UXGA resolution and higher JPEG quality\n  \/\/                      for larger pre-allocated frame buffer.\n  if (config.pixel_format == PIXFORMAT_JPEG) {\n    if (psramFound()) {\n      config.jpeg_quality = 10;\n      config.fb_count = 2;\n      config.grab_mode = CAMERA_GRAB_LATEST;\n    } else {\n      \/\/ Limit the frame size when PSRAM is not available\n      config.frame_size = FRAMESIZE_SVGA;\n      config.fb_location = CAMERA_FB_IN_DRAM;\n    }\n  } else {\n    \/\/ Best option for face detection\/recognition\n    config.frame_size = FRAMESIZE_240X240;\n#if CONFIG_IDF_TARGET_ESP32S3\n    config.fb_count = 2;\n#endif\n  }\n\n#if defined(CAMERA_MODEL_ESP_EYE)\n  pinMode(13, INPUT_PULLUP);\n  pinMode(14, INPUT_PULLUP);\n#endif\n\n  \/\/ camera init\n  esp_err_t err = esp_camera_init(&amp;config);\n  if (err != ESP_OK) {\n    Serial.printf(\"Camera init failed with error 0x%x\", err);\n    return;\n  }\n\n  sensor_t *s = esp_camera_sensor_get();\n  \/\/ initial sensors are flipped vertically and colors are a bit saturated\n  if (s-&gt;id.PID == OV3660_PID) {\n    s-&gt;set_vflip(s, 1);        \/\/ flip it back\n    s-&gt;set_brightness(s, 1);   \/\/ up the brightness just a bit\n    s-&gt;set_saturation(s, -2);  \/\/ lower the saturation\n  }\n  \/\/ drop down frame size for higher initial frame rate\n  if (config.pixel_format == PIXFORMAT_JPEG) {\n    s-&gt;set_framesize(s, FRAMESIZE_QVGA);\n  }\n\n#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)\n  s-&gt;set_vflip(s, 1);\n  s-&gt;set_hmirror(s, 1);\n#endif\n\n#if defined(CAMERA_MODEL_AI_THINKER)\n  s-&gt;set_vflip(s, 1);\n#endif\n\n\/\/ Setup LED FLash if LED pin is defined in camera_pins.h\n#if defined(LED_GPIO_NUM)\n  setupLedFlash(LED_GPIO_NUM);\n#endif\n\n  WiFi.begin(ssid, password);\n  WiFi.setSleep(false);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  Serial.println(\"\");\n  Serial.println(\"WiFi connected\");\n\n  startCameraServer();\n\n  Serial.print(\"Camera Ready! Use 'http:\/\/\");\n  Serial.print(WiFi.localIP());\n  Serial.println(\"' to connect\");\n}\n\nvoid loop() {\n  \/\/ Do nothing. Everything is done in another task by the web server\n  delay(10000);\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Archivo de Python para el reconocimiento facial y para la se\u00f1al Arduino.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import face_recognition\nimport numpy as np\nimport cv2\nimport requests\nimport serial\nimport os\n\n# Configuraci\u00f3n\nESP32_CAM_URL = \"http:\/\/172.20.10.3\/capture\"  # Sustituye con la IP de tu ESP32-CAM\nCARPETA_rostros_autorizados = \"c:\/Users\/peb17\/Desktop\/rostros_autorizados\"  # Carpeta con im\u00e1genes conocidas\nARDUINO_PORT = \"COM5\"  # Sustituye con el puerto donde est\u00e1 conectado tu Arduino\nBAUDRATE = 9600\n\n\n# Funci\u00f3n para cargar los rostros autorizados desde la carpeta\ndef cargar_rostros_autorizados(carpeta):\n    if not os.path.exists(carpeta):\n        print(f\"Error: Directory '{carpeta}' does not exist.\")\n        exit()\n    rostros_autorizados = &#091;]\n    nombres = &#091;]\n    for archivo in os.listdir(carpeta):\n        # Solo consideramos archivos de imagen (puedes ampliar esta lista si es necesario)\n        if archivo.lower().endswith(('.png', '.jpg', '.jpeg')):\n            ruta_imagen = os.path.join(carpeta, archivo)\n            imagen = face_recognition.load_image_file(ruta_imagen)\n            encoding = face_recognition.face_encodings(imagen)\n            if encoding:\n                rostros_autorizados.append(encoding&#091;0])  # A\u00f1adir el encoding del rostro\n                nombres.append(os.path.splitext(archivo)&#091;0])  # El nombre ser\u00e1 el nombre del archivo (sin extensi\u00f3n)\n            else:\n                print(f\"Advertencia: No se pudo extraer el rostro de {archivo}\")\n    print(f\"Rostros autorizados cargados: {len(rostros_autorizados)}\")\n    return rostros_autorizados, nombres\n\n\n# Obtener imagen de la ESP32-CAM\ndef capturar_imagen(url):\n    try:\n        response = requests.get(url, stream=True)\n        if response.status_code == 200:\n            bytes_img = bytearray(response.content)\n            np_array = np.frombuffer(bytes_img, dtype=np.uint8)\n            imagen = cv2.imdecode(np_array, cv2.IMREAD_COLOR)\n            return imagen\n    except Exception as e:\n        print(f\"Error al capturar imagen: {e}\")\n    return None\n\n# Configuraci\u00f3n inicial\nrostros_autorizados_conocidas, nombres_conocidos = cargar_rostros_autorizados(CARPETA_rostros_autorizados)\narduino = serial.Serial(ARDUINO_PORT, BAUDRATE)\nprint(\"Sistema listo. Esperando im\u00e1genes...\")\n\nwhile True:\n    # Capturar imagen de la ESP32-CAM\n    imagen = capturar_imagen(ESP32_CAM_URL)\n    if imagen is not None:\n        # Mostrar la imagen para depuraci\u00f3n\n        cv2.imshow(\"Imagen Capturada\", imagen)\n        cv2.waitKey(1)  # Espera por 1 milisegundo para mostrar la imagen\n\n        # Convertir la imagen a RGB\n        rgb_imagen = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGB)\n\n        # Detectar rostros en la imagen capturada\n        ubicaciones_rostros = face_recognition.face_locations(rgb_imagen)\n        print(f\"Ubicaciones de rostros detectados: {ubicaciones_rostros}\")\n        encodings_rostros = face_recognition.face_encodings(rgb_imagen, ubicaciones_rostros)\n\n        if not ubicaciones_rostros:\n            print(\"No se detectaron rostros.\")\n            # No se hace nada si no hay rostros\n            continue\n\n        cara_reconocida = False\n        for encoding in encodings_rostros:\n            # Comparar con los rostros autorizados conocidos\n            resultados = face_recognition.compare_faces(rostros_autorizados_conocidas, encoding, tolerance=0.5)\n            if True in resultados:\n                indice = resultados.index(True)\n                nombre = nombres_conocidos&#091;indice]\n                print(f\"Cara reconocida: {nombre}\")\n                arduino.write(b'2')  # Enviar se\u00f1al de \"Cara conocida\" al Arduino\n                cara_reconocida = True\n                break\n        \n        if not cara_reconocida:\n            print(\"Cara no  reconocida\")\n            arduino.write(b'1')  # Enviar se\u00f1al de \"No reconocida\" al Arduino\n\n    else:\n        print(\"No se pudo capturar imagen\")<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Archivo Arduino para la configuraci\u00f3n del comportamiento del resto de componentes.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/LIBRERIAS\n#include &lt;Adafruit_Fingerprint.h&gt;\n#include &lt;Keypad.h&gt;\n#include &lt;Wire.h&gt;\n#include &lt;LiquidCrystal_I2C.h&gt;\n#include &lt;Servo.h&gt;\n\n\/\/SENSOR DE HUELLA\nSoftwareSerial mySerial(2, 3);\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;mySerial);\nint id_finding;\nint id;\nint temp;\nchar resp;\n\n\/\/SERVOMOTOR Y FINAL DE CARRERA\nServo servo;\nint angulo;\nconst int boton = 4;\nbool abierto = false;\nunsigned long lastButtonTime = 0;               \/\/ Tiempo del \u00faltimo cambio de estado del bot\u00f3n\nunsigned long lastFingerprintTime = 0;          \/\/ Tiempo de la \u00faltima operaci\u00f3n de huella\nconst unsigned long debounceDelay = 300;        \/\/ Retardo para debounce del bot\u00f3n\nconst unsigned long fingerprintTimeout = 5000;  \/\/ Tiempo m\u00e1ximo para registrar huella\n\/\/PANTALLA LCD\nLiquidCrystal_I2C lcd(0x27, 16, 2);\nString mensajeActual = \"\";\n\n\/\/KEYPAD\nconst byte rows = 4;\nconst byte columns = 4;\nchar keys&#091;rows]&#091;columns] = {\n  { '1', '2', '3', 'A' },\n  { '4', '5', '6', 'B' },\n  { '7', '8', '9', 'C' },\n  { '*', '0', '#', 'D' }\n};\nconst byte rowPins&#091;rows] = { 13, 12, 11, 10 };\nconst byte columnPins&#091;columns] = { 9, 8, 7, 6 };\nKeypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows, columns);\nString codigo_ingresado = \"\";\nString codigo_correcto = \"1234\";\n\n\/\/CAMARA\nbool admin = false;\n\/\/FUNCIONES ADICIONALES\nvoid leerHuella();\nvoid validarCodigo();\nvoid verificarEstadoPuerta();\nint getFingerprintIDez();\nuint8_t getFingerprintEnroll(int id_enroll);\n\n\nvoid setup() {\n  lcd.init();\n  lcd.backlight();\n  finger.begin(57600);\n  Serial.begin(9600);\n  if (!finger.verifyPassword()) {\n    lcd.print(\"Sensor no encontrado\");\n    while (1)\n      ;\n  } else {\n    lcd.print(\"SEGURIDAD\");\n    lcd.setCursor(0, 1);\n    lcd.print(\"LISTA\");\n  }\n  delay(1500);\n  lcd.clear();\n  servo.attach(5);\n  servo.write(0);\n  pinMode(boton, INPUT_PULLUP);  \/\/ Configura el bot\u00f3n como entrada con resistencia pull-up\n}\n\n\nvoid loop() {\n  verificarEstadoPuerta();  \/\/ Verificar bot\u00f3n y estado de la puerta\n  verificarAdmin();\n  if (!abierto) {  \/\/ Si la puerta est\u00e1 cerrada\n    leerHuella();\n  } else {  \/\/ Si la puerta est\u00e1 abierta\n    validarCodigo();\n  }\n}\n\nvoid verificarAdmin() {\n\n  char receivedChar = Serial.read();\n  if (receivedChar == '2') {\n    admin = true;\n    lcd.setCursor(15, 1);\n    lcd.print(\"*\");\n  } else if (receivedChar == '1') {\n    admin = false;\n    lcd.setCursor(15, 1);\n    lcd.print(\" \");\n  }\n  if (admin) {\n    lcd.setCursor(15, 1);\n    lcd.print(\"*\");\n  } else {\n    lcd.setCursor(15, 1);\n    lcd.print(\" \");\n  }\n}\nvoid verificarEstadoPuerta() {\n  static unsigned long lastDebounceTime = 0;  \/\/ \u00daltimo tiempo de cambio de estado\n  static bool lastButtonState = HIGH;         \/\/ \u00daltimo estado conocido del bot\u00f3n\n  bool reading = digitalRead(boton);          \/\/ Leer el estado actual del bot\u00f3n\n\n  \/\/ Si el estado del bot\u00f3n ha cambiado\n  if (reading != lastButtonState) {\n    lastDebounceTime = millis();  \/\/ Reiniciar el temporizador\n  }\n\n  \/\/ Si el estado ha estado estable por m\u00e1s de debounceDelay\n  if ((millis() - lastDebounceTime) &gt; debounceDelay) {\n    if (reading != abierto) {\n      abierto = reading;  \/\/ Actualizar el estado de la puerta\n      if (abierto) {\n        abrirPuerta();\n      } else {\n        cerrarPuerta();\n      }\n    }\n  }\n\n  lastButtonState = reading;  \/\/ Guardar el estado actual\n}\nvoid leerHuella() {\n  id_finding = getFingerprintIDez();\n  if (id_finding == 0) {\n    lcd.setCursor(0, 1);\n    lcd.print(\"No identificado\");\n    delay(1000);\n    lcd.clear();\n    lcd.print(\"Puerta cerrada\");\n  } else if (id_finding &gt; 0) {\n    lcd.clear();\n    lcd.print(\"Usuario\");\n    lcd.setCursor(0, 1);\n    lcd.print(\"identificado\");\n    delay(1000);\n    abrirPuerta();\n  }\n}\n\nvoid validarCodigo() {\n  lcd.setCursor(0, 1);\n  char key = keypad.getKey();\n  if (key) {\n    if (key == '#') {  \/\/ Confirmar c\u00f3digo\n      if (codigo_ingresado == codigo_correcto) {\n        if (admin) {\n          lcd.clear();\n          lcd.print(\"Codigo correcto\");\n          delay(1000);\n          getFingerprintEnroll(finger.templateCount + 1);\n        } else {\n          lcd.clear();\n          lcd.print(\"No modo admin\");\n          delay(1000);\n        }\n        lcd.clear();\n        lcd.print(\"Puerta abierta\");\n      } else {\n        lcd.clear();\n        lcd.print(\"Codigo\");\n        lcd.setCursor(0,1);\n        lcd.print(\"Incorrecto\");\n        delay(1000);\n        codigo_ingresado = \"\";\n        lcd.clear();\n        lcd.print(\"Puerta abierta\");\n      }\n      codigo_ingresado = \"\";  \/\/ Reinicia el c\u00f3digo\n    } else if (key == '*') {  \/\/ Cancelar ingreso\n      lcd.clear();\n      lcd.print(\"Ingreso cancelado\");\n      codigo_ingresado = \"\";\n      delay(1000);\n      lcd.clear();\n      lcd.print(\"Puerta abierta\");\n    } else if (codigo_ingresado.length() &lt; 4) {\n      codigo_ingresado += key;  \/\/ Agregar d\u00edgito al c\u00f3digo\n      lcd.print(codigo_ingresado);\n    }\n  }\n}\n\nint getFingerprintIDez() {\n  uint8_t p = finger.getImage();\n  if (p != FINGERPRINT_OK) return -1;\n\n  p = finger.image2Tz();\n  if (p != FINGERPRINT_OK) return -1;\n\n  p = finger.fingerFastSearch();\n  if (p != FINGERPRINT_OK) return 0;\n\n  return finger.fingerID;\n}\nuint8_t getFingerprintEnroll(int id_enroll) {\n  int p = -1;\n  \/\/Serial.print(\"Registrando ID: \");\n  \/\/Serial.println(id_enroll);\n  lcd.clear();\n  lcd.print(\"Coloque su dedo\");\n  temp = 0;\n  while (temp &lt; 5000) {\n    temp++;\n    \/\/Serial.println(temp);\n    p = finger.getImage();\n    switch (p) {\n      case FINGERPRINT_OK:\n        lcd.clear();\n        lcd.print(\"Huella leida\");\n        break;\n      default:\n        \/\/Serial.println(\"Unknown error 1\");\n        break;\n    }\n    if (p == FINGERPRINT_OK) {\n      break;  \/\/termina el while\n    }\n  }\n  if (temp &gt;= 5000) {\n    lcd.clear();\n    lcd.print(\"Termino el tiempo\");\n    return 0;\n  }\n  \/\/ OK success!\n\n  p = finger.image2Tz(1);\n  switch (p) {\n    case FINGERPRINT_OK:\n      lcd.clear();\n      lcd.print(\"Imagen convertida\");\n      break;\n    default:\n      lcd.clear();\n      lcd.print(\"Error conviertiendo imagen\");\n      return p;\n  }\n  lcd.clear();\n  lcd.print(\"Retire el dedo\");\n  delay(2000);\n  lcd.clear();\n  lcd.print(\"Coloque el dedo\");\n  lcd.setCursor(0, 1);\n  lcd.print(\"nuevamente\");\n  delay(500);\n  temp = 0;\n  while (temp &lt; 5000) {\n    temp++;\n    \/\/Serial.println(temp);\n    p = finger.getImage();\n    if (p == FINGERPRINT_OK) {\n      lcd.clear();\n      lcd.print(\"Huella leida\");\n      delay(500);\n      break;\n    }\n  }\n  if (temp == 5000) {\n    lcd.clear();\n    lcd.print(\"Termino el tiempo\");\n    delay(500);\n    return 0;\n  }\n  \/\/ OK success!\n  p = finger.image2Tz(2);\n  switch (p) {\n    case FINGERPRINT_OK:\n      lcd.clear();\n      lcd.print(\"Imagen convertida\");\n      delay(1000);\n      break;\n    default:\n      lcd.clear();\n      lcd.print(\"Error convirtiendo imagen\");\n      delay(1000);\n      return p;\n  }\n  \/\/ OK converted!\n  lcd.print(\"Creando huella: \");\n  Serial.println(id_enroll);\n  p = finger.createModel();\n  if (p == FINGERPRINT_OK) {\n    lcd.clear();\n    lcd.print(\"Modelo correcto!\");\n    delay(1000);\n  } else {\n    lcd.clear();\n    lcd.print(\"Error creando modelo\");\n    delay(1000);\n    return p;\n  }\n\n  p = finger.storeModel(id_enroll);\n  if (p == FINGERPRINT_OK) {\n    lcd.clear();\n    lcd.print(\"Guardado!\");\n    delay(1000);\n  } else {\n    lcd.clear();\n    lcd.print(\"Error guardando\");\n    delay(1000);\n    return p;\n  }\n  return 1;\n}\nvoid abrirPuerta() {\n  if (angulo != 180) {\n    servo.attach(5);   \/\/ Conectar el servo\n    servo.write(180);  \/\/ Mover a la posici\u00f3n\n    delay(500);        \/\/ Esperar para asegurar la posici\u00f3n\n    servo.detach();    \/\/ Desconectar el servo\n    angulo = 180;\n  }\n  mostrarMensaje(\"Puerta abierta\");\n}\n\nvoid cerrarPuerta() {\n  if (angulo != 125) {\n    servo.attach(5);   \/\/ Conectar el servo\n    servo.write(125);  \/\/ Mover a la posici\u00f3n\n    delay(500);        \/\/ Esperar para asegurar la posici\u00f3n\n    servo.detach();    \/\/ Desconectar el servo\n    angulo = 125;\n    admin = 0;\n  }\n  mostrarMensaje(\"Puerta cerrada\");\n}\n\nvoid mostrarMensaje(String mensaje) {\n  if (mensaje != mensajeActual) {  \/\/ Solo actualiza si el mensaje es diferente\n    lcd.clear();\n    lcd.print(mensaje);\n    mensajeActual = mensaje;  \/\/ Guarda el mensaje actual\n  }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Construcci\u00f3n<\/h2>\n\n\n\n<p>Por parte de la construcci\u00f3n f\u00edsica del dise\u00f1o, se llev\u00f3 a cabo en los siguientes pasos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Se plante\u00f3 un boceto inicial, porque se necesitaba una caja bastante grande, que cumpliese con la funci\u00f3n principal, y a su vez, contuviese los componentes necesarios.<\/li>\n\n\n\n<li>Se contact\u00f3 con el familiar de una integrante que estaba bastante emocionado por el proyecto, y se ofreci\u00f3 a montar la base de la caja con varios tablones de madera y tornillos para fijar las dos estructuras y la puerta.<\/li>\n\n\n\n<li>Se dise\u00f1\u00f3 la manera en la que dispondr\u00edamos los componentes que necesitaban acceso al exterior de la caja, y se hicieron los agujeros necesarios para sus conexiones.<\/li>\n\n\n\n<li>Se dise\u00f1aron las estructuras para el LCD y para la c\u00e1mara que las sujetar\u00edan en cierto \u00e1ngulo y proteger\u00edan y esconder\u00edan los componentes.<\/li>\n\n\n\n<li>Se cortaron las piezas necesarias para estas estructuras de un cart\u00f3n bastante resistente, y se pegaron con silicona caliente. Los refuerzos que se necesitaron se hicieron con cinta americana.<\/li>\n\n\n\n<li>Para la caja grande, se hicieron varias placas de este mismo material para crear un \u00abfalso fondo\u00bb, con el que, adem\u00e1s de disimular las imperfecciones y mejorar la est\u00e9tica del interior de la caja, se pudo esconder el fin de carrera, as\u00ed como sus cables y los del servomotor.<\/li>\n\n\n\n<li>Se pint\u00f3 toda la estructura de negro mate, el pomo y el interior de la caja (el suelo y los falsos fondos) se pintaron de plata, y finalmente se a\u00f1adieron tiras de goma EVA plateada brillante para darle nuestro toque personal.<\/li>\n<\/ol>\n\n\n\n<p>Cabe destacar que algunos pasos intermedios fueron el lijar, a\u00f1adir masilla para corregir imperfecciones de la estructura, o ir perfeccionando la pintura en algunas zonas para una mejor presentaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas y soluciones encontradas<\/h2>\n\n\n\n<p>Nuestro problema principal fue conseguir que funcionase la red neuronal, debido a que est\u00e1bamos usando una placa Nano BLE 33 Sense Lite con c\u00e1mara OV7675, que era \u00fanicamente compatible con Edge Impulse. Se lleg\u00f3 a conseguir que se identificasen personas, pero, al final, lo que se quer\u00eda era que se identificase si era una persona admitida o no.<\/p>\n\n\n\n<p>Despu\u00e9s de darle muchas vueltas a este problema, que, aun cambiando la visi\u00f3n del objetivo a la b\u00fasqueda de \u00abvalidaci\u00f3n\u00bb y no \u00abreconocimiento\u00bb como est\u00e1bamos haciendo, sin conseguir demasiados avances, decidimos intentar reprogramarla por medio de Python, pensando que este m\u00e9todo era compatible con nuestra placa.<\/p>\n\n\n\n<p>Al final, nos dimos cuenta de que hab\u00edamos conseguido implementar el c\u00f3digo necesario, pero no el objetivo, puesto que el reconocimiento facial segu\u00eda sin funcionar. De esta forma, llegamos a la conclusi\u00f3n de que lo mejor ser\u00eda intentarlo de nuevo con una nueva placa ESP32 con una c\u00e1mara OV2640, porque se ajustaba mejor a lo que necesit\u00e1bamos.<\/p>\n\n\n\n<p>Esta fue una soluci\u00f3n viable, pero su conexi\u00f3n a la placa Arduino fue, posteriormente, otra de las cosas que m\u00e1s inconvenientes provocaron. Esto fue debido a que, a falta de un adaptador USB C a pines Arduino, tuvimos que comprar primero un adaptador USB C a entrada USB A, para, posteriormente, conectarlo ya s\u00ed con el m\u00f3dulo USB a UART TTL, el cual fue bastante complicado de encontrar.<\/p>\n\n\n\n<p>Posteriormente, llegaron los problemas de software, en los que nos encontramos problemas como que la c\u00e1mara encend\u00eda pero no funcionaba, o problemas con librer\u00edas que no se detectaban. Esto era debido a que no \u00e9ramos capaces de meter el programa de Python en la placa ESP32 con c\u00e1mara OV2640, pero optamos por subir la imagen que toma a un servidor web de donde el programa Python toma el programa y cumple su funci\u00f3n.<\/p>\n\n\n\n<p>Despu\u00e9s vino el problema de c\u00f3mo conectar la c\u00e1mara con el resto del programa, lo que se solucion\u00f3 f\u00e1cilmente, debido a que la c\u00e1mara ESP32 tiene un microprocesador al cual se le ha a\u00f1adido el programa que abre el servidor Wi-Fi, para que a trav\u00e9s de ese servidor Wi-Fi esta sea capaz de conectarse con nuestro programa en Python, necesitando s\u00f3lo voltaje y tierra. As\u00ed, Python ejecuta todo el programa y si detecta una se\u00f1al determinada, se env\u00eda la cara a la placa Arduino desde el puerto serie, y sino se env\u00eda otra. Cabe destacar que otro importante problema que tuvimos que enfrentar fue el haber empezado este proyecto teniendo nulos conocimientos en este lenguaje de programaci\u00f3n, pero con ayuda de varios c\u00f3digos en webs y ayuda en tutoriales, se consigui\u00f3 implementar el c\u00f3digo necesario.<\/p>\n\n\n\n<p>Por otro lado, el sensor de huella tambi\u00e9n dio alg\u00fan que otro problema. Ya de por s\u00ed, el conector del que este sensor dispon\u00eda no era compatible con los componentes electr\u00f3nicos que ten\u00edamos nosotros (puesto que necesit\u00e1bamos hacer uso de los pines de la placa Arduino, y estaban los seis cables unidos entre s\u00ed para una entrada espec\u00edfica que no ten\u00edamos), por lo que tuvimos que optar por cortar uno de los extremos de los cables y pelarlos uno a uno, para posteriormente soldarlos a nuestros cables hembra. De esta manera, conseguimos conectar el sensor a la placa Arduino exitosamente.<\/p>\n\n\n\n<p>Una vez estaba el sensor conectado, comenzaron los problemas relacionados con la detecci\u00f3n y comparaci\u00f3n de huella, principalmente porque pensamos que no ten\u00eda memoria, lo que hizo que compr\u00e1semos una SD y su lector correspondiente, pero no consegu\u00edamos almacenar ninguna huella. Esto se solucion\u00f3 r\u00e1pidamente, al darnos cuenta de que el sensor realmente s\u00ed dispon\u00eda de memoria, por lo que con ayuda de c\u00f3digos de ejemplo y b\u00fasqueda de informaci\u00f3n que se fue recopilando, se consiguieron las funciones y mensajes correctos para sacar el partido que se quer\u00eda al sensor.<\/p>\n\n\n\n<p>Por \u00faltimo, nos encontramos con el problema de los pines. Nos dimos cuenta de que, al querer usar tantos componentes, nos qued\u00e1bamos sin pines para poder hacerlo, necesitando apa\u00f1arnos con los pines RX y TX para la c\u00e1mara. Sin embargo la soluci\u00f3n fue m\u00e1s sencilla de lo que pens\u00e1bamos, puesto que la c\u00e1mara depend\u00eda de un m\u00f3dulo ESP32 con su propio c\u00f3digo, que lo \u00fanico que necesitaba era transmitir en red y no comunicarse con la Arduino. Es por esto que se decidi\u00f3 no conectar los pines del adaptador TTL con los pines 0 y 1 del Arduino, que adem\u00e1s son reservados para la comunicaci\u00f3n en serie de la placa, y que esta solo dependiera de la conexi\u00f3n. Y funcion\u00f3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Posibles mejoras<\/h2>\n\n\n\n<p>Consideramos que este proyecto podr\u00eda mejorarse en los siguientes aspectos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Incluir el c\u00f3digo en Python en la ESP32 para no depender de un ordenador para la lectura de im\u00e1genes.<\/li>\n\n\n\n<li>Incluir un m\u00f3dulo Wi-Fi o Bluetooth en la placa Arduino para recibir las se\u00f1ales del programa en Python sin necesidad de un cable USB.<\/li>\n\n\n\n<li>A\u00f1adir un LED que indique el estado de la puerta (verde abierto, rojo cerrado, por ejemplo).<\/li>\n\n\n\n<li>Implementar un sonido para notificar que se abre la puerta.<\/li>\n\n\n\n<li>Mejora de los materiales para el exterior.<\/li>\n\n\n\n<li>Mejorar el sistema de cerrojo.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Demostraci\u00f3n<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Demostraci\u00f3n y Casos de uso Proyecto Grupo 18\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/GMGXKiQ_Em4?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Autores<\/h2>\n\n\n\n<p>Este proyecto ha sido realizado por:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adri\u00e1n \u00c1lvarez Alonso<\/li>\n\n\n\n<li>Yamila Calopino Romero<\/li>\n\n\n\n<li>Paula Escuderos Ben\u00edtez<\/li>\n\n\n\n<li>Luc\u00eda Rodr\u00edguez Fern\u00e1ndez<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Caja de seguridad de apertura autom\u00e1tica. Dispone de autenticaci\u00f3n facial, de huella y de c\u00f3digo pin. Permite proteger de una manera mucho m\u00e1s segura lo que se quiera guardar dentro. La madera de contrachapado&#46;&#46;&#46;<\/p>\n","protected":false},"author":260,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9112","post","type-post","status-publish","format-standard","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>Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.<\/title>\n<meta name=\"description\" content=\"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes\" \/>\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\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-20T12:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-20T19:45:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-scaled.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1524\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"dse2425g181\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2425g181\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 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\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/\"},\"author\":{\"name\":\"dse2425g181\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/6a6af677e2888df5e91a47b007a8c9bb\"},\"headline\":\"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin\",\"datePublished\":\"2024-12-20T12:00:00+00:00\",\"dateModified\":\"2024-12-20T19:45:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/\"},\"wordCount\":2368,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/IMG_4916-1024x610.jpeg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/\",\"name\":\"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/IMG_4916-1024x610.jpeg\",\"datePublished\":\"2024-12-20T12:00:00+00:00\",\"dateModified\":\"2024-12-20T19:45:33+00:00\",\"description\":\"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/IMG_4916-scaled.jpeg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/IMG_4916-scaled.jpeg\",\"width\":2560,\"height\":1524},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin\"}]},{\"@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\\\/6a6af677e2888df5e91a47b007a8c9bb\",\"name\":\"dse2425g181\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g\",\"caption\":\"dse2425g181\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2425g181\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.","description":"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes","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\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/","og_locale":"es_ES","og_type":"article","og_title":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.","og_description":"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2024-12-20T12:00:00+00:00","article_modified_time":"2024-12-20T19:45:33+00:00","og_image":[{"width":2560,"height":1524,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-scaled.jpeg","type":"image\/jpeg"}],"author":"dse2425g181","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2425g181","Tiempo de lectura":"22 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/"},"author":{"name":"dse2425g181","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/6a6af677e2888df5e91a47b007a8c9bb"},"headline":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin","datePublished":"2024-12-20T12:00:00+00:00","dateModified":"2024-12-20T19:45:33+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/"},"wordCount":2368,"commentCount":2,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-1024x610.jpeg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/","name":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-1024x610.jpeg","datePublished":"2024-12-20T12:00:00+00:00","dateModified":"2024-12-20T19:45:33+00:00","description":"Caja de seguridad de apertura autom\u00e1tica y cierre manual, con autenticaci\u00f3n facial, sensor de huella, c\u00f3digo pin y pantalla con mensajes","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-scaled.jpeg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_4916-scaled.jpeg","width":2560,"height":1524},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/caja-de-seguridad-con-autenticaciones-biometricas-y-codigo-pin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Caja de seguridad con autenticaciones biom\u00e9tricas y c\u00f3digo pin"}]},{"@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\/6a6af677e2888df5e91a47b007a8c9bb","name":"dse2425g181","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/938fe4bf839c4e2fed4933bdb524931f4fd4cb0f32e17396d46c206a5687b255?s=96&d=mm&r=g","caption":"dse2425g181"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2425g181\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9112","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\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9112"}],"version-history":[{"count":49,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9112\/revisions"}],"predecessor-version":[{"id":9433,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9112\/revisions\/9433"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}