{"id":5535,"date":"2022-05-13T21:40:43","date_gmt":"2022-05-13T19:40:43","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=5535"},"modified":"2022-05-13T21:41:52","modified_gmt":"2022-05-13T19:41:52","slug":"codeck","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/","title":{"rendered":"CoDeck: teclado de macros"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Evoluci\u00f3n<\/h1>\n\n\n\n<p>El proyecto part\u00eda de la idea de construir un teclado de atajos, es decir un peque\u00f1o teclado para el que el usuario puede asignar un atajo de teclado a cada una de las teclas. Por ejemplo, que al pulsar la tecla 1 se ejecutase un Ctrl+C, al pulsar la tecla 2 un Alt+F4, etc.<\/p>\n\n\n\n<p>Inicialmente pensamos en utilizar \u00fanicamente el entorno de Arduino para llevar a cabo el trabajo. Por ello el primer paso fue encontrar un modo de mapear el input de los botones a pulsaciones del teclado del ordenador, de este modo descubrimos la librer\u00eda keyboard.h que emula un teclado mediante Arduino.<\/p>\n\n\n\n<p>Adem\u00e1s del uso de esta librer\u00eda necesit\u00e1bamos un programa externo que funcionase a modo de keylogger y que estuviese siempre atento a las pulsaciones mapeadas por keyboard.h para ejecutar el atajo determinado, esta soluci\u00f3n ya nos a\u00f1ad\u00eda una dependencia constante a un programa externo, algo que no nos convenc\u00eda&nbsp; del todo.<\/p>\n\n\n\n<p>El principal problema vino al comprobar que la librer\u00eda keyboard.h no era compatible con el procesador incluido en el kit provisto por la universidad, ante este obst\u00e1culo decidimos comprar un procesador Arduino Mini que s\u00ed era compatible con la librer\u00eda.<\/p>\n\n\n\n<p>Una vez lleg\u00f3 el procesador Arduino Mini nos pusimos manos a la obra, debido a su reducido tama\u00f1o ten\u00edamos que soldar los pines de los componentes que fueran a ser conectados a \u00e9l. Encontramos muchas dificultades a la hora de unirlo todo y no conseguimos hacer una soldadura funcional, por lo que tambi\u00e9n tuvimos que descartar esta opci\u00f3n.<\/p>\n\n\n\n<p>Llegados a este punto no sab\u00edamos c\u00f3mo continuar el proyecto, hasta que se nos ocurri\u00f3 la idea de escribir las pulsaciones de las teclas en el puerto serial y que un programa externo escrito en Python leyese del puerto.<\/p>\n\n\n\n<p>Conseguimos hacer una conexi\u00f3n funcional y ahora que ten\u00edamos Python a nuestra disposici\u00f3n se nos abri\u00f3 un mundo de posibilidades. Reformulamos el proyecto y dado que Python tiene librer\u00edas para la ejecuci\u00f3n de programas, comandos, navegadores, atajos, etc, decidimos que el proyecto pasar\u00eda a ser un teclado en el que cada tecla pudiese ejecutar un script de Python.<\/p>\n\n\n\n<p>A partir de ah\u00ed hicimos un primer prototipo que al pulsar una tecla del teclado se escribiese el n\u00famero de la tecla en el puerto serial, un c\u00f3digo en Python lo leyera y dependiendo del valor se ejecutase un script u otro.<\/p>\n\n\n\n<p>Para obtener el resultado final a\u00f1adimos al prototipo dos componentes, por un lado una interfaz escrita en Tkinter que es una librer\u00eda de Python para el desarrollo de interfaces gr\u00e1ficas, con ella el usuario podr\u00eda asignar a cada uno de los botones el script que desee que ejecuten, pudiendo escribir la ruta a \u00e9ste de manera manual o a trav\u00e9s de un buscador de archivos. Por otro lado se a\u00f1adi\u00f3 una base de datos SQLite que es una base de datos local para m\u00faltiples lenguajes y compatible con Python, en ella se escribir\u00eda la ruta al script asignada a cada bot\u00f3n y cuando el usuario pulse una tecla se leer\u00eda de ella dicha ruta.<\/p>\n\n\n\n<p>Finalmente con todo esto creamos CoDeck:&nbsp; un teclado que ejecuta scripts acompa\u00f1ado de una interfaz para que el usuario lo mapee como desee&nbsp; y una base de datos para la persistencia de la informaci\u00f3n.&nbsp;<\/p>\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<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Funcionamiento\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Xfc7eXz2C4g?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><\/div>\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Hardware<\/h1>\n\n\n\n<p>En cuanto a la parte de hardware, hay que resaltar principalmente 2 apartados: el circuito y la estructura creada para el proyecto.&nbsp;<\/p>\n\n\n\n<p>Para el circuito se han tenido que soldar todas las conexiones que hab\u00eda que hacer con los switches ya que era imposible que las conexiones se mantuvieran fijas con los cables sin soldarlas.&nbsp;<\/p>\n\n\n\n<p>En cuanto a la estructura, se ha optado por utilizar una impresora 3D para poder dise\u00f1arla con las preferencias que se ten\u00edan para este proyecto, ya que el objetivo era tener una caja con forma ligeramente diagonal y con un tama\u00f1o compacto.&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Materiales utilizados&nbsp;<\/li><\/ol>\n\n\n\n<p>Los materiales empleados para este proyecto son:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Proporcionados por la universidad:&nbsp;<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Elego Uno R3.&nbsp;<\/li><li>Cables hembra-macho.&nbsp;<\/li><li>Materiales de los que ya se dispon\u00eda y no han supuesto coste adicional:&nbsp;<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Soldador.&nbsp;<\/li><li>Esta\u00f1o.&nbsp;<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Flux: pasta que se aplica a los cables soldados para mejorar la conectividad en la soldadura y eliminar posibles \u00f3xidos.&nbsp;<\/li><li>Tubos termorretractiles: tubos que se aplican en la zona soldada y posteriormente se calientan para que se adapten a la forma de la zona, con el objetivo de proteger la soldadura de posibles cortocircuitos con otros cables.&nbsp;<\/li><li>Soporte para soldadura: para sujetar los cables y otras piezas y facilitar el proceso de soldadura.&nbsp;<\/li><li>Peque\u00f1o ventilador para soldar.&nbsp;<\/li><li>Materiales comprados:&nbsp;<\/li><li>20 switches mec\u00e1nicos (blue switch): 10 euros.&nbsp;<\/li><\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>Circuito y soldadura&nbsp;<\/li><\/ol>\n\n\n\n<p>El circuito que se ha utilizado es bastante sencillo ya que, como ya se ha comentado, se han soldado todos los cables, por lo tanto, se ha buscado una forma sencilla de conectar los 12 switches para hacer el proceso de soldadura m\u00e1s simple.&nbsp;<\/p>\n\n\n\n<p>La conexi\u00f3n de cada switch consiste en sacar conectar un pin con una conexi\u00f3n del switch y despu\u00e9s llevar la salida del switch a tierra.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\" alt=\"\" \/><\/figure>\n\n\n\n<p>Sin embargo, el circuito tiene dos peculiaridades. La primera es que el circuito est\u00e1 invertido. Esto significa que en estado de reposo (sin el switch activo) pasa corriente por el circuito. Cuando se activa el switch, el circuito se abre y deja de pasar corriente, por lo tanto, en el c\u00f3digo se tendr\u00e1 que detectar LOWs en vez de HIGHs.&nbsp;<\/p>\n\n\n\n<p>La otra peculiaridad es que no se observan resistencias en el circuito. Eso se debe a que se est\u00e1n utilizando las resistencias internas que tiene cada pin de 20k ohmios. M\u00e1s adelante, en el apartado de c\u00f3digo, veremos c\u00f3mo se activan.&nbsp;<\/p>\n\n\n\n<p>Para la soldadura del circuito se han utilizado los materiales antes mencionados. A continuaci\u00f3n, se muestran algunas fotos del proceso y los materiales:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/xBvOCCtZWWbvo0SWIrw2dGMUkx5-ZiGwrbJqrl6OnAfkO8E9wASl-v3ZPa3c9E1tkOKGrneoR6WTKapso2H6V8Q7zbvLDumzxq6bRCo5bL4VCCfkL8gNgAtwFW-JBwu-9aU3Z694WBgs0i0hFA\" alt=\"\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/ymO62Ce22iUk7_gYL6yeZGXmq_ttLznjoxE6VJSyHZFY-c0cfhPLHt8JaOzOG0rGEyzIfgKDbYhbDqO4RwAd8JrMes-CQAteUv2D5j5ujXukTm-YQOs0XA_NgY75U_Q7X9Me0eSy2Uw83_0c1Q\" alt=\"\" \/><\/figure>\n\n\n\n<p>Y este es el resultado del circuito una vez soldado:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/YxfR95BAAJcfEzUP3nLCqvkPnDsnLS1x7wc5d63OG2z6UqqLc7miFPjZcF0tCJunUL7WvpGTG4uMfMzdP8_Yar0M5SumK8waZYM_Cjg8Zg0s24vxPsYw4ZFB5lOYKwfRt5G1ex_ugKoW6nIlCA\" alt=\"\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\"><li>Estructura&nbsp;<\/li><\/ol>\n\n\n\n<p>Para la estructura se dise\u00f1\u00f3 un modelo 3D de la caja que se quer\u00eda utilizar en nuestro proyecto. Se realiz\u00f3 a trav\u00e9s de Blender y se tom\u00f3 como referencia algunos otros proyectos de Thingiverse. A continuaci\u00f3n de muestran fotos de las estructuras: la caja principal, el frontal y la tapa:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/MKHeJgME0m6vyDYVsZE1gxPEtMQUFewObe5qR5e4nnXko23tzN-hVmeO66nxTBzpQCtWZsf_JpreIe3Mnm6wT5fkjBbLINTC4-GhyVCD3dp32RNm51dBDadV61Qys528jmG5N3B_DaLIgZodUg\" alt=\"\" width=\"385\" height=\"398\" \/><figcaption>Caja principal<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/TOiAUJhVv5qM7c7oiwC_BWSxFTzVih53cImo2wzBfp6NLLTkWJFa5KcCIVZHmH0Pqhz3qasmH0Cq5VJEpkbUKJu3RV9BmcI7v__BIsapHvctSIazd8bMYH_khEDcUGz0jRB0e3QznGYRYSNHDQ\" alt=\"\" width=\"389\" height=\"403\" \/><figcaption>Frontal<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/jWBwnqghaaijpOpa5aDQ2dcqCREuqJzhchWH8UqoLM2PRTWDFaC2u2kufs-B2qaiOaPOvdyuHfXsXy4TvuLGxjptPRlGUvMrYp0AA583_kZcsb5GirDjzOcDD8seCcxckgE69TqRE28rw-ODgw\" alt=\"\" width=\"372\" height=\"386\" \/><figcaption>Tapa<\/figcaption><\/figure>\n\n\n\n<p>Y a continuaci\u00f3n el proyecto terminado:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/g2otN1_lP5X1c4wDcJIVN-CPAl0HvIhGRBLuWE4p70VJcrl5s0w7mJdMDio4qI7icksH6UJl4_0f5vMsvU79Gj-25yuQU3jyZcb3716RCyG-Vp0xM3Xel8GAK1090jN1IpITMpirxgxx08cClA\" alt=\"\" \/><\/figure>\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<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Hardware\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/QSaHPwtjr7k?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><\/div>\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">C\u00f3digo<\/h1>\n\n\n\n<p>Todo el c\u00f3digo referente al proyecto puede visualizarse desde el siguiente repositorio de c\u00f3digo<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/jj-tena\/Practica-Sistemas-Empotrados\"> https:\/\/github.com\/jj-tena\/Practica-Sistemas-Empotrados<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Estructura del proyecto<\/strong><\/h2>\n\n\n\n<p>La estructura del proyecto a nivel de c\u00f3digo puede dividirse en 2 grandes bloques, denominados Sender y Receiver.&nbsp;<\/p>\n\n\n\n<p>El bloque Sender es el encargado de enviar las pulsaciones recibidas al Receiver, mientras que el Receiver es el encargado de recibirlas y&nbsp; actuar en consecuencia.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/oX9CAERCR99QfxQICDov0cNhKlFbO9BWg5Z5-UZAzHoK1CylGfQlIM7eeUwvK13GF5LP3ttkxCe_W_-KccWBOqKWjeACJa4f3mb0USvzNi4Tqg90HdaWrRvQVi1eqMUe4D96CVDPFGPFsnls6A\" alt=\"\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Arduino<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sender<\/strong><\/h3>\n\n\n\n<p>La funci\u00f3n del Sender es mandar un c\u00f3digo espec\u00edfico hacia el Receiver mediante el puerto Serial. El puerto Serial sirve para comunicar dispositivos digitales.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/dDseFj0tCx0SdnAZlFotECJ7gMzZZSHHVPvDPEg-u8mSY3MZKVfb6r99NJDa_6Ha87Q4a2ACWBs02GHIMt2z0lUDQj5Pt3411KK0XqHC49f7flRMbfMp295H38qvoKu3BEg1Sa6CkUDR7Knf1g\" alt=\"\" \/><\/figure>\n\n\n\n<p>Para ello los pines correspondientes se configuran como entradas, activando las resistencias internas para as\u00ed simplificar la circuiter\u00eda. A su vez, cada pin tiene asociado un c\u00f3digo, que es el que ser\u00e1 mandado hacia el Receiver en caso de que uno de los switches se active.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Python<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Receiver<\/strong><\/h3>\n\n\n\n<p>El Receiver es el encargado de leer los c\u00f3digos mandados por el Receiver en referencia a cada bot\u00f3n desde el puerto Serial, para as\u00ed ejecutar los Scripts asignados a dichos botones.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/8SpF4E7eNajoehItMTLjXMnbI_klV7t5H1zRkBeQaGkLBtW2oh5gsuZrmK54gEynwPLaedBceN8Bg-yPdTZqkdoHPdLAVv82zIoXPbJgal1LfnTUVWsXbpaAV3sFXR2pI5fDDccpxmGtNDFB8w\" alt=\"\" \/><\/figure>\n\n\n\n<p>Para ello se configura la lectura en el puerto, quedando el Receiver esperando a que una c\u00f3digo de operaci\u00f3n sea recibido.<\/p>\n\n\n\n<p>Una vez que el c\u00f3digo es identificado y casteado correctamente, se obtiene el path de la base de datos al script correspondiente y \u00e9ste ejecuta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Interface<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/qTC-BxkVg8kPF4TyrigBeusLlqqgCx8ZGLn9qMJ4fx4QMwDwOoZleEd0SvC5f6Fn1GDSyEEUr5fVTAEc62fGrsfehBWx1XSe7AIBH4nYy4FsaujtHVavjtDtJm5Vu_jk2Ols5ZQFegsWuJiLjA\" alt=\"\" \/><\/figure>\n\n\n\n<p>El c\u00f3digo referente a la interfaz se ha realizado utilizando la librer\u00eda Tkinter de Python, la cual es la librer\u00eda est\u00e1ndar para la creaci\u00f3n de interfaces.&nbsp; Cada m\u00e9todo se encarga de crear un componente espec\u00edfico de la interfaz, creando alguno de ellos componentes compuestos, para al final construir la interfaz completa en el <strong><em>main<\/em><\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Database<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/vROTEJt43T7vnSJNMWgIFaYf6s43Lgdg_4OwbkUgPcNEsqSM0J30guZ3OMx4VKSmwaOVLqvtgGqxTi7UWCKv7ogbqNSU-Id1yJMfkrHU4vllOv073jJWAx5uvLrXwC_LEMN6Nmu-1n0WaO5Zig\" alt=\"\" \/><\/figure>\n\n\n\n<p>El archivo encargado de realizar operaciones CRUD con la base de datos, est\u00e1 compuesto por los m\u00e9todos necesarios para poder operar con ella.<\/p>\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<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Software\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/biIteA__xX0?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><\/div>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Evoluci\u00f3n El proyecto part\u00eda de la idea de construir un teclado de atajos, es decir un peque\u00f1o teclado para el que el usuario puede asignar un atajo de teclado a cada una de las&#46;&#46;&#46;<\/p>\n","protected":false},"author":30,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5535","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>CoDeck: teclado de macros - Proyectos con Arduino.<\/title>\n<meta name=\"description\" content=\"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.\" \/>\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\/codeck\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CoDeck: teclado de macros - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-13T19:40:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-05-13T19:41:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 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\\\/codeck\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"CoDeck: teclado de macros\",\"datePublished\":\"2022-05-13T19:40:43+00:00\",\"dateModified\":\"2022-05-13T19:41:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/\"},\"wordCount\":1459,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lh4.googleusercontent.com\\\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/\",\"name\":\"CoDeck: teclado de macros - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lh4.googleusercontent.com\\\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\",\"datePublished\":\"2022-05-13T19:40:43+00:00\",\"dateModified\":\"2022-05-13T19:41:52+00:00\",\"description\":\"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#primaryimage\",\"url\":\"https:\\\/\\\/lh4.googleusercontent.com\\\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\",\"contentUrl\":\"https:\\\/\\\/lh4.googleusercontent.com\\\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/codeck\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CoDeck: teclado de macros\"}]},{\"@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\":\"\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CoDeck: teclado de macros - Proyectos con Arduino.","description":"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.","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\/codeck\/","og_locale":"es_ES","og_type":"article","og_title":"CoDeck: teclado de macros - Proyectos con Arduino.","og_description":"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2022-05-13T19:40:43+00:00","article_modified_time":"2022-05-13T19:41:52+00:00","og_image":[{"url":"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/"},"author":{"name":"","@id":""},"headline":"CoDeck: teclado de macros","datePublished":"2022-05-13T19:40:43+00:00","dateModified":"2022-05-13T19:41:52+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/"},"wordCount":1459,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#primaryimage"},"thumbnailUrl":"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/","name":"CoDeck: teclado de macros - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#primaryimage"},"thumbnailUrl":"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA","datePublished":"2022-05-13T19:40:43+00:00","dateModified":"2022-05-13T19:41:52+00:00","description":"Teclado de macros desarrollado con Arduino y Python con el que podemos ejecutar cualquier tipo de script. Te mostramos el funcionamiento, hardware y c\u00f3digo utilizado.","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#primaryimage","url":"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA","contentUrl":"https:\/\/lh4.googleusercontent.com\/5HP1maxZn-SQec7tElGHLax2-5ryjqb4nZ9BmaNpdV14Igi2Hem5X5uvQl3I6GGPfMUqybPxgkcDKrYqxMRTMYyE__XujZujKuDWk67ECfjyui14SsrhZ8-fLzH-0cfuaaHLEM2RcxSdbcubxA"},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/codeck\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"CoDeck: teclado de macros"}]},{"@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":"","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5535","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\/30"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=5535"}],"version-history":[{"count":3,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5535\/revisions"}],"predecessor-version":[{"id":5733,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5535\/revisions\/5733"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=5535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=5535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=5535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}