{"id":4853,"date":"2017-04-01T10:10:12","date_gmt":"2017-04-01T09:10:12","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=4853"},"modified":"2017-06-05T03:19:59","modified_gmt":"2017-06-05T02:19:59","slug":"un-poisson-fantome","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2017\/04\/01\/un-poisson-fantome\/","title":{"rendered":"Un poisson fant\u00f4me"},"content":{"rendered":"<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-4873 alignright\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard-300x190.png\" alt=\"Ghost in the keyboard\" width=\"300\" height=\"190\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">En ce 1<sup>er<\/sup> avril, je vous propose un mini <em>hack<\/em> amusant, qui peut \u00eatre mis \u00e0 profit pour pi\u00e9ger des coll\u00e8gues en <em>open space<\/em> ou en salle de TP par exemple.<\/p>\n<p style=\"text-align: justify;\">Il s&rsquo;agit d&rsquo;\u00e9muler un clavier USB, et de lui faire \u00e9crire des phrases pr\u00e9programm\u00e9es pour simuler un interlocuteur fant\u00f4me cherchant \u00e0 communiquer avec nous.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai utilis\u00e9 une petite carte <a href=\"https:\/\/www.pjrc.com\/teensy\/teensyLC.html\" target=\"_blank\">Teensy LC<\/a> que l&rsquo;on programme facilement avec l&rsquo;IDE de l&rsquo;Arduino. Elle est connect\u00e9e par une rallonge USB sur le PC de notre cible (en plus du clavier original), de pr\u00e9f\u00e9rence en face arri\u00e8re, et j&rsquo;ai ajout\u00e9 sur la carte un micro interrupteur afin de s\u00e9quencer l&rsquo;envoi des phrases (le bouton pr\u00e9sent d&rsquo;origine est uniquement un <em>Reset<\/em> non utilisable pour cela).<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-LC.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4860\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-LC-300x136.png\" alt=\"Teensy LC\" width=\"300\" height=\"136\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-LC-300x136.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-LC.png 600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Le bouton est branch\u00e9 entre la masse et la GPIO 13 qui est initialis\u00e9e avec un <em>pullup<\/em> pour \u00eatre \u00e0 1 par d\u00e9faut.<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-button.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4861\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-button-300x207.png\" alt=\"Teensy Lc &amp; button\" width=\"300\" height=\"207\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-button-300x207.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/teensy-button.png 400w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Il y a de nombreux exemples livr\u00e9s avec la carte Teensy. Je me suis inspir\u00e9 de ceux d&rsquo;\u00e9mulation de clavier USB (que j&rsquo;ai trait\u00e9 \u00e9galement dans <a href=\"https:\/\/www.blaess.fr\/christophe\/2017\/02\/19\/bidouilles-et-nostalgie-usb-ifions-un-clavier-de-pcxt\/\" target=\"_blank\">cet article<\/a>). Le code programm\u00e9 dans la carte est le suivant&nbsp;:<\/p>\n<pre><a href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2017-04-01\/ghost-keyboard.ino\" target=\"_blank\"><strong>ghost-keyboard.ino:<\/strong><\/a>\n\/\/\/ ------------------------------------------------------------------------------------------\n\/\/\/ \\file ghost-keyboard\n\/\/\/\n\/\/\/ \\author 2017 Christophe BLAESS \n\/\/\/\n\/\/\/ \\license GPL\n\/\/\/ ------------------------------------------------------------------------------------------\n\n\/\/\/ \\note Remember to Select \"Keyboard\" in \"Tools-&gt; USB Type\" menu.\n\nconst char * string[] {\n    \"Helli\\bo\\n\",\n    \"are you ht\\b\\bthere?\\n\",\n    \"Is there anyone?\\n\",\n    \"Hel me\\b\\b\\bp me!\\n\",\n    \"Please\\n\",\n    \"I'm trapped into this computer!\\n\",\n    NULL\n};\n\nint string_counter = 0;\n\n#define BUTTON_PIN 13\n\nvoid setup()\n{\n  \/\/ Initialize input button with pullup resistor.\n  pinMode(BUTTON_PIN, INPUT_PULLUP);\n  digitalWrite(BUTTON_PIN, HIGH);\n  \/\/ Initialize USB keyboard.\n  Keyboard.begin();\n}\n\n\n\n\/\/ \\brief This function print the string letter-by-letter with backspace handling.\n\/\/ \nvoid print_string(const char * string)\n{\n  int i;\n  char printed_string[2];\n  \n  printed_string[1] = '\\0';\n\n  for (i = 0; string[i] != '\\0'; i++) {\n    printed_string[0] = string[i];\n    \n    if (printed_string[0] == '\\b') {\n      \/\/ Replace \\b sequences by simulated press on Backspace key.\n      Keyboard.press(KEY_BACKSPACE);\n      Keyboard.release(KEY_BACKSPACE);\n    } else if (printed_string[0] == '\\n') {\n      \/\/ Replace \\n sequences by simulated press on Enter.\n      Keyboard.press(KEY_ENTER);\n      Keyboard.release(KEY_ENTER);\n    } else {\n      Keyboard.print(printed_string);\n    }\n    \/\/ Humanize with a small random delay.\n    delay(50 + rand()%200);\n  }\n}\n\n\nvoid loop()\n{\n  \/\/ Wait for a button press.\n  while(digitalRead(BUTTON_PIN) == HIGH)\n    ;\n  while(digitalRead(BUTTON_PIN) == LOW)\n    ;\n  \/\/ Display the next string.\n  print_string(string[string_counter]);\n  string_counter ++;\n  \n  if (string[string_counter] == NULL)\n    string_counter = 0;\n}<\/pre>\n<p style=\"text-align: justify;\">Quelques points peuvent \u00eatre not\u00e9s \u00e0 propos de ce programme&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">Les s\u00e9quences de caract\u00e8res <code>'\\b'<\/code> et <code>'\\n'<\/code> sont interpr\u00e9t\u00e9es correctement en simulant respectivement un appui sur les touches <em>Backspace<\/em> et <em>Enter<\/em>. La premi\u00e8re est int\u00e9ressante pour humaniser la saisie, en simulant des fautes de frappes que l&rsquo;on vient corriger. On pourrait aller plus loin en simulant des d\u00e9placements de curseur (comme les touches fl\u00e9ch\u00e9es) par exemple<\/li>\n<li style=\"text-align: justify;\">Le d\u00e9lai al\u00e9atoire entre les touches ajoute au r\u00e9alisme de la saisie en \u00e9vitant un c\u00f4t\u00e9 trop m\u00e9canique<\/li>\n<li style=\"text-align: justify;\">Une fois la liste de phrases enti\u00e8rement affich\u00e9e, j&rsquo;ai choisi de reboucler en revenant \u00e0 la premi\u00e8re. On pourrait pr\u00e9f\u00e9rer s&rsquo;arr\u00eater d\u00e9finitivement (jusqu&rsquo;au <em>Reset<\/em> de la carte Teensy).<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Bien s\u00fbr la liste de phrases peut \u00eatre allong\u00e9e sensiblement, en simulant un personnage implorant, puis col\u00e9reux, agressif, etc.<\/p>\n<p style=\"text-align: justify;\">Cliquez sur l&rsquo;image ci-dessous pour voir un exemple d&rsquo;ex\u00e9cution sur un ordinateur sous Windows (notez que ce dernier affiche un message lors de la d\u00e9couverte du nouveau \u00ab\u00a0clavier\u00a0\u00bb USB, ce qui peut g\u00e2cher l&rsquo;effet de surprise). Rien n&rsquo;est saisi au clavier, je presse simplement le bouton de la Teensy de temps \u00e0 autre pour passer \u00e0 la phrase suivante.<\/p>\n<p><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard-1.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4870\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard-1-300x238.gif\" alt=\"\" width=\"300\" height=\"238\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard-1-300x238.gif 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2017\/04\/ghost-keyboard-1-768x609.gif 768w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Enfin, il y a une piste que je n&rsquo;ai pas explor\u00e9e mais que mon fils m&rsquo;a sugg\u00e9r\u00e9e&nbsp;: prendre en charge la touche <em>Windows<\/em> pour d\u00e9clencher des actions sur le syst\u00e8me (lancement d&rsquo;applications, recherches dans l&rsquo;historique, etc.) ce qui peut d&rsquo;ailleurs conduire \u00e0 des plaisanteries de fort mauvais go\u00fbt.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\">Bon 1<sup>er<\/sup> Avril \u00e0 tous\u00a0!<\/p>","protected":false},"excerpt":{"rendered":"<p>En ce 1er avril, je vous propose un mini hack amusant, qui peut &ecirc;tre mis &agrave; profit pour pi&eacute;ger des coll&egrave;gues en open space ou en salle de TP par exemple. Il s&rsquo;agit d&rsquo;&eacute;muler un clavier USB, et de lui faire &eacute;crire des phrases pr&eacute;programm&eacute;es pour simuler un interlocuteur fant&ocirc;me cherchant &agrave; communiquer avec nous.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5,16],"tags":[],"class_list":["post-4853","post","type-post","status-publish","format-standard","hentry","category-actualite","category-embarque","category-microcontroleur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4853","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=4853"}],"version-history":[{"count":18,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4853\/revisions"}],"predecessor-version":[{"id":4877,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4853\/revisions\/4877"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=4853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=4853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=4853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}