{"id":3862,"date":"2018-06-28T10:17:00","date_gmt":"2018-06-28T09:17:00","guid":{"rendered":"https:\/\/telefab.fr\/?p=3862"},"modified":"2026-04-30T17:33:59","modified_gmt":"2026-04-30T15:33:59","slug":"realisation-dune-brodeuse-numerique-a-partir-dune-machine-a-coudre","status":"publish","type":"projet","link":"https:\/\/hub.imt-atlantique.fr\/fablab\/projet\/realisation-dune-brodeuse-numerique-a-partir-dune-machine-a-coudre\/","title":{"rendered":"R\u00e9alisation d&rsquo;une brodeuse num\u00e9rique \u00e0 partir d&rsquo;une machine \u00e0 coudre"},"content":{"rendered":"<p style=\"text-align: left;\">Le but de ce projet est de cr\u00e9er un module sur une machine \u00e0 coudre afin de la transformer en brodeuse num\u00e9rique. Ce module peut s\u2019ajouter et s\u2019enlever de la machine afin qu\u2019elle puisse garder sa fonction premi\u00e8re. Notre travail a donc premi\u00e8rement \u00e9t\u00e9 de construire la partie physique du module.<\/p>\n<figure id=\"attachment_3864\" aria-describedby=\"caption-attachment-3864\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2018\/06\/photofinaledecoupee.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3864 size-medium\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2018\/06\/photofinaledecoupee-300x169.jpg\" alt=\"\" width=\"300\" height=\"169\" \/><\/a><figcaption id=\"caption-attachment-3864\" class=\"wp-caption-text\">figure 1 : module final<\/figcaption><\/figure>\n<p>Le tambour, qui permet de tendre le tissu \u00e0 broder, est reli\u00e9 \u00e0 un rail dent\u00e9. Celui-ci est entra\u00een\u00e9 en translation par un moteur reli\u00e9 \u00e0 un pignon. Les trois autres pignons permettent au rail de tenir sa trajectoire. Les pignons et le rail reposent sur une plateforme en bois qui est la partie sup\u00e9rieure d&rsquo;un bo\u00eetier.<\/p>\n<figure id=\"attachment_3868\" aria-describedby=\"caption-attachment-3868\" style=\"width: 146px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2018\/06\/mecanisme-final.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3868 size-medium\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2018\/06\/mecanisme-final-146x300.png\" alt=\"\" width=\"146\" height=\"300\" \/><\/a><figcaption id=\"caption-attachment-3868\" class=\"wp-caption-text\">figure 2 : bo\u00eetier et tiges m\u00e9talliques<\/figcaption><\/figure>\n<p>Deux tiges m\u00e9talliques passant dans des roulements \u00e0 billes traversent ce bo\u00eetier. Une courroie est reli\u00e9e au moteur et permet le d\u00e9placement selon la direction perpendiculaire \u00e0 celle du rail dent\u00e9. Ce syst\u00e8me est contraint \u00e0 beaucoup moins de frottement que celui \u00e0 base de rouages et d&rsquo;une cr\u00e9maill\u00e8re en bois, il est donc plus facile pour le moteur d\u2019entra\u00eener le bo\u00eetier. Le bo\u00eetier abrite la carte Arduino qui est reli\u00e9e aux moteurs.<\/p>\n<p>La seconde partie du projet a \u00e9t\u00e9 de convertir une image num\u00e9rique en commandes pour les moteurs. Nous avons tout d&rsquo;abord t\u00e9l\u00e9vers\u00e9 sur la carte Arduino un code qui permet d&rsquo;interpr\u00e9ter un G-code, et donc de transformer ce Gcode en commande de rotation des moteurs. Ce code est commun \u00e0 n&rsquo;importe quel motif \u00e0 broder. Il nous a alors fallu convertir le motif \u00e0 broder en G-code et envoyer ce code \u00e0 la carte Arduino. Nous pouvons faire cette conversion \u00e0 l&rsquo;aide du logiciel Inkscape. Pour ce faire, un certain nombre d\u2019\u00e9tapes sont \u00e0 suivre :<\/p>\n<ol>\n<li>Il faut effectuer une sym\u00e9trie centrale sur l&rsquo;image du motif \u00e0 broder, car le G-code obtenu est celui dans le cas o\u00f9 l&rsquo;aiguille de la machine \u00e0 coudre se d\u00e9place, or dans notre cas c&rsquo;est le module qui se d\u00e9place tandis que l&rsquo;aiguille garde une position fixe.<\/li>\n<li>Il faut choisir des \u00ab Points d\u2019orientation \u00bb, c\u2019est-\u00e0-dire fixer un rep\u00e8re sur l\u2019image afin de s\u2019assurer que les d\u00e9placements vont s\u2019effectuer dans le sens voulu et \u00e0 partir du point de d\u00e9part voulu. Ils servent aussi \u00e0 g\u00e9rer les diff\u00e9rentes transformations de l\u2019image (sym\u00e9trie, translations, etc&#8230;).<\/li>\n<li>Une fois cette \u00e9tape r\u00e9alis\u00e9e, Inkscape poss\u00e8de l\u2019outil \u00ab Objet en chemin \u00bb qui permet \u00a0de pr\u00e9parer l\u2019utilisation de Gcodetools en posant le chemin \u00e0 suivre.<\/li>\n<li>Enfin il faut utiliser \u00ab Chemins vers G-code \u00bb qui convertit effectivement le chemin calcul\u00e9 en la suite de commandes voulues. Des fl\u00e8ches indiquent le chemin trac\u00e9.<\/li>\n<\/ol>\n<p>Un logiciel permet ensuite d&rsquo;envoyer le fichier vers la carte Arduino, et les moteurs r\u00e9agissent instantan\u00e9ment aux commandes re\u00e7ues.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: right;\">Elodie Derringer, Charles Rivi\u00e8re et Alexandre Ly<\/p>\n<p>&nbsp;<\/p>\n<p>[learn_more caption=\u00a0\u00bbCode t\u00e9l\u00e9vers\u00e9 sur la carte Arduino\u00a0\u00bb]<\/p>\n<p>[cpp]<br \/>\n#code pour une d\u00e9coupeuse laser, l&#039;axe z ne sert \u00e0 rien.<\/p>\n<p>#include &lt;Servo.h&gt;<br \/>\n#include &lt;AFMotor.h&gt;<\/p>\n<p>#define LINE_BUFFER_LENGTH 512<\/p>\n<p>char STEP = MICROSTEP ;<\/p>\n<p>\/\/ Servo position for Up and Down<br \/>\nconst int penZUp = 115;<br \/>\nconst int penZDown = 83;<\/p>\n<p>\/\/ Servo on PWM pin 10<br \/>\nconst int penServoPin =10 ;<\/p>\n<p>\/\/ Should be right for DVD steppers, but is not too important here<br \/>\nconst int stepsPerRevolution = 200;<\/p>\n<p>\/\/ create servo object to control a servo<br \/>\nServo penServo;<\/p>\n<p>\/\/ Initialize steppers for X- and Y-axis using this Arduino pins for the L293D H-bridge<br \/>\nAF_Stepper myStepperY(stepsPerRevolution,2);<br \/>\nAF_Stepper myStepperX(stepsPerRevolution,1);<\/p>\n<p>\/* Structures, global variables *\/<br \/>\nstruct point {<br \/>\nfloat x;<br \/>\nfloat y;<br \/>\nfloat z;<br \/>\n};<\/p>\n<p>\/\/ Current position of plothead<br \/>\nstruct point actuatorPos;<\/p>\n<p>\/\/ Drawing settings, should be OK<br \/>\nfloat StepInc = 1;<br \/>\nint StepDelay = 0;<br \/>\nint LineDelay =0;<br \/>\nint penDelay = 50;<\/p>\n<p>\/\/ Motor steps to go 1 millimeter.<br \/>\n\/\/ Use test sketch to go 100 steps. Measure the length of line.<br \/>\n\/\/ Calculate steps per mm. Enter here.<br \/>\nfloat StepsPerMillimeterX = 100.0;<br \/>\nfloat StepsPerMillimeterY = 100.0;<\/p>\n<p>\/\/ Drawing robot limits, in mm<br \/>\n\/\/ OK to start with. Could go up to 50 mm if calibrated well.<br \/>\nfloat Xmin = 0;<br \/>\nfloat Xmax = 40;<br \/>\nfloat Ymin = 0;<br \/>\nfloat Ymax = 40;<br \/>\nfloat Zmin = 0;<br \/>\nfloat Zmax = 1;<\/p>\n<p>float Xpos = Xmin;<br \/>\nfloat Ypos = Ymin;<br \/>\nfloat Zpos = Zmax;<\/p>\n<p>\/\/ Set to true to get debug output.<br \/>\nboolean verbose = false;<\/p>\n<p>\/\/ Needs to interpret<br \/>\n\/\/ G1 for moving<br \/>\n\/\/ G4 P300 (wait 150ms)<br \/>\n\/\/ M300 S30 (pen down)<br \/>\n\/\/ M300 S50 (pen up)<br \/>\n\/\/ Discard anything with a (<br \/>\n\/\/ Discard any other command!<\/p>\n<p>\/**********************<br \/>\n* void setup() &#8211; Initialisations<br \/>\n***********************\/<br \/>\nvoid setup() {<br \/>\n\/\/ Setup<\/p>\n<p>Serial.begin( 9600 );<\/p>\n<p>penServo.attach(penServoPin);<br \/>\npenServo.write(penZUp);<br \/>\ndelay(100);<\/p>\n<p>\/\/ Decrease if necessary<br \/>\nmyStepperX.setSpeed(1000);<\/p>\n<p>myStepperY.setSpeed(1000);<\/p>\n<p>\/\/ Set &amp; move to initial default position<br \/>\n\/\/ TBD<\/p>\n<p>\/\/ Notifications!!!<br \/>\nSerial.println(&quot;Mini CNC Plotter alive and kicking!&quot;);<br \/>\nSerial.print(&quot;X range is from &quot;);<br \/>\nSerial.print(Xmin);<br \/>\nSerial.print(&quot; to &quot;);<br \/>\nSerial.print(Xmax);<br \/>\nSerial.println(&quot; mm.&quot;);<br \/>\nSerial.print(&quot;Y range is from &quot;);<br \/>\nSerial.print(Ymin);<br \/>\nSerial.print(&quot; to &quot;);<br \/>\nSerial.print(Ymax);<br \/>\nSerial.println(&quot; mm.&quot;);<br \/>\n}<\/p>\n<p>\/**********************<br \/>\n* void loop() &#8211; Main loop<br \/>\n***********************\/<br \/>\nvoid loop()<br \/>\n{<\/p>\n<p>delay(100);<br \/>\nchar line[ LINE_BUFFER_LENGTH ];<br \/>\nchar c;<br \/>\nint lineIndex;<br \/>\nbool lineIsComment, lineSemiColon;<\/p>\n<p>lineIndex = 0;<br \/>\nlineSemiColon = false;<br \/>\nlineIsComment = false;<\/p>\n<p>while (1) {<\/p>\n<p>\/\/ Serial reception &#8211; Mostly from Grbl, added semicolon support<br \/>\nwhile ( Serial.available()&gt;0 ) {<br \/>\nc = Serial.read();<br \/>\nif (( c == &#039;\\n&#039;) || (c == &#039;\\r&#039;) ) { \/\/ End of line reached<br \/>\nif ( lineIndex &gt; 0 ) { \/\/ Line is complete. Then execute!<br \/>\nline[ lineIndex ] = &#039;&#92;&#48;&#039;; \/\/ Terminate string<br \/>\nif (verbose) {<br \/>\nSerial.print( &quot;Received : &quot;);<br \/>\nSerial.println( line );<br \/>\n}<br \/>\nprocessIncomingLine( line, lineIndex );<br \/>\nlineIndex = 0;<br \/>\n}<br \/>\nelse {<br \/>\n\/\/ Empty or comment line. Skip block.<br \/>\n}<br \/>\nlineIsComment = false;<br \/>\nlineSemiColon = false;<br \/>\nSerial.println(&quot;ok&quot;);<br \/>\n}<br \/>\nelse {<br \/>\nif ( (lineIsComment) || (lineSemiColon) ) { \/\/ Throw away all comment characters<br \/>\nif ( c == &#039;)&#039; ) lineIsComment = false; \/\/ End of comment. Resume line.<br \/>\n}<br \/>\nelse {<br \/>\nif ( c &lt;= &#039; &#039; ) { \/\/ Throw away whitepace and control characters<br \/>\n}<br \/>\nelse if ( c == &#039;\/&#039; ) { \/\/ Block delete not supported. Ignore character.<br \/>\n}<br \/>\nelse if ( c == &#039;(&#039; ) { \/\/ Enable comments flag and ignore all characters until &#039;)&#039; or EOL.<br \/>\nlineIsComment = true;<br \/>\n}<br \/>\nelse if ( c == &#039;;&#039; ) {<br \/>\nlineSemiColon = true;<br \/>\n}<br \/>\nelse if ( lineIndex &gt;= LINE_BUFFER_LENGTH-1 ) {<br \/>\nSerial.println( &quot;ERROR &#8211; lineBuffer overflow&quot; );<br \/>\nlineIsComment = false;<br \/>\nlineSemiColon = false;<br \/>\n}<br \/>\nelse if ( c &gt;= &#039;a&#039; &amp;&amp; c &lt;= &#039;z&#039; ) { \/\/ Upcase lowercase<br \/>\nline[ lineIndex++ ] = c-&#039;a&#039;+&#039;A&#039;;<br \/>\n}<br \/>\nelse {<br \/>\nline[ lineIndex++ ] = c;<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>void processIncomingLine( char* line, int charNB ) {<br \/>\nint currentIndex = 0;<br \/>\nchar buffer[ 64 ]; \/\/ Hope that 64 is enough for 1 parameter<br \/>\nstruct point newPos;<\/p>\n<p>newPos.x = 0.0;<br \/>\nnewPos.y = 0.0;<\/p>\n<p>\/\/ Needs to interpret<br \/>\n\/\/ G1 for moving<br \/>\n\/\/ G4 P300 (wait 150ms)<br \/>\n\/\/ G1 X60 Y30<br \/>\n\/\/ G1 X30 Y50<br \/>\n\/\/ M300 S30 (pen down)<br \/>\n\/\/ M300 S50 (pen up)<br \/>\n\/\/ Discard anything with a (<br \/>\n\/\/ Discard any other command!<\/p>\n<p>while( currentIndex &lt; charNB ) {<br \/>\nswitch ( line[ currentIndex++ ] ) { \/\/ Select command, if any<br \/>\ncase &#039;U&#039;:<br \/>\npenUp();<br \/>\nbreak;<br \/>\ncase &#039;D&#039;:<br \/>\npenDown();<br \/>\nbreak;<br \/>\ncase &#039;G&#039;:<br \/>\nbuffer[0] = line[ currentIndex++ ]; \/\/ \/!\\ Dirty &#8211; Only works with 2 digit commands<br \/>\n\/\/ buffer[1] = line[ currentIndex++ ];<br \/>\n\/\/ buffer[2] = &#039;&#92;&#48;&#039;;<br \/>\nbuffer[1] = &#039;&#92;&#48;&#039;;<\/p>\n<p>switch ( atoi( buffer ) ){ \/\/ Select G command<br \/>\ncase 0: \/\/ G00 &amp; G01 &#8211; Movement or fast movement. Same here<br \/>\ncase 1:<br \/>\n\/\/ \/!\\ Dirty &#8211; Suppose that X is before Y<br \/>\nchar* indexX = strchr( line+currentIndex, &#039;X&#039; ); \/\/ Get X\/Y position in the string (if any)<br \/>\nchar* indexY = strchr( line+currentIndex, &#039;Y&#039; );<br \/>\nif ( indexY &lt;= 0 ) {<br \/>\nnewPos.x = atof( indexX + 1);<br \/>\nnewPos.y = actuatorPos.y;<br \/>\n}<br \/>\nelse if ( indexX &lt;= 0 ) {<br \/>\nnewPos.y = atof( indexY + 1);<br \/>\nnewPos.x = actuatorPos.x;<br \/>\n}<br \/>\nelse {<br \/>\nnewPos.y = atof( indexY + 1);<br \/>\nindexY = &#039;&#92;&#48;&#039;;<br \/>\nnewPos.x = atof( indexX + 1);<br \/>\n}<br \/>\ndrawLine(newPos.x, newPos.y );<br \/>\n\/\/ Serial.println(&quot;ok&quot;);<br \/>\nactuatorPos.x = newPos.x;<br \/>\nactuatorPos.y = newPos.y;<br \/>\nbreak;<br \/>\n}<br \/>\nbreak;<br \/>\ncase &#039;M&#039;:<br \/>\nbuffer[0] = line[ currentIndex++ ]; \/\/ \/!\\ Dirty &#8211; Only works with 3 digit commands<br \/>\nbuffer[1] = line[ currentIndex++ ];<br \/>\nbuffer[2] = line[ currentIndex++ ];<br \/>\nbuffer[3] = &#039;&#92;&#48;&#039;;<br \/>\nswitch ( atoi( buffer ) ){<br \/>\ncase 300:<br \/>\n{<br \/>\nchar* indexS = strchr( line+currentIndex, &#039;S&#039; );<br \/>\nfloat Spos = atof( indexS + 1);<br \/>\n\/\/ Serial.println(&quot;ok&quot;);<br \/>\nif (Spos == 30) {<br \/>\npenDown();<br \/>\n}<br \/>\nif (Spos == 50) {<br \/>\npenUp();<br \/>\n}<br \/>\nbreak;<br \/>\n}<br \/>\ncase 114: \/\/ M114 &#8211; Repport position<br \/>\nSerial.print( &quot;Absolute position : X = &quot; );<br \/>\nSerial.print( actuatorPos.x );<br \/>\nSerial.print( &quot; &#8211; Y = &quot; );<br \/>\nSerial.println( actuatorPos.y );<br \/>\nbreak;<br \/>\ndefault:<br \/>\nSerial.print( &quot;Command not recognized : M&quot;);<br \/>\nSerial.println( buffer );<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>}<\/p>\n<p>\/*********************************<br \/>\n* Draw a line from (x0;y0) to (x1;y1).<br \/>\n* int (x1;y1) : Starting coordinates<br \/>\n* int (x2;y2) : Ending coordinates<br \/>\n**********************************\/<br \/>\nvoid drawLine(float x1, float y1) {<\/p>\n<p>if (verbose)<br \/>\n{<br \/>\nSerial.print(&quot;fx1, fy1: &quot;);<br \/>\nSerial.print(x1);<br \/>\nSerial.print(&quot;,&quot;);<br \/>\nSerial.print(y1);<br \/>\nSerial.println(&quot;&quot;);<br \/>\n}<\/p>\n<p>\/\/ Bring instructions within limits<br \/>\nif (x1 &gt;= Xmax) {<br \/>\nx1 = Xmax;<br \/>\n}<br \/>\nif (x1 &lt;= Xmin) {<br \/>\nx1 = Xmin;<br \/>\n}<br \/>\nif (y1 &gt;= Ymax) {<br \/>\ny1 = Ymax;<br \/>\n}<br \/>\nif (y1 &lt;= Ymin) {<br \/>\ny1 = Ymin;<br \/>\n}<\/p>\n<p>if (verbose)<br \/>\n{<br \/>\nSerial.print(&quot;Xpos, Ypos: &quot;);<br \/>\nSerial.print(Xpos);<br \/>\nSerial.print(&quot;,&quot;);<br \/>\nSerial.print(Ypos);<br \/>\nSerial.println(&quot;&quot;);<br \/>\n}<\/p>\n<p>if (verbose)<br \/>\n{<br \/>\nSerial.print(&quot;x1, y1: &quot;);<br \/>\nSerial.print(x1);<br \/>\nSerial.print(&quot;,&quot;);<br \/>\nSerial.print(y1);<br \/>\nSerial.println(&quot;&quot;);<br \/>\n}<\/p>\n<p>\/\/ Convert coordinates to steps<br \/>\nx1 = (int)(x1*StepsPerMillimeterX);<br \/>\ny1 = (int)(y1*StepsPerMillimeterY);<br \/>\nfloat x0 = Xpos;<br \/>\nfloat y0 = Ypos;<\/p>\n<p>\/\/ Let&#039;s find out the change for the coordinates<br \/>\nlong dx = abs(x1-x0);<br \/>\nlong dy = abs(y1-y0);<br \/>\nint sx = x0&lt;x1 ? StepInc : -StepInc;<br \/>\nint sy = y0&lt;y1 ? StepInc : -StepInc;<\/p>\n<p>long i;<br \/>\nlong over = 0;<\/p>\n<p>if (dx &gt; dy) {<br \/>\nfor (i=0; i&lt;dx; ++i) {<br \/>\nmyStepperX.onestep(sx,STEP);<br \/>\nover+=dy;<br \/>\nif (over&gt;=dx) {<br \/>\nover-=dx;<br \/>\nmyStepperY.onestep(sy,STEP);<br \/>\n}<br \/>\ndelay(StepDelay);<br \/>\n}<br \/>\n}<br \/>\nelse {<br \/>\nfor (i=0; i&lt;dy; ++i) {<br \/>\nmyStepperY.onestep(sy,STEP);<br \/>\nover+=dx;<br \/>\nif (over&gt;=dy) {<br \/>\nover-=dy;<br \/>\nmyStepperX.onestep(sx,STEP);<br \/>\n}<br \/>\ndelay(StepDelay);<br \/>\n}<br \/>\n}<\/p>\n<p>if (verbose)<br \/>\n{<br \/>\nSerial.print(&quot;dx, dy:&quot;);<br \/>\nSerial.print(dx);<br \/>\nSerial.print(&quot;,&quot;);<br \/>\nSerial.print(dy);<br \/>\nSerial.println(&quot;&quot;);<br \/>\n}<\/p>\n<p>if (verbose)<br \/>\n{<br \/>\nSerial.print(&quot;Going to (&quot;);<br \/>\nSerial.print(x0);<br \/>\nSerial.print(&quot;,&quot;);<br \/>\nSerial.print(y0);<br \/>\nSerial.println(&quot;)&quot;);<br \/>\n}<\/p>\n<p>\/\/ Delay before any next lines are submitted<br \/>\ndelay(LineDelay);<br \/>\n\/\/ Update the positions<br \/>\nXpos = x1;<br \/>\nYpos = y1;<br \/>\n}<\/p>\n<p>\/\/ Raises pen<br \/>\nvoid penUp() {<br \/>\npenServo.write(penZUp);<br \/>\ndelay(penDelay);<br \/>\nZpos=Zmax;<br \/>\ndigitalWrite(15, LOW);<br \/>\ndigitalWrite(16, HIGH);<br \/>\nif (verbose) {<br \/>\nSerial.println(&quot;Pen up!&quot;);<\/p>\n<p>}<br \/>\n}<br \/>\n\/\/ Lowers pen<br \/>\nvoid penDown() {<br \/>\npenServo.write(penZDown);<br \/>\ndelay(penDelay);<br \/>\nZpos=Zmin;<br \/>\ndigitalWrite(15, HIGH);<br \/>\ndigitalWrite(16, LOW);<br \/>\nif (verbose) {<br \/>\nSerial.println(&quot;Pen down.&quot;);<\/p>\n<p>}<br \/>\n}<\/p>\n<p>[\/cpp]<\/p>\n<p>[\/learn_more]<\/p>\n<p><a href=\"https:\/\/github.com\/grbl\/grbl\">Lien vers un github utile\u00a0<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":3864,"parent":0,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"categories":[22,20],"type_projet":[],"class_list":["post-3862","projet","type-projet","status-publish","has-post-thumbnail","hentry","category-evenements","category-projets"],"acf":{"objectifs":"","categorie":false,"fichiers_associes":null},"_links":{"self":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet"}],"about":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/types\/projet"}],"author":[{"embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/users\/1"}],"version-history":[{"count":1,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3862\/revisions"}],"predecessor-version":[{"id":10485,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3862\/revisions\/10485"}],"wp:attachment":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/media?parent=3862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/categories?post=3862"},{"taxonomy":"type_projet","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/type_projet?post=3862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}