{"id":4571,"date":"2016-12-26T10:33:29","date_gmt":"2016-12-26T09:33:29","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=4571"},"modified":"2016-12-26T14:05:47","modified_gmt":"2016-12-26T13:05:47","slug":"projet-nunmouse","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2016\/12\/26\/projet-nunmouse\/","title":{"rendered":"Projet Nunmouse"},"content":{"rendered":"<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/nunmouse.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-4580\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/nunmouse-300x185.png\" alt=\"Nunchuck mouse\" width=\"300\" height=\"185\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/nunmouse-300x185.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/nunmouse-768x473.png 768w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/nunmouse.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Un de mes proches est atteint d&rsquo;une <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Scl%C3%A9rose_lat%C3%A9rale_amyotrophique\" target=\"_blank\">maladie grave et cruelle<\/a> qui lui rend peu \u00e0 peu les mouvements des membres inf\u00e9rieurs puis sup\u00e9rieurs p\u00e9nibles voire impossibles. J&rsquo;ai r\u00e9alis\u00e9 pour lui un petit <em>hack<\/em> afin de simplifier l&rsquo;usage de la souris de son ordinateur.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p>L&rsquo;id\u00e9e m&rsquo;en est venue il y a d\u00e9j\u00e0 plusieurs mois, alors que je r\u00e9digeais un article pour le num\u00e9ro <a href=\"https:\/\/boutique.ed-diamond.com\/anciens-numeros\/789-gnulinux-magazine-hs-75.html\" target=\"_blank\">Hors S\u00e9rie 75 de Linux Magazine<\/a> dans lequel je pr\u00e9sentais les communications en i\u00b2c avec le Raspberry Pi. En illustration de cet article, j&rsquo;avais indiqu\u00e9 que l&rsquo;on peut facilement lire la position du joystick, l&rsquo;\u00e9tat des boutons et les valeurs renvoy\u00e9es par l&rsquo;acc\u00e9l\u00e9rom\u00e8tre du <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Wii#Manette\" target=\"_blank\"><strong>Nunchuck<\/strong> de la console Wii<\/a>. J&rsquo;avais alors not\u00e9 l&rsquo;aspect particuli\u00e8rement ergonomique de cette poign\u00e9e, et je me suis dit qu&rsquo;elle pourrait avantageusement remplacer une souris. \u00c0 cette \u00e9poque, la maladie \u00e9tant moins avanc\u00e9e, je n&rsquo;ai pas mis en \u0153uvre tout de suite ma r\u00e9alisation.<\/p>\n<p>Pour transformer un Nunchuck en souris, il faut tout d&rsquo;abord disposer d&rsquo;un syst\u00e8me capable de se comporter en <strong>p\u00e9riph\u00e9rique USB<\/strong> et apte \u00e0 <strong>simuler une souris<\/strong>. Exit donc le Raspberry Pi qui ne dispose que d&rsquo;un port USB h\u00f4te, et pas de port USB p\u00e9riph\u00e9rique. J&rsquo;avais envisag\u00e9 un moment d&rsquo;utiliser une BeagleBone Black, mais celle-ci \u00e9tait un peu encombrante pour mon projet.<\/p>\n<p>Je me suis donc tourn\u00e9 vers une petite carte <strong>Teensy 3.2<\/strong>. Il s&rsquo;agit d&rsquo;une carte \u00e0 microcontr\u00f4leur aux dimensions r\u00e9duites (1,8 x 3,6 cm) et proposant de nombreuses entr\u00e9es-sorties&nbsp;: 24 GPIO, 10 entr\u00e9es analogiques, 10 PWM, des ports s\u00e9rie, i\u00b2c, CAN, SPI, etc. En outre, elle poss\u00e8de un petit port mini-USB device, qui permet de la programmer et \u00e0 travers lequel elle peut \u00e9muler un clavier, une souris, un joystick, un terminal s\u00e9rie, et m\u00eame des commandes pour simulateur de vol&nbsp;!<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/Teensy-3.2-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-4587 alignright\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/Teensy-3.2-2-300x141.png\" alt=\"Teensy-3.2\" width=\"300\" height=\"141\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/Teensy-3.2-2-300x141.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/Teensy-3.2-2.png 442w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>La version que j&rsquo;ai utilis\u00e9e (Teensy 3.2) est construite autour d&rsquo;un microcontr\u00f4leur Freescale K20 fonctionnant \u00e0 72MHz avec 256K de m\u00e9moire flash pour accueillir le programme et 64K de m\u00e9moire ram pour son ex\u00e9cution. Il existe d&rsquo;autres variantes plus \u00e9conomiques qui auraient probablement suffi pour ce projet.<\/p>\n<p>Plusieurs fournisseurs proposent ces cartes. Le site de r\u00e9f\u00e9rence est celui de <strong>P<\/strong>aul <strong>J<\/strong>. Stoffregen &amp; <strong>R<\/strong>obin <strong>C<\/strong>. Coon&nbsp;: <a href=\"https:\/\/www.pjrc.com\/teensy\/\" target=\"_blank\">PJRC<\/a> mais on les trouve chez diff\u00e9rents distributeurs comme <a href=\"https:\/\/www.sparkfun.com\/products\/13736\" target=\"_blank\">Sparkfun<\/a> ou <a href=\"https:\/\/www.adafruit.com\/products\/2756\" target=\"_blank\">Adafruit<\/a>. Pour limiter les frais de port et de douanes, je pr\u00e9f\u00e8re un distributeur situ\u00e9 en France&nbsp;: <a href=\"http:\/\/snootlab.com\/lang-en\/43-pjrc-teensy\" target=\"_blank\">Snootlab<\/a>.<\/p>\n<p>La programmation de la Teensy peut se faire de diff\u00e9rentes fa\u00e7ons, la plus simple \u00e0 mettre en \u0153uvre utilise directement l&rsquo;<strong>environnement de d\u00e9veloppement de l&rsquo;Arduino<\/strong> (avec lequel elle offre une certaine compatibilit\u00e9). Le programme s&rsquo;\u00e9crit en C avec les m\u00eames conventions que l&rsquo;Arduino (fonctions <code>setup()<\/code> et <code>loop()<\/code>, lien automatique des biblioth\u00e8ques de fonctions n\u00e9cessaires, etc.). Le seul d\u00e9faut est que le <em>plug-in<\/em> Teensyduino ne fonctionne qu&rsquo;avec certaines versions de l&rsquo;IDE Arduino.cc et qu&rsquo;il est n\u00e9cessaire de chercher <a href=\"https:\/\/www.arduino.cc\/en\/Main\/OldSoftwareReleases\" target=\"_blank\">dans ses anciennes versions<\/a> pour en trouver une ad\u00e9quate.<\/p>\n<p>Lors de l&rsquo;installation du <em>plug-in<\/em>, de tr\u00e8s nombreux exemples sont ajout\u00e9s, permettant de prendre en main tr\u00e8s facilement l&rsquo;\u00e9mulation USB de souris, clavier, etc. et l&rsquo;utilisation des diff\u00e9rentes entr\u00e9es-sorties (GPIO , s\u00e9rie, i\u00b2c, SPI&#8230;)<\/p>\n<p>Ma premi\u00e8re approche consistait \u00e0 relier la carte Teensy au <strong>connecteur i\u00b2c<\/strong> \u00e0 l&rsquo;extr\u00e9mit\u00e9 du c\u00e2ble du Nunchuck, et \u00e0 simuler une souris avec les mouvements lus. N\u00e9anmoins, le fonctionnement ne me satisfaisait pas, les mouvements de la souris \u00e9taient trop saccad\u00e9s, et la communication i\u00b2c ne semblait pas tr\u00e8s fiable, j&rsquo;avais m\u00eame \u00e9t\u00e9 oblig\u00e9 d&rsquo;int\u00e9grer un syst\u00e8me de <em>reset<\/em> automatique lorsque la Teensy ne recevait plus de donn\u00e9es en coupant temporairement l&rsquo;alimentation du Nunchuck pour le r\u00e9initialiser.<\/p>\n<p>Je me suis donc orient\u00e9 vers une seconde approche, consistant \u00e0 ouvrir le Nunchuck, \u00e0 couper le c\u00e2ble original et \u00e0 venir <strong>relier directement<\/strong> les broches de la Teensy avec les points milieux des potentiom\u00e8tres X et Y du joystick, et avec les contacts des boutons. Ainsi, la partie \u00e9lectronique du Nunchuck n&rsquo;est plus utilis\u00e9e (je l&rsquo;ai laiss\u00e9e n\u00e9anmoins en place pour que le PCB serve de support et alimente les potentiom\u00e8tres correctement). J&rsquo;ai sciemment renonc\u00e9 \u00e0 utiliser les informations de l&rsquo;acc\u00e9l\u00e9rom\u00e8tre int\u00e9gr\u00e9 dans le Nunchuck (qui \u00e9tait disponibles sur le port i\u00b2c), car elles n&rsquo;avaient pas d&rsquo;int\u00e9r\u00eat pour mon application.<\/p>\n<p>J&rsquo;ai ensuite ins\u00e9r\u00e9 la carte Teensy directement \u00e0 l&rsquo;int\u00e9rieur du Nunchuck en sacrifiant un support de vis pour lib\u00e9rer de la place. Apr\u00e8s l&rsquo;avoir referm\u00e9 soigneusement et reviss\u00e9 l&rsquo;unique vis restante (dont la t\u00eate poss\u00e8de une accroche triangulaire particuli\u00e8rement aga\u00e7ante quand on n&rsquo;a pas le tournevis adapt\u00e9), j&rsquo;ai r\u00e9alis\u00e9 que j&rsquo;avais oubli\u00e9 de photographier l&rsquo;int\u00e9rieur du montage. Je ne peux donc vous offrir que le sch\u00e9ma ci-dessous pour repr\u00e9senter les connexions que j&rsquo;ai r\u00e9alis\u00e9es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4575\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/connexions.png\" alt=\"Connexions Nunchuck Teensy\" width=\"511\" height=\"379\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/connexions.png 511w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2016\/12\/connexions-300x223.png 300w\" sizes=\"auto, (max-width: 511px) 100vw, 511px\" \/><\/p>\n<p>Sur les connecteurs des boutons et des potentiom\u00e8tres, j&rsquo;ai r\u00e9alis\u00e9 des soudures par-dessus les points existants, sans couper les fils. Pour le connecteur i\u00b2c en revanche, j&rsquo;ai coup\u00e9 le c\u00e2ble original et soud\u00e9 les deux fils d&rsquo;alimentation \u00e0 sa place.<\/p>\n<p>Avant de refermer le Nunchuck, j&rsquo;ai perc\u00e9 un petit trou, visible sur la photo, qui me permet de <strong>reprogrammer in-situ<\/strong> la carte Teensy en appuyant avec une pointe de trombone. En effet, une fois lanc\u00e9 l&rsquo;IDE de l&rsquo;Arduino en mode \u00ab\u00a0upload\u00a0\u00bb, il suffit d&rsquo;appuyer sur le petit switch pour programmer le micro-contr\u00f4leur. Je peux ainsi l&rsquo;adapter aux pr\u00e9f\u00e9rences de l&rsquo;utilisateur en modifiant mon logiciel.<\/p>\n<p>Le programme est disponible ci-dessous mais \u00e9galement sur GitHub \u00e0 l&rsquo;adresse <a href=\"https:\/\/github.com\/cpb-\/Nunmouse\" target=\"_blank\">https:\/\/github.com\/cpb-\/Nunmouse<\/a>.<\/p>\n<pre><strong>Nunmouse.ino:<\/strong>\n\/\/\/ ------------------------------------------------------------------------------------------\n\/\/\/ \\file Nunmouse - Teensy program to use a modified Nunchuck as a mouse.\n\/\/\/\n\/\/\/ \\author 2016 Christophe BLAESS &lt;christophe at blaess dot fr&gt;\n\/\/\/\n\/\/\/ \\license GPL\n\/\/\/ ------------------------------------------------------------------------------------------\n\n\/\/ Remember to Select \"Mouse\" in \"Tools-&gt; USB Type\" menu.\n\n\n\/\/ The nunchuck is powered up by the D17 output of the Teensy card.\n#define POWER_UP_PIN  17\n\n\/\/ The Button 1 (Z) is connected to the D20 input of the Teensy.\n#define BUTTON_1_PIN  20\n\n\/\/ The Button 2 (C) is connected to the D21 input of the Teensy.\n#define BUTTON_2_PIN  21\n\n\/\/ The central pin of the lateral potentiometer is connected to the A5 input of the Teensy.\n#define POSITION_X_INPUT  5\n\n\/\/ The central pin of the axial potentiometer is connected to the A4 input of the Teensy.\n#define POSITION_Y_INPUT  4\n\n\/\/ The delay between two measures in millisec.\n#define LOOP_DELAY    15\n\n\/\/ The tolerance around the rest position.\n#define REST_POSITION_TOLERANCE  5\n\n\n\/\/\/ \\brief Power up the nunchuck and configure the digital I\/O used to read the buttons.\n\/\/\/\nstatic void <strong>nunchuck_init<\/strong>(void)\n{\n  \/\/ Digital output for the Nunchuck Vcc.\n  pinMode(POWER_UP_PIN, OUTPUT);\n  digitalWrite(POWER_UP_PIN, HIGH);\n\n  \/\/ Digital input for the Button 1\n  pinMode(BUTTON_1_PIN, INPUT);\n\n  \/\/ Digital input  for the Button 2\n  pinMode(BUTTON_2_PIN, INPUT);\n\n  delay(100);\n}\n\n\n\/\/\/ \\brief Read the position of the joystick and the status of the buttons.\n\/\/\/\n\/\/\/ \\param joystick_x: a pointer that (if not NULL) will be filled the X position of the joystick.\n\/\/\/ \\param joystick_y: a pointer that (if not NULL) will be filled the Y position of the joystick.\n\/\/\/ \\param button_1: a pointer that (if not NULL) will be filled the status of the upper button.\n\/\/\/ \\param button_2: a pointer that (if not NULL) will be filled the status of the lower button.\n\/\/\/\nstatic void <strong>nunchuck_read_status<\/strong>(int *joystick_x, int *joystick_y, int * button_1, int *button_2)\n{\n  if (joystick_x != NULL)\n    (*joystick_x) = analogRead(POSITION_X_INPUT);\n\n  if (joystick_y != NULL)\n    (*joystick_y) = analogRead(POSITION_Y_INPUT);\n  if (button_1 != NULL)\n    (*button_1) = (digitalRead(BUTTON_1_PIN) == 0);\n\n  if (button_2 != NULL)\n    (*button_2) = (digitalRead(BUTTON_2_PIN) == 0);\n}\n\n\n\n\/\/ With NUNMOUSE_DEBUG defined, The teensy acts no more as a mouse but as a serial\n\/\/ port, and displays the values.\n\/\/ Remember to Select \"Serial\" in \"Tools-&gt; USB Type\" menu.\n\/\/\n\/\/#define NUNMOUSE_DEBUG\n\n\/\/ The rest position of the joystick (position at power up).\nstatic int rest_x;\nstatic int rest_y;\n\n\/\/ The maximal and minimal positions of the joystick.\nstatic int max_x;\nstatic int max_y;\n\nstatic int min_x;\nstatic int min_y;\n\n\n\n\/\/\/ \\brief Initialization of the microcontroler program.\n\/\/\/\nvoid <strong>setup<\/strong>()\n{\n  #ifdef NUNMOUSE_DEBUG\n    Serial.begin(115200);\n  #endif\n\n  nunchuck_init();\n  nunchuck_read_status(&amp;rest_x, &amp;rest_y, NULL, NULL);\n  delay(100);\n  nunchuck_read_status(&amp;rest_x, &amp;rest_y, NULL, NULL);\n\n  max_x = rest_x + 1;\n  min_x = rest_x - 1;\n  max_y = rest_y + 1;\n  min_y = rest_y - 1;\n}\n\n\n\n\/\/\/ \\brief Main microcontroler loop.\n\/\/\/\nvoid <strong>loop<\/strong>()\n{\n  static int counter = 0;\n\n  static int x = 0;\n  static int y = 0;\n  static int button_1 = 0;\n  static int button_2 = 0;\n  static int prev_button_1 = 0;\n  static int prev_button_2 = 0;\n\n  int x_mouse = 0;\n  int y_mouse = 0;\n\n  \/\/ The counter is used only in debug mode to see lines scrolling.\n  counter ++;\n  counter %= 1024;\n\n  nunchuck_read_status(&amp;x, &amp;y, &amp;button_1, &amp;button_2);\n\n  if (x &lt; min_x) min_x = x; if (x &gt; max_x)\n    max_x = x;\n  if (y &lt; min_y) min_y = y; if (y &gt; max_y)\n    max_y = y;\n\n  \/\/ Small tolerance around the rest position.\n  if (abs(x_mouse-rest_x) &lt; REST_POSITION_TOLERANCE)\n    x_mouse = rest_x;\n  if (abs(y_mouse-rest_y) &lt; REST_POSITION_TOLERANCE)\n    y_mouse = rest_y;\n\n\n  \/\/ Let the values be in [-4, 4]:\n\n  x_mouse = (x - rest_x);\n  x_mouse = x_mouse * 4;\n  if (x_mouse &gt; 0) {\n    x_mouse = x_mouse \/ (max_x - rest_x);\n  } else {\n    x_mouse = x_mouse \/ (rest_x - min_x);\n  }\n\n  y_mouse = (y - rest_y);\n  y_mouse = y_mouse * 4;\n  if (y_mouse &gt; 0) {\n    y_mouse = y_mouse \/ (max_y - rest_y);\n  } else {\n    y_mouse = y_mouse \/ (rest_y - min_y);\n  }\n\n  \/\/ x2 transformation to have a kind of acceleration when the stick is fully inclinated.\n  x_mouse = x_mouse * abs(x_mouse);\n  y_mouse = y_mouse * abs(y_mouse);\n\n  \/\/ Vertical screen coordinates are turned downward.\n  y_mouse = -y_mouse;\n\n  #ifdef NUNMOUSE_DEBUG\n    if ((counter % 4) == 0) {\n      Serial.printf(\"%3d Joystick=(%3d, %3d) Initial=(%3d, %3d) Mouse=(%2d, %2d) BT1=%d BT2=%d\\n\",\n                    counter,\n                    x, y,\n                    rest_x, rest_y,\n                    x_mouse, y_mouse,\n                    button_1, button_2);\n    }\n  #else\n\n   \/\/ Send a message only if the joystick has moved.\n    if ((abs(x_mouse) &gt;= 1) || (abs(y_mouse) &gt;= 1)) {\n      Mouse.move(x_mouse, y_mouse);\n    }\n    \/\/ Send a message button if something changed.\n    if ((button_1 != prev_button_1) || (button_2 != prev_button_2)) {\n      Mouse.set_buttons(button_1, 0, button_2);\n      prev_button_1 = button_1;\n      prev_button_2 = button_2;\n    }\n  #endif\n\n  delay(LOOP_DELAY);\n}\n<\/pre>\n<p>On remarquera que l&rsquo;alimentation du circuit du Nunchuck est contr\u00f4l\u00e9e par une GPIO de la Teensy, c&rsquo;est un reste de la phase o\u00f9 j&rsquo;utilisais le protocole i\u00b2c et o\u00f9 je souhaitais pouvoir r\u00e9initialiser le contr\u00f4leur. On pourrait tr\u00e8s bien l&rsquo;alimenter directement sur le connecteur 3.3V de la Teensy.<\/p>\n<p>Ce petit projet m&rsquo;a permis de d\u00e9couvrir plus en d\u00e9tail la carte Teensy qui s&rsquo;av\u00e8re fort sympathique et tr\u00e8s simple d&rsquo;usage. Il n&rsquo;est pas si courant de pouvoir \u00e9muler des p\u00e9riph\u00e9riques USB ais\u00e9ment, c&rsquo;est pourtant un atout important pour certains projets d&rsquo;informatique embarqu\u00e9e.<\/p>\n<p>L&rsquo;\u00e9mulation de souris r\u00e9alis\u00e9e ici est satisfaisante, la gestion du joystick pourra probablement \u00eatre am\u00e9lior\u00e9e \u00e0 l&rsquo;usage en modifiant l\u00e9g\u00e8rement le programme. Pour que l&rsquo;\u00e9mulation soit parfaite, il manque n\u00e9anmoins un contr\u00f4le&nbsp;: la molette centrale est absente. Si le besoin s&rsquo;en fait sentir, je r\u00e9fl\u00e9chirai \u00e0 un moyen de la remplacer par un mouvement sp\u00e9cifique du joystick par exemple.<\/p>","protected":false},"excerpt":{"rendered":"<p>Un de mes proches est atteint d&rsquo;une maladie grave et cruelle qui lui rend peu &agrave; peu les mouvements des membres inf&eacute;rieurs puis sup&eacute;rieurs p&eacute;nibles voire impossibles. J&rsquo;ai r&eacute;alis&eacute; pour lui un petit hack afin de simplifier l&rsquo;usage de la souris de son ordinateur.<\/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-4571","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\/4571","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=4571"}],"version-history":[{"count":19,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4571\/revisions"}],"predecessor-version":[{"id":4596,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4571\/revisions\/4596"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=4571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=4571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=4571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}