{"id":4680,"date":"2017-02-19T11:00:06","date_gmt":"2017-02-19T10:00:06","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=4680"},"modified":"2017-02-19T11:04:13","modified_gmt":"2017-02-19T10:04:13","slug":"bidouilles-et-nostalgie-usb-ifions-un-clavier-de-pcxt","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2017\/02\/19\/bidouilles-et-nostalgie-usb-ifions-un-clavier-de-pcxt\/","title":{"rendered":"[Bidouilles et nostalgie] USB-ifions un clavier de PC\/XT"},"content":{"rendered":"<p><a href=\"https:\/\/www.blaess.fr\/christophe\/2017\/02\/19\/bidouilles-et-nostalgie-usb-ifions-un-clavier-de-pcxt\/00-usb-pc-xt-keyboard-mini\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-4730 size-medium\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/00-USB-PC-XT-keyboard-mini-300x200.png\" alt=\"USB PC\/XT keyboard\" width=\"300\" height=\"200\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Voici un petit <em>hack<\/em>, simple et \u00e0 la port\u00e9e de tous, qui m&rsquo;a \u00e9t\u00e9 inspir\u00e9 par <a href=\"https:\/\/twitter.com\/hackablemag\/status\/828918545551597568\" target=\"_blank\">un tweet<\/a> de <a href=\"https:\/\/twitter.com\/hackablemag\" target=\"_blank\">@Hackablemag<\/a> de la semaine derni\u00e8re.<\/p>\n<p style=\"text-align: justify;\">Il s&rsquo;agit de transformer un ancien <strong>clavier m\u00e9canique d&rsquo;IBM PC\/XT<\/strong> des ann\u00e9es 1980 pour pouvoir le connecter en USB sur n&rsquo;importe quel syst\u00e8me actuel. Je n&rsquo;ai pas pu r\u00e9sister \u00e0 l&rsquo;envie de tenter la m\u00eame op\u00e9ration de mon c\u00f4t\u00e9, pour comparer nos approches ensuite.<\/p>\n<p>\n<!--more-->\n<\/p>\n<h1>PC\/XT&nbsp;?<\/h1>\n<p style=\"text-align: justify;\">Tout d&rsquo;abord un IBM PC\/XT, \u00e7a ressemble \u00e0 \u00e7a&nbsp;:<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/2017\/02\/19\/bidouilles-et-nostalgie-usb-ifions-un-clavier-de-pcxt\/\" rel=\"attachment wp-att-4686\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4686 alignnone\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/01-PC-XT.png\" alt=\"IBM PC\/XT de 1984\" width=\"400\" height=\"487\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/01-PC-XT.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/01-PC-XT-246x300.png 246w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Ce v\u00e9n\u00e9rable ordinosaure p\u00e8se quand m\u00eame plus de 28&nbsp;kg poussi\u00e8re comprise (3&nbsp;kg pour le clavier, 12.5&nbsp;kg pour l&rsquo;\u00e9cran et 13&nbsp;kg pour l&rsquo;unit\u00e9 centrale)&nbsp;!<\/p>\n<p style=\"text-align: justify;\">Il est organis\u00e9 autour d&rsquo;un processeur <strong>Intel 8088<\/strong> (<em>non, non, pas de faute de frappe<\/em>), cadenc\u00e9 \u00e0 <strong>4.77 MHz<\/strong> (<em>pas de faute de frappe non plus<\/em>), muni de <strong>512Ko<\/strong> de m\u00e9moire RAM (<em>toujours pas de faute de frappe<\/em>) et un \u00e9cran CGA couleur avec une r\u00e9solution de <strong>640&#215;200<\/strong> (<em>hem&#8230;<\/em>). Celui-ci poss\u00e8de un disque dur de <strong>20 Mo<\/strong> et un lecteur de disquette 5&Prime;1\/4 (qui n&rsquo;est pas le mod\u00e8le d&rsquo;origine).<\/p>\n<p style=\"text-align: justify;\">\u00c9tudiant, j&rsquo;ai achet\u00e9 ce PC d&rsquo;occasion aupr\u00e8s d&rsquo;une entreprise en 1988, et je l&rsquo;ai utilis\u00e9 intensivement pendant quatre ans avec MS-DOS 3.2, Windows 1.0 (<em>et oui&nbsp;!<\/em>), puis &#8211; avec un succ\u00e8s mitig\u00e9 &#8211; Minix.<\/p>\n<p style=\"text-align: justify;\">Il para\u00eet bien d\u00e9suet aujourd&rsquo;hui, mais j&rsquo;ai appris gr\u00e2ce \u00e0 lui la programmation en assembleur Intel (j&rsquo;avais pratiqu\u00e9 les assembleurs Zilog et Motorola auparavant), en langage C et en Pascal. J&rsquo;ai \u00e9crit dessus de nombreux petits programmes et m\u00eame des applications de reconnaissance d&rsquo;\u00e9criture manuscrite par r\u00e9seau de neurones durant mes \u00e9tudes.<\/p>\n<p style=\"text-align: justify;\">Les jeux n&rsquo;\u00e9taient pas son fort, mais j&rsquo;en ai pratiqu\u00e9 un bon nombre, dont le Tetris original (celui d&rsquo;Alexey Pajitnov).<\/p>\n<p style=\"text-align: justify;\">Son <strong>clavier m\u00e9canique<\/strong> avait un toucher particuli\u00e8rement agr\u00e9able et un cliquetis tr\u00e8s sympathique. C&rsquo;est l&rsquo;objet de mon <em>hack<\/em> de cette semaine.<\/p>\n<h1>Connexion<\/h1>\n<p style=\"text-align: justify;\">Le clavier (tout comme le reste du syst\u00e8me) n&rsquo;\u00e9tait pas en tr\u00e8s bon \u00e9tat ext\u00e9rieur. Remis\u00e9 pendant des ann\u00e9es dans diff\u00e9rents endroits plus humides et poussi\u00e9reux les uns que les autres, il avait besoin d&rsquo;un bon nettoyage.<\/p>\n<div id=\"attachment_4687\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/02-Berk.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4687\" class=\"wp-image-4687 size-thumbnail\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/02-Berk-150x150.png\" alt=\"Berk&nbsp;!\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-4687\" class=\"wp-caption-text\">Berk&nbsp;!<\/p><\/div>\n<p style=\"text-align: justify;\">Pas question, \u00e9videmment de l&rsquo;immerger tel quel dans la baignoire. Apr\u00e8s l&rsquo;avoir ouvert et d\u00e9mont\u00e9 les cabochons des touches, j&rsquo;ai fait tremper toutes les parties en plastique dans un bain de liquide vaisselle, puis \u00e9pousset\u00e9, gratt\u00e9 et graiss\u00e9 toutes les parties m\u00e9talliques.<\/p>\n<p style=\"text-align: justify;\">Lors de l&rsquo;ouverture du clavier, une \u00e9tiquette de validation indique la date de mise en service&nbsp;: 1er octobre 1984. Pas moins de quatre techniciens l&rsquo;ont contre-sign\u00e9e, c&rsquo;est une marque de la qualit\u00e9 remarquable de sa fabrication. Apr\u00e8s plus de trente ans, <strong>la s\u00e9rigraphie des touches est encore impeccable<\/strong>, contrairement \u00e0 tous les autres claviers qui m&rsquo;environnent et dont les touches principales comme SHIFT, CTRL, ou TAB (compl\u00e9tion du shell) affichent quelques signes d&rsquo;usure.<\/p>\n<div id=\"attachment_4688\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/03-DIN-connector.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4688\" class=\"wp-image-4688 size-thumbnail\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/03-DIN-connector-150x150.png\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/03-DIN-connector-150x150.png 150w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/03-DIN-connector-300x300.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/03-DIN-connector.png 350w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-4688\" class=\"wp-caption-text\">Connecteur DIN<\/p><\/div>\n<p style=\"text-align: justify;\">Le branchement du clavier sur l&rsquo;unit\u00e9 centrale se fait avec un gros <strong>connecteur DIN<\/strong> (dont le successeur f\u00fbt la petite prise PS2 clavier\/souris que l&rsquo;on rencontre encore parfois sur des syst\u00e8mes anciens).<\/p>\n<p style=\"text-align: justify;\">Le gros inconv\u00e9nient de ce connecteur, \u00e9tait qu&rsquo;\u00e0 chaque d\u00e9branchement\/rebranchement du clavier, il \u00e9tait n\u00e9cessaire de red\u00e9marrer le PC pour pouvoir le r\u00e9initialiser&nbsp;!<\/p>\n<p style=\"text-align: justify;\">En ouvrant le clavier on trouve quatre fils reli\u00e9s \u00e0 un petit connecteur amovible, et une carte de commande avec un microcontr\u00f4leur. Les ing\u00e9nieurs d&rsquo;IBM devaient \u00eatre d&rsquo;humeur fac\u00e9tieuse le jour o\u00f9 ils ont d\u00e9cr\u00e9t\u00e9 que l&rsquo;<strong>alimentation<\/strong> +5V de la carte se ferait sur le fil marron, et la <strong>masse<\/strong> sur le fil rouge&nbsp;! Les deux autres broches sont une <strong>horloge<\/strong> (fil noir) et une ligne de <strong>donn\u00e9es<\/strong> (fil blanc).<\/p>\n<div id=\"attachment_4689\" style=\"width: 309px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/04-DIN-connector-2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4689\" class=\"wp-image-4689 size-full\" title=\"Connecteur DIN\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/04-DIN-connector-2.png\" alt=\"Connecteur DIN\" width=\"299\" height=\"160\" \/><\/a><p id=\"caption-attachment-4689\" class=\"wp-caption-text\">Connecteur DIN<\/p><\/div>\n<p style=\"text-align: justify;\">Le clavier communique avec un protocole synchrone assez simple. La communication \u00e9tant pr\u00e9vue pour \u00eatre bidirectionnelle, le clavier n&rsquo;\u00e9met les codes des touches press\u00e9es (et rel\u00e2ch\u00e9es) que si les deux lignes d&rsquo;horloge et de donn\u00e9es sont au niveau haut pendant une dur\u00e9e minimale d&rsquo;une milliseconde. Lorsque les lignes sont \u00e0 un autre niveau, c&rsquo;est le PC qui peut envoyer une commande au clavier (r\u00e9initialisation, \u00e9tat des LEDs, etc.).<\/p>\n<div id=\"attachment_4690\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/05-Signals.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4690\" class=\"size-thumbnail wp-image-4690\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/05-Signals-150x150.png\" alt=\"Test des signaux\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-4690\" class=\"wp-caption-text\">Test des signaux<\/p><\/div>\n<p style=\"text-align: justify;\">Le protocole du clavier du PC\/XT est plus simple que celui de ses successeurs, car il n&rsquo;a pas de LED (<em>Numlock<\/em>, <em>Capslock<\/em>, etc.) et donc le PC n&rsquo;a pas besoin d&rsquo;envoyer de messages vers le clavier.<\/p>\n<p style=\"text-align: justify;\">Attention, je le r\u00e9p\u00e8te&nbsp;: ce protocole est sp\u00e9cifique au PC\/XT, celui des claviers pour PC\/AT ult\u00e9rieurs est un peu diff\u00e9rent au niveau de la s\u00e9quence <em>Start<\/em> et ajoute un bit de parit\u00e9. Un document que j&rsquo;ai trouv\u00e9 sur\u00a0 <a href=\"http:\/\/kbdbabel.sourceforge.net\/doc\/kbd_signaling_pcxt_ps2_adb.pdf\" target=\"_blank\">http:\/\/kbdbabel.sourceforge.net\/doc\/kbd_signaling_pcxt_ps2_adb.pdf<\/a> d\u00e9crit les deux formats.<\/p>\n<p style=\"text-align: justify;\">Apr\u00e8s avoir aliment\u00e9 le clavier, nous pouvons observer \u00e0 l&rsquo;oscilloscope les signaux <em>CLOCK<\/em> (en haut en bleu) et <em>DATA<\/em> (en bas en rouge) lorsque l&rsquo;on presse et rel\u00e2che des touches. Des r\u00e9sistances de tirage <em>pull-up<\/em> permettent de forcer \u00e0 l&rsquo;\u00e9tat haut les lignes au repos, autorisant le clavier \u00e0 \u00e9mettre. Le signal commence par une s\u00e9quence <em>START<\/em> immuable dont le timing est pr\u00e9cis\u00e9ment d\u00e9fini, suivi de 8 bits de donn\u00e9es valides sur les fronts descendants du signal d&rsquo;horloge.<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4691\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed-300x169.png\" alt=\"&quot;P&quot; key pressed\" width=\"300\" height=\"169\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed-300x169.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed-768x432.png 768w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed-1024x576.png 1024w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/06-P-key-pressed.png 1280w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Le code de la touche press\u00e9e (nomm\u00e9e <em>scan-code<\/em>) est lu en comptant le bit de poids faible en premier. Le code ci-dessus est donc <code>00011001b<\/code> soit <code>0x19<\/code>. Le bit de poids fort (le dernier transmis) indique s&rsquo;il s&rsquo;agit d&rsquo;une pression (\u00e0 <code>0<\/code>) ou d&rsquo;un rel\u00e2chement de la touche (\u00e0 <code>1<\/code>). Le code ci-dessous correspond \u00e0 un rel\u00e2chement, c&rsquo;est <code>0x99<\/code>.<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4692\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released-300x169.png\" alt=\"&quot;P&quot; key released\" width=\"300\" height=\"169\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released-300x169.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released-768x432.png 768w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released-1024x576.png 1024w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/07-P-key-released.png 1280w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">On peut donc construire un graphique des <code>scan-codes<\/code> du clavier de l&rsquo;IBM PC\/XT. La table ci-dessous pr\u00e9sente les codes de pression. Pour obtenir les codes de rel\u00e2chement correspondants, il faut leurs ajouter la valeur <code>0x80<\/code>.<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/08-scancodes.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4693\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/08-scancodes-300x71.png\" alt=\"\" width=\"300\" height=\"71\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/08-scancodes-300x71.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/08-scancodes-768x181.png 768w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/08-scancodes.png 797w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Les <code>scan-codes<\/code> ne d\u00e9pendent pas de l&rsquo;internationalisation. L&rsquo;affectation au <code>scan-code<\/code> <code>0x10<\/code> de la touche \u2018<code>A<\/code>\u2019 en disposition <em>AZERTY<\/em> ou \u2018<code>Q<\/code>\u2019 en disposition <em>QWERTY<\/em> est effectu\u00e9e par l&rsquo;OS du syst\u00e8me en fonction des choix de l&rsquo;utilisateur.<\/p>\n<h1>Programmation<\/h1>\n<p style=\"text-align: justify;\">Pour \u00ab\u00a0USB-ifier\u00a0\u00bb un tel clavier, rien de tel que l&rsquo;ajout d&rsquo;un petit microcontr\u00f4leur comme un Arduino. Un choix encore meilleur sera celui d&rsquo;une carte <a href=\"https:\/\/www.pjrc.com\/teensy\/\" target=\"_blank\">Teensy<\/a> car elle propose directement une \u00e9mulation de p\u00e9riph\u00e9rique USB (nous avons d\u00e9j\u00e0 vu son comportement comme souris dans <a href=\"https:\/\/www.blaess.fr\/christophe\/2016\/12\/26\/projet-nunmouse\/\">cet article<\/a>).<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai donc connect\u00e9 une Teensy 3.2 au clavier en conservant la couleur des c\u00e2bles d&rsquo;origine.<\/p>\n<div id=\"attachment_4694\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/09-Teensy-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4694\" class=\"size-medium wp-image-4694\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/09-Teensy-1-300x210.png\" alt=\"\" width=\"300\" height=\"210\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/09-Teensy-1-300x210.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/09-Teensy-1.png 400w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-4694\" class=\"wp-caption-text\">Teensy 3.2<\/p><\/div>\n<table style=\"text-align: justify;\">\n<tbody>\n<tr>\n<td>C\u00e2ble<\/td>\n<td>R\u00f4le<\/td>\n<td>Connexion Teensy<\/td>\n<\/tr>\n<tr>\n<td>Rouge<\/td>\n<td>GND<\/td>\n<td>GND<\/td>\n<\/tr>\n<tr>\n<td>Marron<\/td>\n<td>+5V<\/td>\n<td>VUSB<\/td>\n<\/tr>\n<tr>\n<td>Noir<\/td>\n<td>Clock<\/td>\n<td>D0<\/td>\n<\/tr>\n<tr>\n<td>Blanc<\/td>\n<td>Data<\/td>\n<td>D1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div id=\"attachment_4695\" style=\"width: 218px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/10-Teensy-2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4695\" class=\"size-medium wp-image-4695\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/10-Teensy-2-208x300.png\" alt=\"Teensy 3.2\" width=\"208\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/10-Teensy-2-208x300.png 208w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/02\/10-Teensy-2.png 360w\" sizes=\"auto, (max-width: 208px) 100vw, 208px\" \/><\/a><p id=\"caption-attachment-4695\" class=\"wp-caption-text\">Teensy 3.2<\/p><\/div>\n<p style=\"text-align: justify;\">J&rsquo;ai programm\u00e9 la carte Teensy avec <a href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2017-02-19\/usb-pc-xt-keyboard.ino\">le petit fichier suivant<\/a>. On voit que <strong>les affectations de touches sont modifiables<\/strong> assez facilement dans le tableau initial. J&rsquo;ai fait plusieurs essais pour obtenir un comportement assez proche des s\u00e9rigraphies des touches sans trop modifier la configuration de mon PC (et du clavier que j&rsquo;utilise au quotidien), il ne faut pas h\u00e9siter \u00e0 faire ses propres adaptations.<\/p>\n<pre><strong><a href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2017-02-19\/usb-pc-xt-keyboard.ino\">usb-pc-xt-keyboard.ino:<\/a><\/strong>\n\/\/\/ ------------------------------------------------------------------------------------------\n\/\/\/ \\file USB PC\/XT keyboard - Teensy program to \"USBify\" an old PC\/XT keyboard.\n\/\/\/\n\/\/\/ \\author 2017 Christophe BLAESS &lt;christophe@blaess.fr&gt;\n\/\/\/\n\/\/\/ \\license GPL\n\/\/\/ ------------------------------------------------------------------------------------------\n\n\/\/\/ \\note Remember to Select \"Keyboard\" in \"Tools-&gt; USB Type\" menu.\n\n\/\/ The key table: the index is the keyboard scan-code.\n\/\/\nint key[0x80] = {\n\/* 00-07 *\/  0xFF,           KEY_ESC,        KEY_1,          KEY_2,          KEY_3,          KEY_4,          KEY_5,          KEY_6,\n\/* 08-0F *\/  KEY_7,          KEY_8,          KEY_9,          KEY_0,          KEY_MINUS,      KEY_EQUAL,      KEY_BACKSPACE,  KEY_TAB,\n\/* 10-17 *\/  KEY_Q,          KEY_W,          KEY_E,          KEY_R,          KEY_T,          KEY_Y,          KEY_U,          KEY_I,\n\/* 18-1F *\/  KEY_O,          KEY_P,          KEY_LEFT_BRACE, KEY_RIGHT_BRACE,KEY_ENTER,      KEY_LEFT_CTRL,  KEY_A,          KEY_S,\n\/* 20-27 *\/  KEY_D,          KEY_F,          KEY_G,          KEY_H,          KEY_J,          KEY_K,          KEY_L,          KEY_SEMICOLON,\n\/* 28-2F *\/  KEY_QUOTE,      KEY_BACKSLASH,  KEY_LEFT_SHIFT, '&lt;',            KEY_Z,          KEY_X,          KEY_C,          KEY_V,\n\/* 30-37 *\/  KEY_B,          KEY_N,          KEY_M,          KEY_COMMA,      KEY_PERIOD,     KEY_EQUAL,      KEY_RIGHT_ALT,  KEYPAD_ASTERIX,\n\/* 38-3F *\/  KEY_LEFT_ALT,   KEY_SPACE,      KEY_CAPS_LOCK,  KEY_F1,         KEY_F2,         KEY_F3,         KEY_F4,         KEY_F5,\n\/* 40-47 *\/  KEY_F6,         KEY_F7,         KEY_F8,         KEY_F9,         KEY_F10,        KEY_NUM_LOCK,   KEY_PRINTSCREEN,KEYPAD_7,\n\/* 48-4F *\/  KEYPAD_8,       KEYPAD_9,       KEYPAD_MINUS,   KEYPAD_4,       KEYPAD_5,       KEYPAD_6,       KEYPAD_PLUS,    KEYPAD_1,\n\/* 50-57 *\/  KEYPAD_2,       KEYPAD_3,       KEYPAD_0,       KEYPAD_PERIOD,  0xFF,           0xFF,           0xFF,           0xFF,\n\/* 58-5F *\/  0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,\n\/* 60-67 *\/  0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,\n\/* 68-6F *\/  0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,\n\/* 70-77 *\/  0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,\n\/* 78-7F *\/  0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,           0xFF,\n};\n\n\/\/ The keyboard leds values (used in the keyboard_leds global var).\n#define KEYBOARD_LED_NUM_LOCK    0x01\n#define KEYBOARD_LED_CAPS_LOCK   0x02\n\/\/ The D0 pin is connected to the CLOCK pin of the keyboard (black wire on the original PC\/XT keyboard).\n#define KEYBOARD_CLOCK   0\n\n\/\/ The D1 pin is connected to the DATA pin of the keyboard (white wire on the original PC\/XT keyboard).\n#define KEYBOARD_DATA    1\n\n\/\/ They both have to be pulled-up for the keyboard to start sending key events.\n\n\/\/ The Teensy 3.2 led is connected to the D13 pin.\n#define KEYBOARD_LED    13\n\nvoid setup()\n{\n  pinMode(KEYBOARD_CLOCK, INPUT_PULLUP);\n  pinMode(KEYBOARD_DATA,  INPUT_PULLUP);\n  pinMode(KEYBOARD_LED,   OUTPUT);\n}\n\n\nvoid loop()\n{\n  \/\/ Here's the signal from the PC\/XT keyboard (warning, it's different from PC\/AT more recent keyboards).\n  \/\/\n  \/\/  Step:  1   2  3  4  F  R  F  R  F  R  F  R  F  R  F  R  F  R  F  R ...\n  \/\/  \n  \/\/       --+   +--+  +--+  +--+  +--+  +--+  +--+  +--+  +--+  +--+  +----\n  \/\/ Clock:  |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |\n  \/\/         +---+  +--+  +--+  +--+  +--+  +--+  +--+  +--+  +--+  +--+\n  \/\/ \n  \/\/  Data:  &lt;----------&gt; B0    B1    B2    B3    B4    B5    B6    B7  \n  \/\/             Start\n  \/\/\n\n  unsigned char scan_code = 0;\n  int bit;\n\n  \/\/ --- Start sequence ---\n  \n  \/\/ Wait for step 1 (main wait loop):\n  while(digitalRead(KEYBOARD_CLOCK) == HIGH) {\n    digitalWrite(KEYBOARD_LED, (keyboard_leds &amp; KEYBOARD_LED_NUM_LOCK) != 0 ? HIGH : LOW);\n  }\n  \/\/ Wait for step 2:\n  while (digitalRead(KEYBOARD_CLOCK) == LOW)\n    ;\n  \/\/ Wait for step 3:\n  while(digitalRead(KEYBOARD_CLOCK) == HIGH)\n    ;\n  \/\/ Wait for step 4:\n  while (digitalRead(KEYBOARD_CLOCK) == LOW)\n    ;\n\nfor (bit = 0;  bit &lt; 8; bit ++) {\n\n    \/\/ Wait for step F (falling edge):\n    while (digitalRead(KEYBOARD_CLOCK) == HIGH)\n      ;\n   \/\/ Read the data bit:\n   scan_code &gt;&gt;= 1;\n   if (digitalRead(KEYBOARD_DATA) == HIGH)\n    scan_code |= 0x80;\n\n    \/\/ Wait for step R (raising edge):\n    while (digitalRead(KEYBOARD_CLOCK) == LOW)\n      ;\n  }\n\n  if (key[scan_code &amp; 0x7F] != 0xFF) {\n    if (scan_code &amp; 0x80) {\n      Keyboard.release(key[scan_code &amp; 0x7F]);\n    } else {\n      Keyboard.press(key[scan_code &amp; 0x7F]);\n    }\n  }\n\/* Debug mode to show the unaffected scan code:\n   else {\n      Keyboard.println(scan_code);\n  }\n*\/\n}\n<\/pre>\n<p style=\"text-align: justify;\">Le code est tr\u00e8s simple et m\u00e9riterait d&rsquo;\u00eatre un peu \u00ab\u00a0durci\u00a0\u00bb, par exemple en ajoutant des <em>timeouts<\/em> dans les boucles d&rsquo;attente pour revenir \u00e0 l&rsquo;\u00e9tat initial en cas de d\u00e9calage dans la s\u00e9quence (signal parasite).<\/p>\n<p style=\"text-align: justify;\">Vous noterez l&rsquo;ajout d&rsquo;une fonctionnalit\u00e9 par rapport au clavier d&rsquo;origine&nbsp;: la LED int\u00e9gr\u00e9e sur la carte Teensy 3.2 impl\u00e9mente l&rsquo;affichage de l&rsquo;\u00e9tat du modificateur <em>Num Lock<\/em>. Je n&rsquo;ai pas eu le c\u0153ur de percer le capot du clavier pour la laisser appara\u00eetre, mais ce serait envisageable. Tout comme on pourrait ajouter l&rsquo;affichage de <em>Caps Lock<\/em> (voire celui de <em>Scroll Lock<\/em> mais \u00e7a n&rsquo;a aucune utilit\u00e9 de nos jours) en connectant une LED sur une sortie num\u00e9rique de la Teensy.<\/p>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\"><strong>Mon vieux clavier XT a repris place sur mon bureau&nbsp;!<\/strong><\/p>\n<p style=\"text-align: justify;\">Pas en place principale &#8211; il lui manque quelques \u00e9l\u00e9ments de confort comme le pav\u00e9 de fl\u00e8ches par exemple &#8211; mais juste \u00e0 c\u00f4t\u00e9, pour se connecter aux cartes embarqu\u00e9es que je programme. J&rsquo;en suis tr\u00e8s satisfait. J&rsquo;esp\u00e8re que ce petit hack pourra servir d&rsquo;inspiration pour reprendre en main des p\u00e9riph\u00e9riques oubli\u00e9s.<\/p>\n<p style=\"text-align: justify;\">Comme je l&rsquo;indiquais au d\u00e9but de cet article, tout a d\u00e9but\u00e9 en lisant un tweet de @hackablemag. Je suppose que <a href=\"https:\/\/twitter.com\/Lefinnois\" target=\"_blank\">mon camarade Denis<\/a> pr\u00e9pare un article sur le m\u00eame sujet pour un num\u00e9ro \u00e0 venir. J&rsquo;ai h\u00e2te de le lire&nbsp;!<\/p>\n<p style=\"text-align: justify;\"><em>Note de derni\u00e8re minute&nbsp;:<\/em> en pr\u00e9parant la mise en page de ce billet, je viens de voir passer un message de @hackablemag indiquant que l&rsquo;article en question para\u00eetra cette semaine dans le nouveau num\u00e9ro du magazine. Je vous encourage \u00e0 le lire.<\/p>","protected":false},"excerpt":{"rendered":"<p>Voici un petit hack, simple et &agrave; la port&eacute;e de tous, qui m&rsquo;a &eacute;t&eacute; inspir&eacute; par un tweet de @Hackablemag de la semaine derni&egrave;re. Il s&rsquo;agit de transformer un ancien clavier m&eacute;canique d&rsquo;IBM PC\/XT des ann&eacute;es 1980 pour pouvoir le connecter en USB sur n&rsquo;importe quel syst&egrave;me actuel. Je n&rsquo;ai pas pu r&eacute;sister &agrave; l&rsquo;envie [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,16],"tags":[],"class_list":["post-4680","post","type-post","status-publish","format-standard","hentry","category-embarque","category-microcontroleur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=4680"}],"version-history":[{"count":46,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4680\/revisions"}],"predecessor-version":[{"id":4737,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4680\/revisions\/4737"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=4680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=4680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=4680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}