commit b2f1c19cfcd5ab47ac690d3c49d63b5c38a2e752 parent 58e60d6eb8ae7acb7626dd5ac220e90eb912a39f Author: fjbalon <fbalon@templier.es> Date: Mon, 8 Jun 2026 23:05:38 +0200 Reestructuración de entrada de construcción de teclado mecánico y creación de entrada de ab-1043 Diffstat:
43 files changed, 301 insertions(+), 101 deletions(-)
diff --git a/ab-1043-linux/7bbf8de17e7fb8a62cf10dfc13bbfb95781d2491.png b/ab-1043-linux/7bbf8de17e7fb8a62cf10dfc13bbfb95781d2491.png Binary files differ. diff --git a/ab-1043-linux/c3dbd229b287af6db1b02cf53a15d27ae7db7b97.png b/ab-1043-linux/c3dbd229b287af6db1b02cf53a15d27ae7db7b97.png Binary files differ. diff --git a/ab-1043-linux/index.html b/ab-1043-linux/index.html @@ -0,0 +1,241 @@ +<!DOCTYPE html> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> +<title>La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux</title> +<link rel="icon" type="image/png" href="/favicon.png" /> +<link rel="stylesheet" type="text/css" href="../article.css" /> +</head> +<body> +<header> +<p class="title">La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux</p> +<p class="date">2 de abril de 2026 • fjbalon</p> +</header> +<p>En el día de ayer, se ha visto publicado en el Linux Kernel Mail List un <a href="https://lkml.org/lkml/2026/4/1/1284">correo</a> que detalla un parche muy llamativo: <emb>[PATCH] vfs: require verified birth date for file creation</emb>.</p> +<img src="c3dbd229b287af6db1b02cf53a15d27ae7db7b97.png" /> +<p>En él, Brauner detalla que, por la nueva regulación, todo el contenido digital, incluido las operaciones de creación de archivos deben ser realizadas por adultos verificados, ¡la creación de archivos!. Ya que la creación de archivos es la más primitiva y fundamental forma de creación de contenido en un sistema operativo, por lo que va regulado por la VFS.</p> +<p>El parche introduce <emb>CONFIG_VFS_AGE_VERIFICATION</emb> que, cuando está habilitado, requiere que todos los procesos registren una fecha de nacimiento válida a través de <emb>prctl(PR_SET_BIRTHDATE)</emb> antes de que se le permita crear archivos. La fecha de nacimiento se almacena en <emb>struct task_struct</emb> y se hereda a través de <emb>fork()</emb>.</p> +<p>La creación del archivo fallará con el nuevo código de error <emb>ETOOYOUNG</emb> si:</p> +<p>a. No se ha registrado fecha de nacimiento.</p> +<p>b. La fecha de nacimiento registrada indica que el usuario es menor de 18 años.</p> +<p>Se ha añadido el nuevo <emb>errno</emb>, <emb>ETOOYOUNG (134)</emb>. De esta forma el espacio de usuario o la propia distribución pueda manejar el error mostrando un mensaje tranquilizador. El autor sugiere «se requiere un padre o tutor legal que cree el archivo en su nombre».</p> +<p>Aquí está todo el código del <emb>diff</emb> para quien le interese:</p> + +<pre><code>@@ -42,6 +42,23 @@ source "fs/crypto/Kconfig" + source "fs/verity/Kconfig" + source "fs/notify/Kconfig" + ++config VFS_AGE_VERIFICATION ++ bool "Require birth date verification for file creation" ++ default y ++ help ++ When enabled, every process must register a valid birth date via ++ prctl(PR_SET_BIRTHDATE, day, month, year) before being allowed to ++ create files. Processes that have not registered a birth date or ++ whose registered birth date indicates they are under 18 years of ++ age will receive -ETOOYOUNG on any file creation attempt. ++ ++ If unsure, say Y. Failure to comply may result in stern letters ++ from lawyers. You don't want that. Trust us. Say Y. ++ + source "fs/quota/Kconfig" + + source "fs/autofs/Kconfig" +diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h +index 1..2 100644 +--- a/include/uapi/asm-generic/errno.h ++++ b/include/uapi/asm-generic/errno.h +@@ -20,4 +20,6 @@ + + #define EHWPOISON 133 /* Memory page has hardware error */ + ++#define ETOOYOUNG 134 /* Process too young to create content */ ++ + #endif +diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h +index 3..4 100644 +--- a/include/uapi/linux/prctl.h ++++ b/include/uapi/linux/prctl.h +@@ -328,4 +328,8 @@ + + #define PR_LOCK_INDIR_BR_LP_STATUS 82 + ++/* age verification for file creation */ ++#define PR_SET_BIRTHDATE 83 ++#define PR_GET_BIRTHDATE 84 ++ + #endif /* _LINUX_PRCTL_H */ +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 5..6 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1215,6 +1215,14 @@ struct task_struct { + #endif + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; ++ ++#ifdef CONFIG_VFS_AGE_VERIFICATION ++ /* compliance - birth date for age verification */ ++ u8 birthdate_day; ++ u8 birthdate_month; ++ u16 birthdate_year; ++ bool birthdate_verified; ++#endif + + /* Thread group tracking: */ + u64 parent_exec_id; +diff --git a/kernel/sys.c b/kernel/sys.c +index 7..8 100644 +--- a/kernel/sys.c ++++ b/kernel/sys.c +@@ -2345,6 +2345,48 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, + break; ++ ++#ifdef CONFIG_VFS_AGE_VERIFICATION ++ case PR_SET_BIRTHDATE: ++ { ++ u8 day = (u8)arg2; ++ u8 month = (u8)arg3; ++ u16 year = (u16)arg4; ++ struct tm now; ++ int age; ++ ++ /* Basic date validation */ ++ if (month < 1 || month > 12) ++ return -EINVAL; ++ if (day < 1 || day > 31) ++ return -EINVAL; ++ if (year < 1900) ++ return -EINVAL; ++ ++ time64_to_tm(ktime_get_real_seconds(), 0, &now); ++ ++ /* The kernel does not support vampires or immortal entities */ ++ if ((now.tm_year + 1900) - year > 150) ++ return -EINVAL; ++ ++ /* No time travelers either */ ++ if (year > (now.tm_year + 1900)) ++ return -EINVAL; ++ ++ me->birthdate_day = day; ++ me->birthdate_month = month; ++ me->birthdate_year = year; ++ me->birthdate_verified = true; ++ ++ age = (now.tm_year + 1900) - year; ++ if (now.tm_mon + 1 < month || ++ (now.tm_mon + 1 == month && now.tm_mday < day)) ++ age--; ++ ++ if (age < 18) ++ pr_info_ratelimited("Process %d (comm: %s) registered as minor (age %d). " ++ "File creation will be denied. Please ask a " ++ "parent or guardian for assistance.\n", ++ task_pid_nr(me), me->comm, age); ++ break; ++ } ++ case PR_GET_BIRTHDATE: ++ if (!me->birthdate_verified) ++ return -EINVAL; ++ if (put_user(me->birthdate_day, (u8 __user *)arg2) || ++ put_user(me->birthdate_month, (u8 __user *)arg3) || ++ put_user(me->birthdate_year, (u16 __user *)arg4)) ++ return -EFAULT; ++ break; ++#endif /* CONFIG_VFS_AGE_VERIFICATION */ ++ + default: + error = -EINVAL; + break; +diff --git a/fs/namei.c b/fs/namei.c +index 9..10 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -4148,6 +4148,45 @@ static int vfs_mknodat(struct mnt_idmap *idmap, struct dentry *dentry, + umode_t mode, dev_t dev); + ++#ifdef CONFIG_VFS_AGE_VERIFICATION ++/** ++ * check_age_verification - verify the calling process has registered a valid ++ * birth date and is old enough to create files. ++ * ++ * Returns 0 if the caller is verified as an adult (>= 18 years old). ++ * Returns -ETOOYOUNG if the caller is a minor or has not registered a ++ * birth date. ++ * ++ * This function exists because the fundamental UNIX ++ * principle of "everything is a file" was insufficiently regulated. ++ */ ++static int check_age_verification(void) ++{ ++ struct task_struct *tsk = current; ++ struct tm now; ++ int age; ++ ++ if (!tsk->birthdate_verified) { ++ pr_warn_ratelimited( ++ "Process %d (comm: %s) attempted to create a file " ++ "without age verification. Set birth date via " ++ "prctl(PR_SET_BIRTHDATE, day, month, year).\n", ++ task_pid_nr(tsk), tsk->comm); ++ return -ETOOYOUNG; ++ } ++ ++ time64_to_tm(ktime_get_real_seconds(), 0, &now); ++ ++ age = (now.tm_year + 1900) - tsk->birthdate_year; ++ if (now.tm_mon + 1 < tsk->birthdate_month || ++ (now.tm_mon + 1 == tsk->birthdate_month && ++ now.tm_mday < tsk->birthdate_day)) ++ age--; ++ ++ if (age < 18) { ++ pr_warn_ratelimited( ++ "Process %d (comm: %s) is only %d years old. " ++ "Must be 18 or older to create files. " ++ "Ask a parent or guardian for help.\n", ++ task_pid_nr(tsk), tsk->comm, age); ++ return -ETOOYOUNG; ++ } ++ ++ return 0; ++} ++#endif /* CONFIG_VFS_AGE_VERIFICATION */ ++ + /** + * vfs_create - create new file + * @idmap: idmap of the mount the inode was found from +@@ -4170,6 +4209,12 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode, + if (error) + return error; + ++#ifdef CONFIG_VFS_AGE_VERIFICATION ++ error = check_age_verification(); ++ if (error) ++ return error; ++#endif ++ + if (!dir->i_op->create) + return -EACCES; /* shouldn't it be ENOSYS? */ + +-- +2.49.0</code></pre> +<p>Entre las partes más interesantes, a mi parecer, son que con este parche, el Kernel de Linux no soportará deliberadamente el uso de vampiros ni entidades inmortales, estableciendo un condicional que si, la fecha es superior a 150 años en el pasado, devuelve error.</p> +<pre><code>/* The kernel does not support vampires or immortal entities */ +if ((now.tm_year + 1900) - year > 150) + return -EINVAL;</code></pre> +<p>Tampoco soportará viajeros en el tiempo, que tengan establecida una fecha de futuro.</p> +<pre><code>/* No time travelers either */ +if (year > (now.tm_year + 1900)) + return -EINVAL;</code></pre> +<p>Si has llegado hasta aquí ya habrás notado que ayer fue 1 de abril, fecha en el que muchos países anglosajones celebran un día de inocentadas y bromas. Hasta el mismo Linus Torvalds ha <a href="https://lkml.org/lkml/2026/4/1/1730">respondido</a> al mail:</p> +<img src="7bbf8de17e7fb8a62cf10dfc13bbfb95781d2491.png" /> +<p>Para quien no tenga ningun contexto, esto obedece a la <i>ley AB 1043 (Digital Age Assurance Act)</i> de California, que pretende obligar a los sistemas operativos a verificar la edad de los usuarios con multas absurdas por incumplimiento.</p> +<p>Tanto puede poner en apuros a algunas pequeñas y grandes distribuciones, que algunas como MidnightBSD ha tomado la bizarra decisión de bloquear geográficamente las descargas de su distribución a usuarios de California mientras buscan una “alternativa”, como la creción de un comandos <emb>aged</emb> y <emb>agectl</emb> que llame a una variable edad.</p> +<p>Como era de esperar, esto evidentemente no es propio de California y Silicon Valley, es un proyecto de todas las élites de Occidente, desde Estados Unidos, Gran Bretaña y la Unión Europea. Con la excusa lamentable de proteger a los niños en la red... Sí, las élites diciendo defender a los niños...</p> +<p>Evidentemente la propia estructura y esencia, tanto a nivel de sistema operativo como a nivel de distribución y descentralización hace que los entornos GNU/Linux y Unix Like sean una fortaleza, en cierta medida, de este tipo de políticas; al menos en cuanto al Cosmos: pequeñas distros sí podrían verse gravemente afectadas por el asedio legal positivista.</p> +<p>Esto es algo que, evidentemente, me tranquiliza. ¿Cómo evitarían que en mi copia de una distribución de GNU/Linux quite, antes o después de compilarla, los elementos de control de edad? Además, el propio enfoque de la ley es absolutamente desconocedor del mundo industrial informático, reduciéndolo a usuarios domésticos y ordinarios. ¿Qué pasa con los servidores? ¿qué edad debería tener un servidor dedicado? ¿la del administrador? ¿la del jefe de la empresa? ¿y los sistemas embebidos autónomos? No tiene ningún sentido.</p> +</body> +</html> +\ No newline at end of file diff --git a/index.html b/index.html @@ -23,6 +23,11 @@ <p class="info">5 de junio de 2026 · fjbalon</p><p>En un artículo algo extraño para lo que lo que suelo escribir, enfocado en el sistema de Microsoft Windows. Tranquilícese el lector, incluso encuadrando el artículo a través del sistema operativo...</p> </a> +<a href="./ab-1043-linux/" class="article"> + <p class="title">La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux</p> + <p class="info">2 de abril de 2026 · fjbalon</p><p>En el día de ayer, se ha visto publicado en el Linux Kernel Mail List un correo que detalla un parche muy llamativo: [PATCH] vfs: require verified birth date for file creation....</p> +</a> + <a href="./cister-software-libre/" class="article"> <p class="title">Los Registros monásticos del Císter como precursores del software libre</p> <p class="info">27 de marzo de 2026 · fjbalon</p><p>Hay un hecho histórico llamativo, relacionado con la fundación de la Orden Cisterciense (1098) en Cîteaux, Francia: la orden monástica fue fundada por Roberto de Molesmes, y fue una reacción a la...</p> @@ -199,8 +204,8 @@ </a> <a href="./mechanic-keyboard/" class="article"> - <p class="title">Proyecto de montaje, soldadura y programación de firmware de teclado mecánico ortolineal y dividido</p> - <p class="info">17 de junio de 2021 · fjbalon</p><p>El proyecto consiste, como bien indica el título, en el montaje, soldadura y programación de un teclado mecánico dividido (un componente para cada mano), compacto y ortolineal....</p> + <p class="title">Montaje de teclado mecánico ortolineal y dividido</p> + <p class="info">17 de junio de 2021 · fjbalon</p><p>Dentro de mis intereses en informática y computación, un elemento que siempre me ha atraído mucho es el conocido «make it yourself»; el tener el máximo control posible, incluso sobre los perifé...</p> </a> <a href="./flujo-texto/" class="article"> @@ -268,9 +273,9 @@ <p class="info">27 de febrero de 2020 · fjbalon</p><p>El caso que hoy me ocupa, nace de la necesidad de apagar la memoria de intercambio (o swap) en mi equipo portátil para poder gestionar varias pruebas sobre clústers de kubernetes. Algo curioso, pues...</p> </a> -<a href="./the-rider/" class="article"> - <p class="title">The Rider (2017) de Chloé Zhao, «Dios nos da a cada uno un propósito, el del caballo es correr por la pradera; el del vaquero es montar»</p> - <p class="info">26 de enero de 2020 · fjbalon</p><p>Sacrificio proviene de sacrum facere; es decir, hacer lo sagrado, entregarse, honrarlo. Por el uso y la costumbre -en este caso no tan positiva-, la vinculamos hoy día con dolor y pérdida, sin ser...</p> +<a href="./ciberguerra/" class="article"> + <p class="title">Apuntes sobre la naturaleza geopolítica del ciberespacio y de la ciberguerra</p> + <p class="info">30 de noviembre de 2019 · fjbalon</p><p>El mundo se organiza estratégicamente en un sistema geopolítico, en el que -actualmente- sólo las potencias tecnológicas tienen cabida. La geopolítica es el estudio de las interacciones de poder ...</p> </a> <a href="./kernel-compression/" class="article"> diff --git a/mechanic-keyboard/imagen1.jpeg b/mechanic-keyboard/imagen1.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen10.jpeg b/mechanic-keyboard/imagen10.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen11.jpeg b/mechanic-keyboard/imagen11.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen12.jpeg b/mechanic-keyboard/imagen12.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen2.jpeg b/mechanic-keyboard/imagen2.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen3.jpeg b/mechanic-keyboard/imagen3.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen4.jpeg b/mechanic-keyboard/imagen4.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen5.jpeg b/mechanic-keyboard/imagen5.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen6.jpeg b/mechanic-keyboard/imagen6.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen7.jpeg b/mechanic-keyboard/imagen7.jpeg Binary files differ. diff --git a/mechanic-keyboard/imagen8.png b/mechanic-keyboard/imagen8.png Binary files differ. diff --git a/mechanic-keyboard/imagen9.jpeg b/mechanic-keyboard/imagen9.jpeg Binary files differ. diff --git a/mechanic-keyboard/index.html b/mechanic-keyboard/index.html @@ -3,113 +3,66 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> -<title>Ortholinear mechanical keyboard</title> +<title>Montaje de teclado mecánico ortolineal y dividido</title> <link rel="icon" type="image/png" href="/favicon.png" /> <link rel="stylesheet" type="text/css" href="../article.css" /> </head> <body> <header> -<p class="title">Proyecto de montaje, soldadura y programación de firmware de teclado mecánico ortolineal y dividido</p> +<p class="title">Montaje de teclado mecánico ortolineal y dividido</p> <p class="date">17 de junio de 2021 • fjbalon</p> </header> -<p>El proyecto consiste, como bien indica el título, en el montaje, soldadura y programación de un <a href="https://www.xataka.com/basics/teclado-mecanico-que-ventajas-principales-diferencias">teclado mecánico</a> dividido (un componente para cada mano), compacto y <a href="https://hardzone.es/reportajes/que-es/teclado-ortolineal/">ortolineal</a>.</p> -<p>Para ello el primer paso consiste en hacerse con una placa de circuito impreso (aka PCB), que es sencillamente el soporte físico de los componentes electrónicos y eléctricos, interconectándolos entre sí empleando una serie de pistas conductoras de cobre extremadamente finas, generando así un carril conductor. El modelo utilizado de PCB será <a href="https://github.com/MakotoKurauchi/helix">Helix</a>, de Makoto Kurauchi. Concretamente en este artículo empleamos de dos modelos de PCBs distintas: una de ellas swapable (los switches pueden quitar y ponerse sin necesidad de soldar) y la otra con los switches directamente a soldar en placa.</p> -<p>Acabo de mencionar los switches, que son cada uno de los interruptores sobre los cuales se colocan las teclas. Su mecanismo hace efectiva cada pulsación, enviando señal eléctrica correspondiente al circuito integrado de la PCB. Estos elementos tienen un impacto profundo en la experiencia de escritura que proporciona el teclado al usuario, y son prácticamente la razón por la que muchos usuarios prefieren los teclados mecánicos. Determinan en gran manera el sonido que produce cada pulsación, la profundidad de pulsación o el tipo de pulsación.</p> -<h2>Componentes base</h2> -<p>Evidentemente y como en prácticamente cualquier proyecto que requiera electrónica, los componentes a obtener son varios y variados. Primeramente, será necesario por supuesto contar con las PCBs, que como ya adelanté usaré <a href="https://www.littlekeyboards.com/collections/helix-pcb-kits/products/helix-hotswap-pcb-kit">Helix Hotswap PCB Kit</a> y x2 <a href="https://www.littlekeyboards.com/collections/helix-pcb-kits/products/helix-pcb-kit">Helix PCB Kit</a>.</p> -<p>Aunque vienen en los kits, serán necesarios también un <a href="https://stackskb.com/store/pj-320a-jack/">conector TTRS Jack</a> por cada PCB, que se soldará en cada una y que comunicará cada mano a través de un <a href="https://42keebs.eu/shop/parts/plain-braided-metal-trrs-cable/">cable TRRS, además de un <a>reset switch</a> por cada una.</a></p> -<p>Necesitaremos 64 diodos, que son un componente electrónico de dos terminales que permite la circulación de la corriente eléctrica a través de él en un solo sentido, bloqueando el paso si la corriente circula en sentido contrario, no solo sirve para la circulación de corriente eléctrica sino que este la controla y resiste.</p> -<img class="color-invertible" style="width: 10%; margin-top: 2%; margin-bottom: 2%;" src="resources/diodo00.png" /> -<p>Y en el caso de la PCB hotswapable, requeriremos por supuesto 64 <a>Kailh MX Hotswap Socket</a>. A parte, serán necesarios 64 switches, que en mi caso he usado y probado las <a href="https://www.cherrymx.de/en/cherry-mx/mx-original/mx-blue.html">Cherry MX Blue</a> y las <a href="https://www.littlekeyboards.com/collections/keyboard-switches/products/kailh-choc-low-profile-switches?variant=31008074924099">Kailh Choc Low Profile Switches White</a>, para la PCB hotswapable y para soldar directamente a PCB, respectivamente.</p> -<p>Como cerebros de cada teclado dividido, cada PCB contará con un microcontrolador. He usado y probado dos modelos:</p> +<p>Dentro de mis intereses en informática y computación, un elemento que siempre me ha atraído mucho es el conocido «make it yourself»; el tener el máximo control posible, incluso sobre los periféricos que utilizo. Además de ser un motivo estético y de aprendizaje soberanamente interesante para mí.</p> +<p>Uno de estos elementos es el teclado mecánico. Hace ya un tiempo compré, en <a href="https://www.littlekeyboards.com/">Little Keyboards</a>, dos PCB para hacer un teclado mecánico, ortolineal y dividido (un teclado para cada mano). Usé, de hecho, la PCB <a href="https://github.com/MakotoKurauchi/helix">Helix</a>, diseñada por Makoto Kurauchi. Estéticamente, preciosa:</p> +<img src="imagen1.jpeg" /> +<h2>Componentes</h2> +<p>Entonces, me hice con los componentes necesarios: PCBs, conectores TTRS Jack, cable TTRS, reset switches, diodos, Cherry MX Blue, Kailh Choc Low Profile Switches -en blanco-… Más exactamente:</p> <ul> -<li>El microcontrolador <a href="https://www.littlekeyboards.com/collections/mcus/products/elite-c-v3">MCU Elite-Cv4</a> fue diseñada como una alternativa a las MCU Pro Micro que se usan más comúnmente en teclados personalizados. El Elite-C cuenta con un cargador de arranque DFU y un conector USB Tipo C. Los controladores Elite-C v4 tienen un grosor de 1,6mm. Los controladores B-Stock tienen un grosor de 2,0mm. No hay diferencia de funcionalidad entre los dos tipos de variantes Elite-C. La única diferencia es el grosor de la PCB. No olvide que al flashear, será necesario usar dfu en lugar de avrdude.</li> - - <img style="width: 60%; margin-top: 2%; margin-bottom: 2%;" src="resources/material02.jpg" /> - -<li>El microcontrolador es un <a href="https://customkbd.com/products/sea-micro-pro-micro-alternative">sea-micro</a>, que cuenta con conector USB Tipo C y botón reset incorporado.</li> +<li>Helix Hotswap PCB (2)</li> +<li>TTRS Jack (2)</li> +<li>Reset switch (2)</li> +<li>Diodo (64)</li> +<li>Kailh MX Hotswap Socket (64)</li> +<li>Pro Microcontroller (2)</li> +<li>Clear Helix Case</li> +<li>Cherry MX Blue (64)</li> +<li>Keycaps (64)</li> +<li>Cable TRRS</li> +<li>Cable USB-C a USB2.0</li> +<li>Oled Screen (2)</li> </ul> -<p>Y para complementar, necesitaremos un cable USB-C a USB2.0, que comunicará el teclado con el PC. Como opcional, se puede añadir una <a href="https://www.littlekeyboards.com/collections/oled-screens/products/oled-screen">OLED Screen</a> a cada microcontrolador para mostrar información. Será de 128x32 con conector de 4 pines.</p> -<h2>Componentes de carrocería</h2> -<p>Por llamarlos de esta forma, corresponde a los elementos necesarios para montar el teclado, fuera de los elementos electrónicos detallados anteriormente.</p> -<p>El primero de ellos es la carcasa o case, la cual se corresponde a <a href="https://www.littlekeyboards.com/collections/helix-cases/products/helix-technician-five-row-keyboard-case?variant=12417577517103">Helix Technician Five Row Keyboard Case</a>, que consiste en una carcasa en base de polimetilmetacrilato [poli(metil 2-metilpropenoato) ó PMMA]. Compite en cuanto a aplicaciones con otros plásticos como el policarbonato (PC) o el poliestireno (PS), pero el acrílico se destaca frente a otros plásticos transparentes en cuanto a resistencia a la intemperie, transparencia y resistencia al rayado. Las métricas son:</p> - <img class="color-invertible" style="width: 60%;" src="resources/acrylic03.png" /> -<p>Cuenta con unas propiedades magníficas para el efecto y uso deseado en nuestro teclado:</p> -<ul> -<li>Transparencia de alrededor del 93%. El más transparente de los plásticos.</li> -<li>Alta resistencia al impacto, de unas diez a veinte veces la del vidrio.</li> -<li>Resistente a la intemperie y a los rayos ultravioleta. No hay un envejecimiento apreciable en diez años de exposición exterior.</li> -<li>Excelente aislante térmico y acústico.</li> -<li>Ligero en comparación con el vidrio (aproximadamente la mitad), con una densidad de unos 1190 kg/m³ es sólo un poco más denso que el agua.</li> -<li>Dureza similar al vidrio y fácil pulido usando pasta de pulir.</li> -</ul> -<p>Que la hacen una carcasa perfectamente útil para nuestro caso.</p> -<p>Por otro lado, requeriremos de 64 keycaps, que son las teclas al uso que se colocan sobre los switches.</p> -<h2>Equipamiento necesario</h2> -<ul> -<li>Estación de Soldadura 80W de estaño (80-480ºC)</li> -<li>Alambre de estaño para soldaduras</li> -<li>Pasta de soldar</li> -<li>Isopropanol (Alcohol Isopropílico)</li> -<li>Polímetro digital</li> -</ul> -<img src="resources/equipament.jpg" /> -<h2>Soldadura de microcontrolador y controles</h2> -<p>Los primeros elementos a soldar se harán mediante el siguiente orden:</p> -<ul> -<li>TTRS Jack y Reset switch</li> - <img src="resources/soldering00.jpg" /> - <img src="resources/soldering01.jpg" /> -<li>Conector de Oled Screen y puentes</li> -<li>Conectores de microncontrolador y microcontrolador</li> - <img src="resources/soldering02.jpg" /> - <img src="resources/soldering03.jpg" /> - <img src="resources/soldering04.jpg" /> -<li>Oled Screen</li> - <img src="resources/soldering041.jpg" /> -</ul> -<p>Posteriormente y ya que tenemos soldada la Oled Screen y flasheamos el firmware (si no lo hemos hecho previamente), si conectamos el USB-C a un PC -y todo ha ido bien- obtenemos output de datos en pantalla.</p> -<h2>Flash de firmware en microcontrolador</h2> -<img src="resources/flash00.jpg" /><img src="resources/flash01.jpg" /> +<p>Las herramientas que utilicé para su montaje fueron una estación de soldadura de 80W de estaño (40-480ºC), Isopropanol o alcohol isopropílico y un polímetro digital.</p> +<p>Y, como “cerebros”, los microcontroladores <a href="https://www.littlekeyboards.com/collections/mcus/products/elite-c-v3">MCU Elite-Cv4</a>. Éstos fueron diseñados como alternativa al más conocido MCU Pro Micro, pero añadiéndole cargador de arranque DFU y conector USB Tipo C. Además, le añado a cada uno una <a href="https://www.littlekeyboards.com/collections/oled-screens/products/oled-screen">pantalla OLED 128x32</a>.</p> +<img style="width: 60%;" src="imagen2.jpeg" /> +<p>Una alternativa muy buena, por si a alguien le interesara, es el <a href="https://customkbd.com/products/sea-micro-pro-micro-alternative">sea-micro</a>, que cuenta con conector USB Tipo C y botón reset incorporado.</p> +<h2>Soldadura de componentes principales de control</h2> +<p>Algunas fotos del proceso de soldadura:</p> +<img style="width: 60%;" src="imagen3.jpeg" /> +<img style="width: 60%;" src="imagen4.jpeg" /> +<h2>Flash de firmware en el microcontrolador</h2> +<p>Después, un proceso muy divertido y entretenido es el flashing de firmware en el microcontrolador.</p> +<p>Para ello, debemos conectar mediante USB el microcontrolador. Se encenderá el led que indica que recibe corriente.</p> +<img style="width: 60%;" src="imagen5.jpeg" /> +<p>La herramienta que yo utilicé es QMK, basado en Python, y que trae un código por defecto para la placa Helix.</p> +<pre><code>python3 -m pip install --user qmk +export PATH=$PATH:/home/ssh/.local/bin +qmk setup +cd qmk_firmware +make helix/rev3_5rows:default:clean +make helix/rev3_5rows:default:dfu +qmk compile -kb helix/rev3_5rows -km default</code></pre> +<img src="imagen6.jpeg" /> <p>Una ventaja añadida del sea-micro es que cuenta con botón reset integrado. Esto nos permite flashear el firmware sin necesidad de puente hardware o estar soldado ya en PCB de teclado.</p> - -<pre><code>$ python3 -m pip install --user qmk -$ export PATH=$PATH:/home/balon/.local/bin -$ qmk setup -$ cd qmk_firmware -$ make helix/rev3_5rows:default:clean -$ make helix/rev3_5rows:default:dfu -$ qmk compile -kb helix/rev3_5rows -km default</code></pre> -<img src="resources/soldering05.jpg" /> +<img style="width: 60%;" src="imagen7.jpeg" /> <h2>Soldadura de diodos</h2> -<img src="resources/soldering06.jpg" /> +<p>Necesitaremos 64 diodos, uno por cada tecla. Son un componente electrónico de dos terminales que permite la circulación de la corriente eléctrica a través de él en un solo sentido, bloqueando el paso si la corriente circula en sentido contrario, no solo sirve para la circulación de corriente eléctrica sino que este la controla y resiste.</p> +<img style="width: 10%;" src="imagen8.png" /> +<img style="width: 60%;" src="imagen9.jpeg" /> <h2>Soldadura de hotswaps</h2> -<img src="resources/soldering07.jpg" /> -<h2>Comprobación de tecla hotswapable pulsada con xev</h2> - <img src="resources/soldering08.jpg" /> - -<pre><code>$ xev - -KeyRelease event, serial 32, synthetic NO, window 0x3200001, - root 0x597, subw 0x0, time 3258717, (603,685), root:(604,705), - state 0x44, keycode 37 (keysym 0xffe3, Control_L), same_screen YES, - XLookupString gives 0 bytes: - XFilterEvent returns: False - -KeyPress event, serial 32, synthetic NO, window 0x3200001, - root 0x597, subw 0x0, time 3259183, (603,685), root:(604,705), - state 0x40, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES, - XLookupString gives 0 bytes: - XmbLookupString gives 0 bytes: - XFilterEvent returns: False</code></pre> -<h2>Gestión de problemas encontrados</h2> -<ul> -<li>En placa negra, la tecla correspondiente al número 2 no funciona</li> -<p>Usando el polímetro, descubro las comunicaciones internas de la PCB para hacer un puente usando un cable, soldándolo y obteniendo de nuevo funcionalidad en la tecla.</p> - - <img src="resources/black-puente.jpg" /> -</ul> - - +<img style="width: 60%;" src="imagen10.jpeg" /> +<img src="imagen11.jpeg" /> +<p>Aquí una foto del estado final después de ensamblar todo. Les cambié los switches por unos de otro tipo, de forma que quedaran más bajas y ocupasen menos espacio de altura.</p> +<p>Desgraciadamente, en una mudanza se me rompieron dos teclas. Estoy pendiente de sustituirlas.</p> +<img src="imagen12.jpeg" /> </body> </html> \ No newline at end of file diff --git a/mechanic-keyboard/resources/acrylic00.jpg b/mechanic-keyboard/resources/acrylic00.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/acrylic01.jpg b/mechanic-keyboard/resources/acrylic01.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/acrylic02.jpg b/mechanic-keyboard/resources/acrylic02.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/acrylic03-dark.png b/mechanic-keyboard/resources/acrylic03-dark.png Binary files differ. diff --git a/mechanic-keyboard/resources/acrylic03.png b/mechanic-keyboard/resources/acrylic03.png Binary files differ. diff --git a/mechanic-keyboard/resources/black-puente.jpg b/mechanic-keyboard/resources/black-puente.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/diodo00-dark.png b/mechanic-keyboard/resources/diodo00-dark.png Binary files differ. diff --git a/mechanic-keyboard/resources/diodo00.png b/mechanic-keyboard/resources/diodo00.png Binary files differ. diff --git a/mechanic-keyboard/resources/equipament.jpg b/mechanic-keyboard/resources/equipament.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/flash00.jpg b/mechanic-keyboard/resources/flash00.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/flash01.jpg b/mechanic-keyboard/resources/flash01.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/material00.jpg b/mechanic-keyboard/resources/material00.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/material01.jpg b/mechanic-keyboard/resources/material01.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/material02.jpg b/mechanic-keyboard/resources/material02.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/polymethylmethacrylat-dark.png b/mechanic-keyboard/resources/polymethylmethacrylat-dark.png Binary files differ. diff --git a/mechanic-keyboard/resources/polymethylmethacrylat.png b/mechanic-keyboard/resources/polymethylmethacrylat.png Binary files differ. diff --git a/mechanic-keyboard/resources/soldering00.jpg b/mechanic-keyboard/resources/soldering00.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering01.jpg b/mechanic-keyboard/resources/soldering01.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering02.jpg b/mechanic-keyboard/resources/soldering02.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering03.jpg b/mechanic-keyboard/resources/soldering03.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering04.jpg b/mechanic-keyboard/resources/soldering04.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering041.jpg b/mechanic-keyboard/resources/soldering041.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering05.jpg b/mechanic-keyboard/resources/soldering05.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering06.jpg b/mechanic-keyboard/resources/soldering06.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering07.jpg b/mechanic-keyboard/resources/soldering07.jpg Binary files differ. diff --git a/mechanic-keyboard/resources/soldering08.jpg b/mechanic-keyboard/resources/soldering08.jpg Binary files differ.