{"id":7723,"date":"2022-10-15T11:26:09","date_gmt":"2022-10-15T09:26:09","guid":{"rendered":"https:\/\/www.commander1024.de\/wordpress\/?p=7723"},"modified":"2024-03-05T22:08:59","modified_gmt":"2024-03-05T21:08:59","slug":"diy-reparatur-einer-defekten-tastatur","status":"publish","type":"post","link":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/","title":{"rendered":"DIY-Reparatur einer defekten Tastatur"},"content":{"rendered":"\n <p> Meine hei\u00dfgeliebte &#8222;daskeyboard 4 Root&#8220; Tastatur habe ich mir 2018 gekauft. Das war das erste mal, dass ich bewusst Geld in das St\u00fcck Peripherie gesteckt habe, das ich nahezu den ganzen Tag an den Fingern habe. Und den Kauf habe ich bis zum heutigen Tag nicht bereut. Und sie zeigt auch noch lange keine Erm\u00fcdungserscheinungen &#8211; von etwas glatt polierten Keycaps abgesehen. Aber die w\u00e4ren ja sogar auch noch austauschbar. <\/p> \n\n\n\n <p> Wie es nun kommen musste, habe ich im Februar dieses Jahr irgendein klebriges Getr\u00e4nk \u00fcber der Tastatur versch\u00fcttet. \u00c4rgerlich und viel Arbeit aber keine Katastrophe &#8211; alle Teile der Tastatur sollten wartbar und zu reinigen sein. Eine oberfl\u00e4chliche Reinigung der ausgebauten Faceplate und der Switches hat nat\u00fcrlich nicht gereicht, da das Zeug in die Schalter eingedrungen ist. Faul wie ich bin, dachte ich mir, dass ich die Schalter identifiziere, die &#8222;kleben&#8220; und diese ausl\u00f6te und gezielt reinige.  <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"864\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-1920x864.jpg\" alt=\"Oberfl\u00e4chliche Reinigung eher so meh...\" class=\"wp-image-7709\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-1920x864.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-800x360.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-300x135.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-768x346.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-1536x691.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/02-shallow-cleaned-2048x922.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Oberfl\u00e4chliche Reinigung eher so meh&#8230;<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Katastrophaler GND-Short?<\/h2>\n\n\n\n <p> Die Idee war grunds\u00e4tzlich ganz gut. Leider war es nicht ganz so schlau, die zerlegte Tastatur mit Strom zu versorgen, w\u00e4hrend sie wackelig <em>auf<\/em> einem Stapel anderer Projekte liegt&#8230; Was genau nun in der Folge passiert ist, habe ich nicht zweifelsfrei herausfinden k\u00f6nnen. Am wahrscheinlichsten habe ich das grounded case mit etwas kurzgeschlossen, was Microcontroller und mind. ein anderes Bauteil nicht so witzig fanden. Gemerkt habe ich es auch tats\u00e4chlich erst, als ich aufsteigenden magischen Rauch gesehen habe. Nat\u00fcrlich war es da schon zu sp\u00e4t, auch wenn ich schnell alles abgeschaltet habe. <\/p> \n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"359\" data-id=\"7712\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-800x359.jpg\" alt=\"Vorderseite des besch\u00e4digten Controllers\" class=\"wp-image-7712\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-800x359.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-1920x863.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-300x135.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-768x345.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-1536x690.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-front-2048x920.jpg 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Vorderseite des besch\u00e4digten Controllers<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"359\" data-id=\"7711\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-800x359.jpg\" alt=\"R\u00fcckseite des besch\u00e4digten Controllers\" class=\"wp-image-7711\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-800x359.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-1920x863.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-300x135.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-768x345.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-1536x690.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-dead-control-board-back-2048x920.jpg 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">R\u00fcckseite des besch\u00e4digten Controllers<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" data-id=\"7710\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-800x450.jpg\" alt=\"Durch Kurzschluss ausgebrannte Komponenten\" class=\"wp-image-7710\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/03-burned-components-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Durch Kurzschluss ausgebrannte Komponenten<\/figcaption><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\"><a href=\"https:\/\/de.wikipedia.org\/wiki\/Michael_Manousakis\">Michael Manousakis<\/a>: &#8222;Katastrophe!&#8220;<\/figcaption><\/figure>\n\n\n\n <p> Die Rauchentwicklung kam von der MCU, die so hei\u00df wurde, dass der Papiersticker, der darauf klebte, angesengt ist. An der Eingangseite ist ebenfalls etwas sehr hei\u00df geworden. Langer Rede kurzer Sinn. Etwa 8 Tasten sowie der Mute Taster funktionierten nach diesem Fauxpas noch. Der USB-Hub war auch noch ok, meckerte aber zeitweise \u00fcber &#8222;infinite loops&#8220; in der Ger\u00e4te-Baumstruktur. Man kann also sagen, dass das Board Schrott ist. Resigniert hab ich dann zusammen mit meiner Tochter alle Taster ausgel\u00f6tet und alles gr\u00fcndlich gereinigt. Ich habe dazu die Schalter in warmem Sp\u00fclwasser gereinigt und anschlie\u00dfend gr\u00fcndlich mehrfach gesp\u00fclt. Die Keycaps ebenso. Beim Sp\u00fclen kam mir das gro\u00dfe Nudelsieb sehr gelegen. <\/p> \n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1439\" data-id=\"7713\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-scaled.jpg\" alt=\"Frisch gereinigte Keycaps\" class=\"wp-image-7713\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-scaled.jpg 2560w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/04-cleaned-keyboard-caps-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><figcaption class=\"wp-element-caption\">Frisch gereinigte Keycaps<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1582\" height=\"1200\" data-id=\"7714\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-1582x1200.jpg\" alt=\"Gr\u00fcndlich gereinigte Tastatur in Einzelteilen\" class=\"wp-image-7714\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-1582x1200.jpg 1582w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-791x600.jpg 791w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-300x228.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-768x582.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-1536x1165.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/05-thoroughly-cleaned-keyboard-parts-e1709672878754-2048x1553.jpg 2048w\" sizes=\"auto, (max-width: 1582px) 100vw, 1582px\" \/><\/a><figcaption class=\"wp-element-caption\">Gr\u00fcndlich gereinigte Tastatur in Einzelteilen<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Plan B: PCB reverse engineeren und custom Firmware entwickeln<\/h2>\n\n\n\n <p> Normalerweise werden Tastaturen in einer Matrix, in Zeilen und Spalten verkabelt. Allerdings nicht so wie es einfach zu verstehen w\u00e4re, sondern so wie vermutlich der Auto-Router jemandes PCB-Designers es entschieden hat. Also musste ich jedes Pad, an dem zuvor das Flexkabel des originales Controllers hing nachverfolgen, um herauszufinden ob es eines Spalte (mit Diode) oder eine Reihe ist und welche Tasten daran angeschlossen sind. <\/p> \n\n\n\n <p> Hierzu habe ich das PCB beidseitig auf dem Flachbettscanner in hoher Aufl\u00f6sung gescannt. Tats\u00e4chlich passt es nicht einmal vollst\u00e4ndig darauf, so dass ich anschlie\u00dfend 2&#215;2 Teilbilder zusammenf\u00fcgen musste. Ich habe dann die Vorderseite an der vertikalen Achse gespiegelt und mit 50% Farbaddition transparent \u00fcber die PCB R\u00fcckseite gelegt und jeden Trace auf einer neuen Ebene in gimp nachverfolgt. Vermutlich w\u00e4re es an diesem Punkt geschickter gewesen, das ganze in KiCad oder so zu machen, aber gimp hatte ich zur Hand und kann ich einigerma\u00dfen bedienen. <\/p> \n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"558\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-1920x558.jpg\" alt=\"PCB-R\u00fcckseite mit eingef\u00e4rbten Leiterbahnen\" class=\"wp-image-7704\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-1920x558.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-800x232.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-300x87.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-768x223.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-1536x446.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_traces-2048x595.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">PCB-R\u00fcckseite mit eingef\u00e4rbten Leiterbahnen<\/figcaption><\/figure>\n\n\n\n <p> Anschlie\u00dfend hab ich noch ein sch\u00f6nes deutsches ISO keyboard schema gesucht, aber nur das f\u00fcr <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:ISO_keyboard_(105)_QWERTY_UK.svg\" target=\"_blank\" rel=\"noreferrer noopener\">UK<\/a> gefunden. Also kurzerhand Inkscape rausgekramt und eines erstellt. Dieses hab ich auch gleich wieder auf <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:ISO_keyboard_(105)_QWERTZ_DE.svg\" target=\"_blank\" rel=\"noreferrer noopener\">wikimedia<\/a> der Allgemeinheit zur Verf\u00fcgung gestellt. So bewaffnet hab ich mich nun an die Matrix-Zuordnung gemacht. <\/p> \n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"558\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-1920x558.jpg\" alt=\"gespiegelte PCB-R\u00fcckseite mit eingef\u00e4rbten Leiterbahnen und ISO Tastatur Overlay\" class=\"wp-image-7705\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-1920x558.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-800x232.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-300x87.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-768x223.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-1536x446.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/pcb_montage_wip_mirrored-2048x595.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">gespiegelte PCB-R\u00fcckseite mit eingef\u00e4rbten Leiterbahnen und ISO Tastatur Overlay<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Auswahl einer freien Keyboard-Firmware<\/h2>\n\n\n\n <p> Eine schnelle Recherche hat da so einige Projekte zutage gef\u00fchrt. In der engeren Auswahl standen <a rel=\"noreferrer noopener\" href=\"https:\/\/qmk.fm\/\" target=\"_blank\">QMK<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/kmkfw.io\/\" target=\"_blank\">KMK<\/a> und <a href=\"https:\/\/zmk.dev\/\">ZMK<\/a>. KMK scheint dabei ein MicroPython Projekt zu sein und ZMK zielt eher auf gr\u00f6\u00dfere 32bit Mikrocontroller. Da ich keine Erfahrung mit irgendeinem dieser Projekte habe, hab ich ein bisschen nach <a rel=\"noreferrer noopener\" href=\"http:\/\/Dokumentationsstand\" target=\"_blank\">Dokumentationsstand<\/a>, Repoaktivit\u00e4t und einer Portion Bauchgef\u00fchl entschieden. So ist es nun QMK geworden. Den kann man bequem via pip installieren, und bekommt so ein cli tool, mit dem sich Tasks wie das compilieren \/ flashen oder das Erstellen einer Tastatur \/ Keymap ansto\u00dfen lassen. Parallel klont man das qmk-firmware repository und konfiguriert den Pfad in qmk.  <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-built_in\">cd<\/span> Repos\npip3 install --user qmk\ngit <span class=\"hljs-built_in\">clone<\/span> git@github.com:qmk\/qmk_firmware.git\nqmk setup -H ~\/Repos\/qmk_firmware<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n <p> Genauere Details kann man der <a href=\"https:\/\/docs.qmk.fm\/#\/newbs_getting_started\" target=\"_blank\" rel=\"noreferrer noopener\">Schnellstartanleitung<\/a> des Projekts entnehmen. <\/p> \n\n\n\n<h2 class=\"wp-block-heading\">Eine neue blanko Tastaturdefinition erstellen<\/h2>\n\n\n\n <p> Jetzt kann man eine leere Tastatur generieren lassen, als Parameter \u00fcbergebe ich f\u00fcr welchen Microcontroller sie genutzt werden soll. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">qmk <span class=\"hljs-keyword\">new<\/span>-keyboard -kb handwired\/daskeyboard\/daskeyboard4 -t STM32F411<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n <p> Anschlie\u00dfend werden interaktiv noch Sachen wie eigener Name, github username, sowie das default Layout abgefragt, wo ich fullsize_iso gew\u00e4hlt habe. Das erzeugt nun eine Verzeichnisstruktur, die alle wesentlichen Teile einer Tastaturdefinition enth\u00e4lt. Diese folgt auch schon dem scheinbar vor gar nicht allzu langer Zeit eingef\u00fchrten Ansatz, des data-driven Developments. Dem folgend, sollten so viele Informationen wie m\u00f6glich, \u00fcber die info.json gesetzt werden. Aus dieser wird dann dynamisch der Code generiert und kompiliert. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">.\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">config<\/span><span class=\"hljs-selector-class\">.h<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">info<\/span><span class=\"hljs-selector-class\">.json<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">keymaps<\/span>\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 <span class=\"hljs-selector-tag\">default<\/span>\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 <span class=\"hljs-selector-tag\">keymap<\/span><span class=\"hljs-selector-class\">.c<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">readme<\/span><span class=\"hljs-selector-class\">.md<\/span>\n\u2514\u2500\u2500 <span class=\"hljs-selector-tag\">rules<\/span><span class=\"hljs-selector-class\">.mk<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Zeilen \/ Spalten der Tastatur ermitteln und Pins der Blackpill zuordnen<\/h3>\n\n\n\n<p class=\"has-background\" style=\"background-color:#c2480c42\">Bei den Pins des Controllers muss man ein paar Dinge beachten, einige darf man nicht, andere sollte man nicht benutzen. Details finden sich in der <a href=\"https:\/\/docs.qmk.fm\/#\/platformdev_blackpill_f411\" target=\"_blank\" rel=\"noreferrer noopener\">Dokumentation<\/a>. <\/p> \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\"><pre class=\"wp-block-code has-small-font-size\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## physical<\/span>\nPCB properties                      STM32F411\n<span class=\"hljs-number\">1<\/span>   column, diode, <span class=\"hljs-number\">4<\/span> switches       C14\n<span class=\"hljs-number\">2<\/span>   row, no diode, <span class=\"hljs-number\">13<\/span> switches      A13\n<span class=\"hljs-number\">3<\/span>   row, no diode, <span class=\"hljs-number\">15<\/span> switches      A14\n<span class=\"hljs-number\">4<\/span>   column, diode, <span class=\"hljs-number\">3<\/span> switches       C15\n<span class=\"hljs-number\">5<\/span>   column, diode, <span class=\"hljs-number\">8<\/span> switches       A0\n<span class=\"hljs-number\">6<\/span>   row, no diode, <span class=\"hljs-number\">14<\/span> switches      A1\n<span class=\"hljs-number\">7<\/span>   column, diode, <span class=\"hljs-number\">7<\/span> switches       A2\n<span class=\"hljs-number\">8<\/span>   row, no diode, <span class=\"hljs-number\">13<\/span> switches      A3\n<span class=\"hljs-number\">9<\/span>   column, diode, <span class=\"hljs-number\">7<\/span> switches       A4\n<span class=\"hljs-number\">10<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       A5\n<span class=\"hljs-number\">11<\/span>  column, diode, <span class=\"hljs-number\">8<\/span> switches       A6\n<span class=\"hljs-number\">12<\/span>  column, diode, <span class=\"hljs-number\">8<\/span> switches       A7\n<span class=\"hljs-number\">13<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       B0\n<span class=\"hljs-number\">14<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       B1\n<span class=\"hljs-number\">15<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       B10\n<span class=\"hljs-number\">16<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       B9\n<span class=\"hljs-number\">17<\/span>  row, no diode, <span class=\"hljs-number\">12<\/span> switches      B8\n<span class=\"hljs-number\">18<\/span>  column, diode, <span class=\"hljs-number\">2<\/span> switches       B7\n<span class=\"hljs-number\">19<\/span>  column, diode, <span class=\"hljs-number\">2<\/span> switches       B6\n<span class=\"hljs-number\">20<\/span>  column, diode, <span class=\"hljs-number\">6<\/span> switches       B5\n<span class=\"hljs-number\">21<\/span>  column, diode, <span class=\"hljs-number\">6<\/span> switches       B4\n<span class=\"hljs-number\">22<\/span>  row, no diode, <span class=\"hljs-number\">12<\/span> switches      B3\n<span class=\"hljs-number\">23<\/span>  row, no diode, <span class=\"hljs-number\">10<\/span> switches      A15\n<span class=\"hljs-number\">24<\/span>  row, no diode, <span class=\"hljs-number\">15<\/span> switches      B15\n<span class=\"hljs-number\">25<\/span>  NC\n<span class=\"hljs-number\">26<\/span>  column, diode, <span class=\"hljs-number\">7<\/span> switches       A8<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><pre class=\"wp-block-code has-small-font-size\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## logical<\/span>\nTyp         pin-name    matrix  PCB\nrows:       <span class=\"hljs-string\">\"A13\"<\/span>,     <span class=\"hljs-number\">0<\/span>       <span class=\"hljs-number\">2<\/span>\n            <span class=\"hljs-string\">\"A14\"<\/span>,     <span class=\"hljs-number\">1<\/span>       <span class=\"hljs-number\">3<\/span>\n            <span class=\"hljs-string\">\"A1\"<\/span>,      <span class=\"hljs-number\">2<\/span>       <span class=\"hljs-number\">6<\/span>\n            <span class=\"hljs-string\">\"A3\"<\/span>,      <span class=\"hljs-number\">3<\/span>       <span class=\"hljs-number\">8<\/span>\n            <span class=\"hljs-string\">\"B8\"<\/span>,      <span class=\"hljs-number\">4<\/span>       <span class=\"hljs-number\">17<\/span>\n            <span class=\"hljs-string\">\"B3\"<\/span>,      <span class=\"hljs-number\">5<\/span>       <span class=\"hljs-number\">22<\/span>\n            <span class=\"hljs-string\">\"A15\"<\/span>,     <span class=\"hljs-number\">6<\/span>       <span class=\"hljs-number\">23<\/span>\n            <span class=\"hljs-string\">\"B15\"<\/span>      <span class=\"hljs-number\">7<\/span>       <span class=\"hljs-number\">24<\/span>\ncolumns:    <span class=\"hljs-string\">\"C14\"<\/span>,     <span class=\"hljs-number\">0<\/span>       <span class=\"hljs-number\">1<\/span>\n            <span class=\"hljs-string\">\"C15\"<\/span>,     <span class=\"hljs-number\">1<\/span>       <span class=\"hljs-number\">4<\/span>\n            <span class=\"hljs-string\">\"A0\"<\/span>,      <span class=\"hljs-number\">2<\/span>       <span class=\"hljs-number\">5<\/span>\n            <span class=\"hljs-string\">\"A2\"<\/span>,      <span class=\"hljs-number\">3<\/span>       <span class=\"hljs-number\">7<\/span>\n            <span class=\"hljs-string\">\"A4\"<\/span>,      <span class=\"hljs-number\">4<\/span>       <span class=\"hljs-number\">9<\/span>\n            <span class=\"hljs-string\">\"A5\"<\/span>,      <span class=\"hljs-number\">5<\/span>       <span class=\"hljs-number\">10<\/span>\n            <span class=\"hljs-string\">\"A6\"<\/span>,      <span class=\"hljs-number\">6<\/span>       <span class=\"hljs-number\">11<\/span>\n            <span class=\"hljs-string\">\"A7\"<\/span>,      <span class=\"hljs-number\">7<\/span>       <span class=\"hljs-number\">12<\/span>\n            <span class=\"hljs-string\">\"B0\"<\/span>,      <span class=\"hljs-number\">8<\/span>       <span class=\"hljs-number\">13<\/span>\n            <span class=\"hljs-string\">\"B1\"<\/span>,      <span class=\"hljs-number\">9<\/span>       <span class=\"hljs-number\">14<\/span>\n            <span class=\"hljs-string\">\"B10\"<\/span>,     <span class=\"hljs-number\">10<\/span>      <span class=\"hljs-number\">15<\/span>\n            <span class=\"hljs-string\">\"B9\"<\/span>,      <span class=\"hljs-number\">11<\/span>      <span class=\"hljs-number\">16<\/span>\n            <span class=\"hljs-string\">\"B7\"<\/span>,      <span class=\"hljs-number\">12<\/span>      <span class=\"hljs-number\">18<\/span>\n            <span class=\"hljs-string\">\"B6\"<\/span>,      <span class=\"hljs-number\">13<\/span>      <span class=\"hljs-number\">19<\/span>\n            <span class=\"hljs-string\">\"B5\"<\/span>,      <span class=\"hljs-number\">14<\/span>      <span class=\"hljs-number\">20<\/span>\n            <span class=\"hljs-string\">\"B4\"<\/span>,      <span class=\"hljs-number\">15<\/span>      <span class=\"hljs-number\">21<\/span>\n            <span class=\"hljs-string\">\"A8\"<\/span>       <span class=\"hljs-number\">16<\/span>      <span class=\"hljs-number\">26<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n<\/div>\n\n\n\n <p> Folglich habe ich die rows\/cols wie folgt definiert. Die Reihenfolge, in der die Pins aufgef\u00fchrt werden spiegelt damit den Matrix-Code wieder, beginnend bei &#8222;0&#8220;. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">    <span class=\"hljs-string\">\"matrix_pins\"<\/span>: {\n        <span class=\"hljs-attr\">\"cols\"<\/span>: &#91;<span class=\"hljs-string\">\"C14\"<\/span>, <span class=\"hljs-string\">\"C15\"<\/span>, <span class=\"hljs-string\">\"A0\"<\/span>, <span class=\"hljs-string\">\"A2\"<\/span>, <span class=\"hljs-string\">\"A4\"<\/span>, <span class=\"hljs-string\">\"A5\"<\/span>, <span class=\"hljs-string\">\"A6\"<\/span>, <span class=\"hljs-string\">\"A7\"<\/span>, <span class=\"hljs-string\">\"B0\"<\/span>, <span class=\"hljs-string\">\"B1\"<\/span>, <span class=\"hljs-string\">\"B10\"<\/span>, <span class=\"hljs-string\">\"B9\"<\/span>, <span class=\"hljs-string\">\"B7\"<\/span>, <span class=\"hljs-string\">\"B6\"<\/span>, <span class=\"hljs-string\">\"B5\"<\/span>, <span class=\"hljs-string\">\"B4\"<\/span>, <span class=\"hljs-string\">\"A8\"<\/span>],\n        <span class=\"hljs-attr\">\"rows\"<\/span>: &#91;<span class=\"hljs-string\">\"A13\"<\/span>, <span class=\"hljs-string\">\"A14\"<\/span>, <span class=\"hljs-string\">\"A1\"<\/span>, <span class=\"hljs-string\">\"A3\"<\/span>, <span class=\"hljs-string\">\"B8\"<\/span>, <span class=\"hljs-string\">\"B3\"<\/span>, <span class=\"hljs-string\">\"A15\"<\/span>, <span class=\"hljs-string\">\"B15\"<\/span>]\n    },<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Matrix Tastaturcodes tastenweise ermitteln<\/h3>\n\n\n\n <p> Der nun folgende Schritt war derjenige, der am l\u00e4ngsten gedauert hat und maximale Konzentration erfordert hat. Daher hab ich das auch \u00fcber 2 Abende verteilt gemacht. Ich hatte wirklich keine Lust, in der Zeile zu verrutschen und alles nochmal kontrollieren zu m\u00fcssen. In der Layout-Definition tauchen folgende Datenfelder auf: <\/p> \n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8222;label&#8220; ist einfach eine Freitextbeschriftung (hier analog zur Tastenbeschriftung).<\/li>\n\n\n\n<li>&#8222;matrix&#8220; ist ein Array und erwartet [&lt;row&gt;, &lt;column&gt;], dies lese ich von meiner h\u00fcbschen PCB-Montage ab. Leitungen mit Diode sind demnach columns, welche ohne rows. Die Zahl f\u00e4ngt bei 0 an und z\u00e4hlt aufw\u00e4rts in der Reihenfolge, wie sie in den &#8222;matrix_pins&#8220; angegeben wurde.<\/li>\n\n\n\n<li>&#8222;x&#8220; und &#8222;y&#8220; beschreiben die physikalische Position der Taste<\/li>\n\n\n\n<li>die optionalen Parameter &#8222;w&#8220; und &#8222;h&#8220; geben die Breite und die H\u00f6he an<\/li>\n<\/ul>\n\n\n\n <p> Zum Gl\u00fcck musste ich mich nicht um das physische Layout k\u00fcmmern, da qmk hat es schon durch Auswahl von &#8222;fullsize_iso&#8220; korrekt vorausgef\u00fcllt hat. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>    <span class=\"hljs-string\">\"layouts\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"LAYOUT_fullsize_iso\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"layout\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Esc\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F1\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F2\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F3\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F4\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F5\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">6.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F6\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">7.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F7\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">8.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F8\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">9.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F9\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F10\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F11\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">13<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F12\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">14<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Prt Sc\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">15.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Scr Lk\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">16.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Pause\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">1<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">17.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">0<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"`\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"1\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"2\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"3\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"4\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"5\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"6\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">6<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"7\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"8\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"9\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">9<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"0\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"-\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"=\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Backspace\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">13<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Ins\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">15.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Home\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">16.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Page Up\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">17.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Num Lk\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">18.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"\/\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">19.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"*\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">20.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"-\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">21.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">1.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Tab\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.5<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Q\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">1.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"W\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"E\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"R\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">4.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"T\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">5.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Y\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">6.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"U\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">7.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"I\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">8.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"O\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">9.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"P\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">10.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"&#91;\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"]\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Del\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">15.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"End\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">16.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Page Down\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">17.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"7\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">18.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"8\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">19.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"9\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">20.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"+\"<\/span>, <span class=\"hljs-attr\">\"h\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">21.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Caps Lock\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.75<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"A\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">1.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"S\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"D\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"F\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">4.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"G\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">5.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"H\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">6.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"J\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">7.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"K\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">8.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"L\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">9.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\";\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">10.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"'\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"#\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Return\"<\/span>, <span class=\"hljs-attr\">\"h\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">2<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">13.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">2.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"4\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">18.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"5\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">19.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"6\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">20.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">3.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Shift L\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">13<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"\\\\\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Z\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">16<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"X\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">4<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"C\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">4.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"V\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">5.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"B\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">6<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">6.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"N\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">7.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"M\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">7<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">8.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\",\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">8<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">9.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\".\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">10.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"\/\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">9<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Shift R\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">13<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">2.75<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Up\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">16.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"1\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">18.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"2\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">19.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"3\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">20.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Enter\"<\/span>, <span class=\"hljs-attr\">\"h\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">21.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">4.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Control L\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">1<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Super L\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">12<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Alt L\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">0<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">2.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\" \"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">6.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">3.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Alt R\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">0<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Super R\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">12<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">11.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Menu\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">3<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">12.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Control R\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">1<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">13.75<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Left\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">15<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">15.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Down\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">10<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">16.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Right\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">17.25<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"0\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">11<\/span>], <span class=\"hljs-attr\">\"w\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">18.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> },\n<\/span><\/span><span class='shcb-loc'><span>                { <span class=\"hljs-attr\">\"label\"<\/span>:<span class=\"hljs-string\">\"Del\"<\/span>, <span class=\"hljs-attr\">\"matrix\"<\/span>: &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">14<\/span>], <span class=\"hljs-attr\">\"x\"<\/span>: <span class=\"hljs-number\">20.5<\/span>, <span class=\"hljs-attr\">\"y\"<\/span>: <span class=\"hljs-number\">5.25<\/span> }\n<\/span><\/span><span class='shcb-loc'><span>            ]\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Firmware compilieren und testen<\/h2>\n\n\n\n <p> Zuerst muss allerding noch der <a href=\"https:\/\/github.com\/adafruit\/tinyuf2\" target=\"_blank\" rel=\"noreferrer noopener\">tinyuf2 Bootloader<\/a> aus den Quellen kompiliert und auf die Blackpill geflasht werden. Dieser hat ein paar handfeste Vorteile gegen\u00fcber der DFU Variante, wie z. B. \u00dcberschreibschutz, die Pr\u00e4sentation des Flash-Speichers als Massenspeicher und Autoflash von uf2 Files, die man dort ablegt. <\/p> \n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">make BOARD=stm32f411ce_blackpill all\nmake BOARD=stm32f411ce_blackpill flash<\/code><\/span><\/pre>\n\n\n <p> Mit diesen gewonnen Erkenntnissen und der daraus entstandenen Konfiguration sollte sich eine Firmware kompilieren und flashen lassen. Tat sie auch. Nur funktionierte es nicht. Sobald meine Firmware drauf war, meldete sich das Ger\u00e4t vom USB-Bus ab und war fortan komplett still am Bus &#8211; bis ich ihn wieder resetet und in den Bootloader-Modus gezwungen habe. Stellt sich heraus, ich muss neben dem Prozessor auch noch die Blackpill als Board definiert werden. Denn das Board hat einen 25MHz Oszillator verbaut &#8211; anstelle den \u00fcblichen 8MHz. Erst danach versteht der Computer das Ger\u00e4t am USB-Bus. <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-1920x1080.jpg\" alt=\"Blackpill sendet erste Keycodes mit QMK Firmware\" class=\"wp-image-7716\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/07-first-key-codes-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Blackpill sendet erste Keycodes mit QMK Firmware. (Eine row und column mit Jumper-Kabel gebr\u00fcckt)<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">PCB und Blackpill verkabeln<\/h2>\n\n\n\n <p> Ich habe meinen Kopf zwei Tage lang gegen die Wand gehauen, um einen Weg zu finden, die Blackpill <em>zus\u00e4tzlich<\/em> zu dem original PCB in die Tastatur reinzuquetschen. Das w\u00e4re allein aus optischen Gr\u00fcnden w\u00fcnschenswert, damit die Mediakeys und der Drehencoder nicht leere L\u00f6cher bleiben, durch die man reingucken kann. Aber leider habe ich keinen zufriedenstellenden gefunden. Es l\u00e4uft daher auf weitergehende Zerst\u00f6rung hinaus &#8211; aber dazu sp\u00e4ter mehr. Denn insgeheim m\u00f6chte ich auf Mediakeys und Lautst\u00e4rkeregler nicht verzichten. <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-1920x1080.jpg\" alt=\"Tastatur-PCB mit der Blackpill verkabelt\" class=\"wp-image-7717\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/08-PCB-wired-up-to-Blackpill-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Tastatur-PCB mit der Blackpill verkabelt<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-1920x1080.jpg\" alt=\"Grunds\u00e4tzlicher Funktionstest erfolgreich\" class=\"wp-image-7718\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/09-basic-keyboard-functionality-confirmed-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Grunds\u00e4tzlicher Funktionstest erfolgreich<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Restaurierung der Tastatur Sonderfunktionen<\/h2>\n\n\n\n <p> Ich hatte schon weiter oben im Artikel angeteasert, dass ich beide Boards einfach nicht in der Tastatur platziert bekomme, dennoch m\u00f6chte ich die Mediatasten gerne funktional haben. Aber selbst wenn ich die Platzprobleme gel\u00f6st bek\u00e4me, h\u00e4tte ich leider nicht genug freie, nutzbare Pins auf dem Mikrocontroller, um alle Funktionen als &#8222;direct&#8220; keys abbilden zu k\u00f6nnen. Ich br\u00e4uchte 2 f\u00fcr den Drehencoder, 3 f\u00fcr die 3 LEDs und 5 f\u00fcr die Medientasten. <\/p> \n\n\n\n <p> Ich komme aber nur auf 5 freie Pins nachdem das Tastatur-PCB bereits 25 belegt hat. Das reicht aber immerhin f\u00fcr den Drehencoder und die LEDs.  <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-1920x1080.jpg\" alt=\"F\u00fcr 'einschneidende' Ma\u00dfnahmen vorbereitetes altes PCB\" class=\"wp-image-7719\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/10-preparations-on-the-old-control-board-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">F\u00fcr &#8218;einschneidende&#8216; Ma\u00dfnahmen vorbereitetes altes PCB<\/figcaption><\/figure>\n\n\n\n <p> Somit ist klar, dass die Taster wegfallen w\u00fcrden, also kann ich auch zu drastischen Ma\u00dfnahmen greifen, um die Platzprobleme in den Griff zu bekommen. Und damit meine ich die Stichs\u00e4ge, mit der ich einfach 2 Ausschnitte aus dem originalen Control-Board herausges\u00e4gt habe. \u00dcbernommen habe ich den rechten Teil, der als Mount f\u00fcr den Drehencoder dient, den ich aber direkt verkabele. <\/p> \n\n\n\n <p> Ferner habe ich die 3 LEDs samt ihrer Vorwiderst\u00e4nde herausgeholt. Diese wurden allerding bislang \u00fcber den GND-Pin geschaltet und teilten sich eine gemeinsame Power-Rail. Die habe ich einfach mit einem scharfen Messer voneinander getrennt und auch direkt mit der Blackpill verbunden. <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-1920x1080.jpg\" alt=\"Indikator-LEDs f\u00fcr dem PCB Ausschnitt verkabelt.\" class=\"wp-image-7720\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/11-wired-up-LED-PCB-cutout-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Indikator-LEDs f\u00fcr dem PCB Ausschnitt verkabelt.<\/figcaption><\/figure>\n\n\n\n <p> Dabei verwende ich C13 als Num lock, der sich den Pin mit der User-LED der Blackpill teilt. Hat den Vorteil, dass ich Aktivit\u00e4t vom tinyuf2 Bootloader invertiert an der Num Lock LED ablesen kann. Auch dies kann in der <em>info.json<\/em> gesetzt werden: <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">    <span class=\"hljs-string\">\"indicators\"<\/span>: {\n        <span class=\"hljs-attr\">\"num_lock\"<\/span>: <span class=\"hljs-string\">\"C13\"<\/span>,\n        <span class=\"hljs-attr\">\"caps_lock\"<\/span>: <span class=\"hljs-string\">\"B14\"<\/span>,\n        <span class=\"hljs-attr\">\"scroll_lock\"<\/span>: <span class=\"hljs-string\">\"B2\"<\/span>,\n        <span class=\"hljs-attr\">\"on_state\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n    },\n    <span class=\"hljs-string\">\"encoder\"<\/span>: {\n        <span class=\"hljs-attr\">\"rotary\"<\/span>: &#91;\n            {\n            <span class=\"hljs-attr\">\"pin_a\"<\/span>: <span class=\"hljs-string\">\"B13\"<\/span>,\n            <span class=\"hljs-attr\">\"pin_b\"<\/span>: <span class=\"hljs-string\">\"B12\"<\/span>,\n            <span class=\"hljs-attr\">\"resolution\"<\/span>: <span class=\"hljs-number\">4<\/span>\n            }\n        ]\n    },<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-1920x1080.jpg\" alt=\"LEDs und Drehschalter mit der MCU verkabelt\" class=\"wp-image-7721\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-1920x1080.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-800x450.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-300x169.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-768x432.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-1536x864.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-2048x1152.jpg 2048w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/12-wired-up-rotary-encoder-and-LEDs-2000x1125.jpg 2000w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">LEDs und Drehschalter mit der MCU verkabelt<\/figcaption><\/figure>\n\n\n\n <p> Wie man sieht, habe ich auch den BOOT und RESET Taster ausgel\u00f6tet, um noch ein paar mm Platz zu gewinnen. Das macht es allerdings schwieriger, die Blackpill in den Bootloader Modus zu versetzen &#8211; insbesondere wenn die Tastatur wieder zusammengebaut ist. <\/p> \n\n\n\n <p> Die Firmware reagiert standardm\u00e4\u00dfig auf das Dr\u00fccken der Taste [0, 0] w\u00e4hrend des Bootens \/ Einsteckens. Das ist normalerweise die &#8222;Esc&#8220; Taste. Allerdings nicht bei diesem PCB. Hier ist &#8222;Esc&#8220; an der row 5 und der column 16 angeschlossen. Dies kann bislang ausschlie\u00dflich in der config.h konfiguriert werden. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-id\">#define<\/span> <span class=\"hljs-selector-tag\">BOOTMAGIC_LITE_ROW<\/span> 5\n<span class=\"hljs-selector-id\">#define<\/span> <span class=\"hljs-selector-tag\">BOOTMAGIC_LITE_COLUMN<\/span> 16<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Drehencoder mit Leben bef\u00fcllen<\/h3>\n\n\n\n <p> Hierf\u00fcr wird ein Schnipsel Code in der <em>keymap.c<\/em> f\u00e4llig, wobei ich nicht nur die Lautst\u00e4rkeregelung nachgebaut habe, sondern sie auch um eine Scrollfunktion erweitert habe. <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-comment\">\/\/ rotary encoder<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">encoder_update_user<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">uint8_t<\/span> index, <span class=\"hljs-keyword\">bool<\/span> clockwise)<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ scroll with CTRL<\/span>\n    <span class=\"hljs-keyword\">if<\/span> (get_mods() &amp; MOD_BIT(KC_CAPS)) {\n        <span class=\"hljs-keyword\">if<\/span> (clockwise) {\n            tap_code(KC_WH_U);\n        } <span class=\"hljs-keyword\">else<\/span> {\n            tap_code(KC_WH_D);\n    }\n    <span class=\"hljs-comment\">\/\/ Volume control<\/span>\n    } <span class=\"hljs-keyword\">else<\/span> {\n        <span class=\"hljs-keyword\">if<\/span> (clockwise) {\n            tap_code(KC_VOLD);\n        } <span class=\"hljs-keyword\">else<\/span> {\n            tap_code(KC_VOLU);\n        }\n    }\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n <p> Interessant finde ich, dass der Regler nun viel zuverl\u00e4ssiger funktioniert. Ich hatte das bislang immer auf einen schwammingen Encoder geschoben, aber scheinbar hat die Entprellung der Impulsgeber in Software hier den Unterschied gemacht. Mit dem original-Board ist die Lautst\u00e4rke gerne mal zwischen 2 benachbarten Lautst\u00e4rkestufen hin- und hergesprungen. Das ist nun nicht mehr der Fall. <span class=\"wp-font-emots-emo-happy\"><\/span> <\/p> \n\n\n\n<h3 class=\"wp-block-heading\">Medientasten nachbauen<\/h3>\n\n\n\n <p> Die Tasten f\u00fcr Sleep, Skip Back, Play\/Pause, Skip Forward und Mute habe ich auf einem 2. Layer auf die umliegenden Tasten verteilt. Dieser 2. Layer wird ebenfalls wie der Base-Layer in der keymap.c konfiguriert. <\/p> \n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1179\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-1920x1179.jpg\" alt=\"Tastenzuordnung Mediafunktionen\" class=\"wp-image-7706\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-1920x1179.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-800x491.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-300x184.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-768x472.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-1536x943.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/mediakey_mapping-2048x1258.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><\/figure>\n\n\n\n <p> Als Modkey hab ich die rechte <em>Super<\/em>-Taste gew\u00e4hlt, da ich sie so gut wie nie verwende. Ich k\u00f6nnte tats\u00e4chlich nicht einmal sagen, ob eine sinnvolle Funktion auf meinem Fedora drauf gelegt ist. Ich verwende den TT(_MEDIA) Modus, der sowohl als momentary Switch funktioniert, allerdings auch einen dauerhaften Wechsel mittels double-tapping erlaubt. ( &#8222;tapping&#8220;: {&#8222;toggle&#8220;: 2} ) <\/p> \n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">define<\/span> _BASE 0<\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">define<\/span> _MEDIA 1<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">uint16_t<\/span> PROGMEM keymaps&#91;]&#91;MATRIX_ROWS]&#91;MATRIX_COLS] = {\n    &#91;_BASE] = LAYOUT_fullsize_iso(\n        KC_ESC,           KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,     KC_F11,  KC_F12,     KC_PSCR, KC_SCRL, KC_PAUS,\n        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS,    KC_EQL,  KC_BSPC,    KC_INS,  KC_HOME, KC_PGUP,    KC_NUM,  KC_PSLS, KC_PAST, KC_PMNS,\n        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC,    KC_RBRC,             KC_DEL,  KC_END,  KC_PGDN,    KC_P7,   KC_P8,   KC_P9,   KC_PPLS,\n        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,    KC_NUHS, KC_ENT,                                   KC_P4,   KC_P5,   KC_P6,\n        KC_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,             KC_RSFT,             KC_UP,               KC_P1,   KC_P2,   KC_P3,   KC_PENT,\n        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, TT(_MEDIA), KC_APP,  KC_RCTL,    KC_LEFT, KC_DOWN, KC_RGHT,    KC_P0,            KC_PDOT\n    ),\n    &#91;_MEDIA] = LAYOUT_fullsize_iso(\n        KC_TRNS,              KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_TRNS,  KC_SLEP,\n        KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_MPRV,   KC_MPLY,   KC_MNXT,   KC_MUTE,\n        KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS, KC_TRNS,             KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,\n        KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS,   KC_TRNS,   KC_TRNS,\n        KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,          KC_TRNS,               KC_TRNS,              KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,\n        KC_TRNS,  KC_TRNS,    KC_TRNS,                            KC_TRNS,                            KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,                      KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_TRNS,              KC_TRNS\n    )\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n <p> War die Reparatur gemessen am Zeitaufwand wirtschaftlich sinnvoll? Auf keinen Fall! Ein Neukauf (den ich zus\u00e4tzlich auch get\u00e4tigt habe) w\u00e4re schneller, einfacher und sinnvoller gewesen. Aber ich habe dabei etwas gelernt und sogar eine Portion Spa\u00df dabei. Und ich habe ein tolles St\u00fcck Technik vor der M\u00fcllhalde bewahrt. <\/p> \n\n\n\n <p> Und noch besser: Ich habe mit den M\u00f6glichkeiten, dynamisch Keyboard-Layer umzuschalten gerade erst einmal an der Oberfl\u00e4che der M\u00f6glichkeiten gekratzt, die sich daraus ergeben. Da werde ich bestimmt noch ein wenig an meiner Keymap feilen und optimieren. <\/p> \n\n\n\n<p class=\"has-background\" style=\"background-color:#c9dceb\">Und falls jemand mal einen \u00e4hnlichen Rettungsversuch an einer solchen Tastatur durchf\u00fchren m\u00f6chte, gibts meine keyboard-Definition <a href=\"https:\/\/github.com\/Commander1024\/qmk_firmware\/tree\/daskeyboard4\/keyboards\/handwired\/daskeyboard\/daskeyboard4\" target=\"_blank\" rel=\"noreferrer noopener\">auf meinem Branch auf github<\/a>. Vielleicht findet man sie aber auch in Zukunft im <em>master<\/em> branch von <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\" target=\"_blank\" rel=\"noreferrer noopener\">qmk_firmware<\/a>. <span class=\"wp-font-emots-emo-wink\"><\/span> <\/p> \n\n\n\n<figure class=\"wp-block-image alignfull size-large\"><a href=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"864\" src=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-1920x864.jpg\" alt=\"Vollst\u00e4ndig funktionsrestaurierte Tastatur. Jetzt mit Extrafunktionen :-)\" class=\"wp-image-7722\" srcset=\"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-1920x864.jpg 1920w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-800x360.jpg 800w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-300x135.jpg 300w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-768x346.jpg 768w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-1536x691.jpg 1536w, https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/13-restored-working-keyboard-2048x922.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><figcaption class=\"wp-element-caption\">Vollst\u00e4ndig funktionsrestaurierte Tastatur. Jetzt mit Extrafunktionen <span class=\"wp-font-emots-emo-happy\"><\/span><\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":" <p> Meine hei\u00dfgeliebte &#8222;daskeyboard 4 Root&#8220; Tastatur habe ich mir 2018 gekauft. Das war das erste mal, dass ich bewusst Geld in das St\u00fcck Peripherie gesteckt habe, das ich nahezu den ganzen Tag an den Fingern habe. Und den Kauf habe ich bis zum heutigen Tag nicht bereut. Und sie zeigt auch noch lange keine Erm\u00fcdungserscheinungen&hellip; <\/p> \n","protected":false},"author":1,"featured_media":7715,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[474,6,570],"tags":[574,576,476,572,575,573,571],"class_list":["post-7723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-do-it-yourself","category-hardware","category-tastatur","tag-blackpill","tag-daskeyboard","tag-diy","tag-mikrocontroller","tag-qmk","tag-stm32","tag-tastatur","comments-open","no-comments"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DIY-Reparatur einer defekten Tastatur &#8211; Commander1024<\/title>\n<meta name=\"description\" content=\"Nach einem Liquid-spill habe ich beim Debugging meine Tastatur zerst\u00f6rt. jetzt baue ich sie mit QMK Firmware und Extrafunktionen wieder auf.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marcus Scholz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/\"},\"author\":{\"name\":\"Marcus Scholz\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#\\\/schema\\\/person\\\/aebb61d9f57867e2234becde6d99da8d\"},\"headline\":\"DIY-Reparatur einer defekten Tastatur\",\"datePublished\":\"2022-10-15T09:26:09+00:00\",\"dateModified\":\"2024-03-05T21:08:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/\"},\"wordCount\":2046,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#\\\/schema\\\/person\\\/aebb61d9f57867e2234becde6d99da8d\"},\"image\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg\",\"keywords\":[\"Blackpill\",\"daskeyboard\",\"DIY\",\"Mikrocontroller\",\"QMK\",\"STM32\",\"Tastatur\"],\"articleSection\":[\"Do-It-Yourself\",\"Hardware\",\"Tastatur\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/\",\"url\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/\",\"name\":\"DIY-Reparatur einer defekten Tastatur &#8211; Commander1024\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg\",\"datePublished\":\"2022-10-15T09:26:09+00:00\",\"dateModified\":\"2024-03-05T21:08:59+00:00\",\"description\":\"Nach einem Liquid-spill habe ich beim Debugging meine Tastatur zerst\u00f6rt. jetzt baue ich sie mit QMK Firmware und Extrafunktionen wieder auf.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg\",\"width\":2560,\"height\":1440,\"caption\":\"STM32F411CE Blackpill\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/2022\\\/10\\\/diy-reparatur-einer-defekten-tastatur\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DIY-Reparatur einer defekten Tastatur\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/\",\"name\":\"Dem Commander1024 sein Blog\",\"description\":\"A Network Engineer&#039;s life\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#\\\/schema\\\/person\\\/aebb61d9f57867e2234becde6d99da8d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/#\\\/schema\\\/person\\\/aebb61d9f57867e2234becde6d99da8d\",\"name\":\"Marcus Scholz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/Underground-Tour-89-scaled.jpg\",\"url\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/Underground-Tour-89-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/Underground-Tour-89-scaled.jpg\",\"width\":1707,\"height\":2560,\"caption\":\"Marcus Scholz\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/Underground-Tour-89-scaled.jpg\"},\"description\":\"Seit Kindheitstagen ist der Computer sein Begleiter. Was mit Linux anfing, wurde 2005 ein\\\/e Beruf\\\/ung, die weit \u00fcber den Arbeitsplatz hinausgeht. Durch stetige Weiterentwicklung fasste er auch im *BSD Segment Fu\u00df und bietet mittlerweile professionelle L\u00f6sungen im Bereich Hosting, Networking und Infrastruktur an. Als Ausgleich besch\u00e4ftigt er sich neben Computerspielen mit der Fotografie.\",\"sameAs\":[\"https:\\\/\\\/www.commander1024.de\",\"https:\\\/\\\/www.facebook.com\\\/Commander1024\",\"https:\\\/\\\/x.com\\\/Commander1024\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCG_WzkCMycoSH7lEcvKHnmA\"],\"url\":\"https:\\\/\\\/www.commander1024.de\\\/wordpress\\\/author\\\/commander1024\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DIY-Reparatur einer defekten Tastatur &#8211; Commander1024","description":"Nach einem Liquid-spill habe ich beim Debugging meine Tastatur zerst\u00f6rt. jetzt baue ich sie mit QMK Firmware und Extrafunktionen wieder auf.","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:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/","twitter_misc":{"Verfasst von":"Marcus Scholz","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#article","isPartOf":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/"},"author":{"name":"Marcus Scholz","@id":"https:\/\/www.commander1024.de\/wordpress\/#\/schema\/person\/aebb61d9f57867e2234becde6d99da8d"},"headline":"DIY-Reparatur einer defekten Tastatur","datePublished":"2022-10-15T09:26:09+00:00","dateModified":"2024-03-05T21:08:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/"},"wordCount":2046,"commentCount":0,"publisher":{"@id":"https:\/\/www.commander1024.de\/wordpress\/#\/schema\/person\/aebb61d9f57867e2234becde6d99da8d"},"image":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#primaryimage"},"thumbnailUrl":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg","keywords":["Blackpill","daskeyboard","DIY","Mikrocontroller","QMK","STM32","Tastatur"],"articleSection":["Do-It-Yourself","Hardware","Tastatur"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/","url":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/","name":"DIY-Reparatur einer defekten Tastatur &#8211; Commander1024","isPartOf":{"@id":"https:\/\/www.commander1024.de\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#primaryimage"},"image":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#primaryimage"},"thumbnailUrl":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg","datePublished":"2022-10-15T09:26:09+00:00","dateModified":"2024-03-05T21:08:59+00:00","description":"Nach einem Liquid-spill habe ich beim Debugging meine Tastatur zerst\u00f6rt. jetzt baue ich sie mit QMK Firmware und Extrafunktionen wieder auf.","breadcrumb":{"@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#primaryimage","url":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg","contentUrl":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2022\/10\/06-STM32F411-Blackpill-running-QMK-firmware-for-the-first-time-scaled.jpg","width":2560,"height":1440,"caption":"STM32F411CE Blackpill"},{"@type":"BreadcrumbList","@id":"https:\/\/www.commander1024.de\/wordpress\/2022\/10\/diy-reparatur-einer-defekten-tastatur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.commander1024.de\/wordpress\/"},{"@type":"ListItem","position":2,"name":"DIY-Reparatur einer defekten Tastatur"}]},{"@type":"WebSite","@id":"https:\/\/www.commander1024.de\/wordpress\/#website","url":"https:\/\/www.commander1024.de\/wordpress\/","name":"Dem Commander1024 sein Blog","description":"A Network Engineer&#039;s life","publisher":{"@id":"https:\/\/www.commander1024.de\/wordpress\/#\/schema\/person\/aebb61d9f57867e2234becde6d99da8d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.commander1024.de\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/www.commander1024.de\/wordpress\/#\/schema\/person\/aebb61d9f57867e2234becde6d99da8d","name":"Marcus Scholz","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2020\/11\/Underground-Tour-89-scaled.jpg","url":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2020\/11\/Underground-Tour-89-scaled.jpg","contentUrl":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2020\/11\/Underground-Tour-89-scaled.jpg","width":1707,"height":2560,"caption":"Marcus Scholz"},"logo":{"@id":"https:\/\/www.commander1024.de\/wordpress\/wp-content\/uploads\/2020\/11\/Underground-Tour-89-scaled.jpg"},"description":"Seit Kindheitstagen ist der Computer sein Begleiter. Was mit Linux anfing, wurde 2005 ein\/e Beruf\/ung, die weit \u00fcber den Arbeitsplatz hinausgeht. Durch stetige Weiterentwicklung fasste er auch im *BSD Segment Fu\u00df und bietet mittlerweile professionelle L\u00f6sungen im Bereich Hosting, Networking und Infrastruktur an. Als Ausgleich besch\u00e4ftigt er sich neben Computerspielen mit der Fotografie.","sameAs":["https:\/\/www.commander1024.de","https:\/\/www.facebook.com\/Commander1024","https:\/\/x.com\/Commander1024","https:\/\/www.youtube.com\/channel\/UCG_WzkCMycoSH7lEcvKHnmA"],"url":"https:\/\/www.commander1024.de\/wordpress\/author\/commander1024\/"}]}},"_links":{"self":[{"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/posts\/7723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/comments?post=7723"}],"version-history":[{"count":40,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/posts\/7723\/revisions"}],"predecessor-version":[{"id":8550,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/posts\/7723\/revisions\/8550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/media\/7715"}],"wp:attachment":[{"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/media?parent=7723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/categories?post=7723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.commander1024.de\/wordpress\/wp-json\/wp\/v2\/tags?post=7723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}