{"id":1875,"date":"2014-08-18T23:50:47","date_gmt":"2014-08-18T22:50:47","guid":{"rendered":"http:\/\/telefab.fr\/?p=1875"},"modified":"2026-04-30T17:33:59","modified_gmt":"2026-04-30T15:33:59","slug":"globe-a-persistance-retinienne","status":"publish","type":"projet","link":"https:\/\/hub.imt-atlantique.fr\/fablab\/projet\/globe-a-persistance-retinienne\/","title":{"rendered":"Globe \u00e0 persistance r\u00e9tinienne"},"content":{"rendered":"<p>Le globe \u00e0 persistance r\u00e9tinienne consiste \u00e0 donner l&rsquo;impression d&rsquo;un globe de LEDs sur lequel on peut afficher des images, en faisant simplement tourner \u00e0 grande vitesse\u00a0un demi-cercle sur lequel sont fix\u00e9es des LEDs RGB. En allumant les LEDs exactement aux bons instants, on peut produire n&rsquo;importe quelle image. Voici quelques exemples\u00a0:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/06\/photo-23-e1408115660126.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2039 size-medium\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/06\/photo-23-e1408115660126-225x300.jpg\" alt=\"Globe : terre\" width=\"225\" height=\"300\" \/><\/a> <a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/06\/photo-13-e1408115712567.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2040 size-medium\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/06\/photo-13-e1408115712567-225x300.jpg\" alt=\"Globe : texte\" width=\"225\" height=\"300\" \/><\/a><\/p>\n<p>Ce globe est le r\u00e9sultat du travail d&rsquo;une succession de personnes au T\u00e9l\u00e9fab. <a title=\"Persistance r\u00e9tinienne et affichage d\u2019image 3D\" href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/2013\/06\/16\/persistance-retinienne-et-affichage-dimage-3d\/\">Un premier projet S2<\/a> (<span style=\"color: #3f3f40;\">CHAIEB Hassen, EL AABOUDI Khalid, RAYNAL Damien et TELLAT Wael,\u00a0<\/span>\u00e9tudiants en\u00a0premi\u00e8re ann\u00e9e) a permis de construire la structure du globe ainsi que les premi\u00e8res version des logiciels de contr\u00f4le et d&rsquo;obtenir le premier prototype fonctionnel. <a title=\"Persistance r\u00e9tinienne et affichage d\u2019image 3D [MAJ]\" href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/2014\/02\/03\/persistance-retinienne-et-affichage-dimage-3d-maj\/\">Un projet d&rsquo;intersemestre<\/a> (<span style=\"color: #3f3f40;\">Boris Claverie et R\u00e9my B\u00e9tus, \u00e9tudiants en troisi\u00e8me ann\u00e9e) a permis de travailler sur la conception du contact \u00e9lectrique entre les parties fixes et tournantes et sur la synchronisation de l&rsquo;image par rapport \u00e0 la vitesse du moteur. Enfin, divers intervenants du T\u00e9l\u00e9fab (Benoit Larras, Pierre-Henri Horrein et Tristan Grol\u00e9at) ont travaill\u00e9 sur la fiabilisation g\u00e9n\u00e9rale du globe (structure, \u00e9lectronique, logiciel). Cet article mis \u00e0 jour r\u00e9guli\u00e8rement pr\u00e9sente le fonctionnement du globe dans son \u00e9tat actuel, ainsi que les le\u00e7ons apprises des tentatives pr\u00e9c\u00e9dentes.<\/span><\/p>\n<p>Voici le globe \u00e0 l&rsquo;arr\u00eat :<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-1-e1408308494911.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2045\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-1-e1408308494911-300x285.jpg\" alt=\"Globe : \u00e0 l'arr\u00eat\" width=\"300\" height=\"285\" \/><\/a><\/p>\n<p>Il est compos\u00e9 de plusieurs parties importantes :<\/p>\n<ul>\n<li>la partie fixe qui permet la stabilit\u00e9 du syst\u00e8me, avec un moteur \u00e0 courant continu qui fait tourner le globe ;<\/li>\n<li>la partie tournante avec les LEDs contr\u00f4l\u00e9es par un Arduino Mega ;<\/li>\n<li>l&rsquo;interface entre la partie fixe et tournante, qui permet \u00e0 la partie tournante de recevoir de\u00a0l&rsquo;\u00e9nergie\u00a0et\u00a0des ordres, et de d\u00e9tecter sa vitesse de rotation ;<\/li>\n<li>la carte \u00e9lectronique de contr\u00f4le, fixe, qui fournit une alimentation \u00e0 diff\u00e9rents niveaux de tension, contr\u00f4le le moteur, et facilite la communication entre les parties fixes et tournantes ;<\/li>\n<li>le logiciel embarqu\u00e9, qui contr\u00f4le le tout ;<\/li>\n<li>les logiciels de support, qui permettent de travailler avec le globe.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/telefab\/POV3DLED\">Le code et les objets 3D utilis\u00e9s pour la conception du globe sont disponibles sur Github.<\/a><\/p>\n<h2>La partie fixe<\/h2>\n<p>La partie fixe est compos\u00e9e d&rsquo;une planche de contreplaqu\u00e9 sur laquelle sont fix\u00e9s quatre m\u00e2ts faits de profil\u00e9s d&rsquo;acier en corni\u00e8re. Ces m\u00e2ts sont rejoints en haut par des profil\u00e9s plats en acier qui se rejoignent au centre. \u00c0 cet endroit, un trou est perc\u00e9. L&rsquo;axe de la partie tournante est une tige filet\u00e9e. En haut, une tige lisse graiss\u00e9e est viss\u00e9e sur la tige filet\u00e9. C&rsquo;est ce qui sert \u00e0 maintenir la tige.<\/p>\n<p>Le bas de la tige est fix\u00e9 au moteur \u00e0 courant continu fix\u00e9 au centre de la planche de contreplaqu\u00e9. Il s&rsquo;agit d&rsquo;un moteur r\u00e9cup\u00e9r\u00e9 qui provient\u00a0apparemment d&rsquo;un essuie-glace.<\/p>\n<p>Cette structure remplace la pr\u00e9c\u00e9dente qui \u00e9tait faite en bois, avec un seul m\u00e2t. Elle est beaucoup plus rigide que la pr\u00e9c\u00e9dente, ce qui permet de parer en partie au balancement d\u00fb \u00e0 un mauvais \u00e9quilibrage de la partie tournante.<\/p>\n<h2>La partie tournante<\/h2>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-2-e1408309903138.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2046\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-2-e1408309903138-225x300.jpg\" alt=\"Globe : partie tournante\" width=\"225\" height=\"300\" \/><\/a><\/p>\n<p>La structure de la partie tournante est un anneau en plastique. Cette anneau est travers\u00e9 par une tige filet\u00e9e servant d&rsquo;axe. Des trous sont perc\u00e9s sur l&rsquo;anneau pour laisser passer 39 LEDs RGB r\u00e9parties uniform\u00e9ment en un demi-cercle. Chaque LED est connect\u00e9e directement \u00e0 l&rsquo;Arduino MEGA accroch\u00e9 sur l&rsquo;axe au centre de l&rsquo;anneau. Pour faciliter les connexions, un shield a \u00e9t\u00e9 cr\u00e9\u00e9 pour l&rsquo;Arduino avec une plaque de prototype.<\/p>\n<p>Pour diminuer les connexions, les cathodes des LEDs sont reli\u00e9es. Ainsi, toutes les cathodes \u00ab\u00a0rouge\u00a0\u00bb sont reli\u00e9es \u00e0 un pin de l&rsquo;Arduino, de m\u00eame pour les cathodes \u00ab\u00a0vert\u00a0\u00bb et \u00ab\u00a0bleu\u00a0\u00bb. L&rsquo;anode de chaque LED est connect\u00e9e \u00e0 un pin diff\u00e9rent de l&rsquo;Arduino. De cette mani\u00e8re pour contr\u00f4ler \u00a039 LEDs, il faut 39 + 3 = 42 pins. Cela signifie qu&rsquo;\u00e0 un instant donn\u00e9, toutes les LEDs allum\u00e9es ont la m\u00eame couleur. Pour afficher des images, il faut donc allumer tr\u00e8s rapidement chaque LED l&rsquo;une apr\u00e8s l&rsquo;autre.<\/p>\n<p>Cette partie est celle qui a \u00e9t\u00e9 la moins modifi\u00e9e depuis le d\u00e9but. La seule nouveaut\u00e9 est le remplacement des serre-joints utilis\u00e9s pour fixer l&rsquo;Arduino par des pi\u00e8ces faites \u00e0 l&rsquo;imprimante 3D, <a href=\"https:\/\/github.com\/telefab\/POV3DLED\">disponibles sur Github<\/a>\u00a0dans le dossier Things (ficher OpenSCAD ou STL arduino_holder).<\/p>\n<h2>L&rsquo;interface fixe\/tournant<\/h2>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-5-e1408310529282.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2047\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-5-e1408310529282-300x250.jpg\" alt=\"Globe : connexion tournante\" width=\"300\" height=\"250\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Contact \u00e9lectrique<\/h3>\n<p>L&rsquo;interface entre les parties fixes et tournantes est une partie cruciale du globe. Elle sert avant tout \u00e0 alimenter en \u00e9nergie la partie tournante. Pour cela, deux contacts doivent \u00eatre faits : la masse, et un 9V qui permet d&rsquo;alimenter l&rsquo;Arduino Mega par le pin Vin. Un composant appel\u00e9 collecteur tournant est disponible dans le commerce pour r\u00e9aliser des contacts \u00e9lectriques tournants. Mais celui utilis\u00e9 est fait maison \u00e0 l&rsquo;imprimante 3D. <a href=\"https:\/\/github.com\/telefab\/POV3DLED\">Les plans sont sur Github<\/a> dans le dossier Things. (fichier OpenSCAD connection-base, les fichiers STL sont aussi disponibles).<\/p>\n<p>Le principe est simple : deux larges rondelles sont utilis\u00e9es comme contacts tournants. Elles sont fix\u00e9es \u00e0 la partie tournante par des\u00a0pi\u00e8ce r\u00e9alis\u00e9es \u00e0 l&rsquo;imprimante 3D (une base, un s\u00e9parateur pour \u00e9viter le contact entre les deux rondelles, et des petites cales pour tenir le tout fix\u00e9). Des fils \u00e9lectriques passent par l&rsquo;int\u00e9rieur de la base et sont soud\u00e9s aux rondelles. Sur la partie fixe, deux petites vis pouss\u00e9es par des ressorts appuient sur les rondelles. Elles sont visibles \u00e0 gauche sur la photo. Elles sont maintenues par une pi\u00e8ce faite \u00e0 l&rsquo;imprimante 3D, et sont chacune soud\u00e9es \u00e0 un fil \u00e9lectrique arrivant par derri\u00e8re.<\/p>\n<p>Ce m\u00e9canisme permet d&rsquo;alimenter l&rsquo;Arduino MEGA sans avoir de probl\u00e8mes de fils qui s&#8217;emm\u00ealent. Le d\u00e9faut est que cela cr\u00e9e des frottements et du bruit. Mais le contact est fiable. Pour s&rsquo;assurer que l&rsquo;Arduino fonctionne sans probl\u00e8me en rotation, une grosse capacit\u00e9 a \u00e9t\u00e9 plac\u00e9e sur la partie tournante en parall\u00e8le de l&rsquo;alimentation de l&rsquo;Arduino. Elle agit comme une mini batterie en cas de coupure de tr\u00e8s courte dur\u00e9e.<\/p>\n<p>Ce contact \u00e9lectrique a \u00e9t\u00e9 une source majeure de difficult\u00e9s dans la conception de ce globe. Diff\u00e9rentes solutions ont \u00e9t\u00e9 tent\u00e9es :<a title=\"Persistance r\u00e9tinienne et affichage d\u2019image 3D\" href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/2013\/06\/16\/persistance-retinienne-et-affichage-dimage-3d\/\"> enrouler du fil de fer sur la partie tournante et tendre un fil entre deux bouts de bois<\/a> pour appuyer sur la partie tournante, <a href=\"https:\/\/github.com\/telefab\/POV3DLED\/blob\/4651accc5633db829fe33a1f8b502043b47404b5\/things\/connection-base.scad\">coller du scotch cuivr\u00e9 sur la partie tournante et tendre des bandes de cuivre avec une pi\u00e8ce faite \u00e0 l&rsquo;imprimante 3D<\/a>,<a title=\"Persistance r\u00e9tinienne et affichage d\u2019image 3D [MAJ]\" href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/2014\/02\/03\/persistance-retinienne-et-affichage-dimage-3d-maj\/\"> utiliser une prise jack en faisant tourner la partie m\u00e2le dans la partie femelle<\/a>. Toutes ces solutions ont march\u00e9 pendant un temps, mais se sont vite us\u00e9es et ont cess\u00e9 de fonctionner. La solution actuelle a dur\u00e9 beaucoup plus longtemps que ces solutions.<\/p>\n<h3>D\u00e9tection de la vitesse de rotation<\/h3>\n<p>Une fonction annexe de l&rsquo;interface fixe\/tournant est de permettre \u00e0 l&rsquo;Arduino MEGA de d\u00e9tecter un point fixe lors de la rotation, pour avoir une r\u00e9f\u00e9rence et permettre d&rsquo;afficher une image fixe. Ceci est r\u00e9alis\u00e9 gr\u00e2ce \u00e0 une LED cach\u00e9e dans le petit cube noir visible \u00e0 droite sur la photo pr\u00e9c\u00e9dente. La LED est constamment allum\u00e9e et fixe. Dans la partie tournante, en face de la LED, se trouve une photor\u00e9sistance (fils violets qui arrivent en haut de la photo). Quand la photor\u00e9sistance passe devant la LED, elle d\u00e9tecte la lumi\u00e8re. La photor\u00e9sistance est directement connect\u00e9e \u00e0 l&rsquo;Arduino MEGA, avec un montage pull-down, qui fait que la valeur 0 est lue constamment, sauf quand la photor\u00e9sistance est devant la LED. Dans ce cas, la valeur 1 est lue par l&rsquo;Arduino.<\/p>\n<p>Au d\u00e9but, nous utilisions un montage pull-up, la photor\u00e9sistance lisait un 1 constamment et un 0 en passant devant la LED. Mais nous avons remarqu\u00e9 que ce montage \u00e9tait beaucoup plus sensible au bruit provoqu\u00e9 par l&rsquo;alimentation instable, provoquant des fausses d\u00e9tections difficiles \u00e0 ignorer c\u00f4t\u00e9 logiciel.<\/p>\n<h2>La carte \u00e9lectronique de contr\u00f4le<\/h2>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-4.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2049\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/photo-4-300x225.jpg\" alt=\"Globe : carte \u00e9lectronique\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<h3>Alimentation<\/h3>\n<p>L&rsquo;objectif principal de cette carte est d&rsquo;alimenter l&rsquo;Arduino et le moteur. Elle re\u00e7oit en entr\u00e9e du 12V (ou un peu plus) fourni par un vieux transformateur r\u00e9cup\u00e9r\u00e9. Pour alimenter l&rsquo;Arduino, elle contient un simple r\u00e9gulateur 9V.<\/p>\n<p>L&rsquo;alimentation du moteur est un peu plus complexe car nous voulons pouvoir contr\u00f4ler sa vitesse. Cela permet de le ralentir pour montrer aux gens le fonctionnement de la persistance r\u00e9tinienne. Pour cela, nous utilisons un potentiom\u00e8tre visible en bas \u00e0 droite sur la photo. Mais le moteur demande beaucoup de puissance, il n&rsquo;est donc pas possible de le mettre simplement en s\u00e9rie avec le potentiom\u00e8tre. La meilleure mani\u00e8re de contr\u00f4ler un moteur \u00e0 courant continu est d&rsquo;utiliser des PWM, c&rsquo;est \u00e0 dire un signal carr\u00e9 alternant rapidement entre la tension maximale (les 12V re\u00e7us en entr\u00e9e) et 0. Selon le rapport cyclique entre la dur\u00e9e \u00e0 12V et la dur\u00e9e \u00e0 0v, la vitesse du moteur change. Pour g\u00e9n\u00e9rer ces PWMs \u00e0 rapport cyclique variable en fonction de la valeur d&rsquo;un potentiom\u00e8tre, nous avons\u00a0utilis\u00e9 <a href=\"http:\/\/www.instructables.com\/id\/Yet-Another-Simple-Pot-controlled-555-PWM-generato\/step2\/What-will-be-needed\/\">un montage \u00e0 partir du composant NE 555 trouv\u00e9 sur instructables<\/a>. Le montage d\u00e9crit dans l&rsquo;article est exactement celui r\u00e9alis\u00e9 ici. Les valeurs de r\u00e9sistance sont adapt\u00e9es pour aller avec la valeur du potentiom\u00e8tre, selon la formule indiqu\u00e9e dans l&rsquo;article. Les PWMs g\u00e9n\u00e9r\u00e9es ne supportent pas assez de puissance pour contr\u00f4ler le moteur. C&rsquo;est pourquoi elles sont\u00a0utilis\u00e9es comme signal de contr\u00f4le pour un transistor MOSFET, qui contr\u00f4le le moteur, suivant le montage d\u00e9crit dans <a href=\"http:\/\/www.electronics-tutorials.ws\/transistor\/tran_7.html\">la partie \u00ab\u00a0Simple Power MOSFET Motor Controller\u00a0\u00bb \u00a0de cet article<\/a>.<\/p>\n<p>Dans sa premi\u00e8re version, le globe n&rsquo;avait aucune carte de contr\u00f4le. Une alimentation r\u00e9glable \u00e0 deux sorties \u00e9tait donc n\u00e9cessaire pour le faire fonctionner, ce qui \u00e9tait encombrant. Dans une version suivante, une alimentation de PC a \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9e, et la vitesse du moteur \u00e9tait contr\u00f4l\u00e9e par un gros potentiom\u00e8tre en s\u00e9rie avec le moteur. Ce syst\u00e8me fonctionnait mais toute la puissance non utilis\u00e9e par le moteur \u00e9tait dissip\u00e9e par le potentiom\u00e8tre, qui chauffait beaucoup et risquait de br\u00fbler l&rsquo;utilisateur. La version actuelle est plus compacte et ne chauffe quasiment pas.<\/p>\n<h3>\u00a0Communication avec la partie tournante<\/h3>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/image.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2061\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2014\/08\/image-277x300.jpg\" alt=\"Globe : circuit comm.\" width=\"220\" height=\"238\" \/><\/a><\/p>\n<p>Envoyer des informations \u00e0 la partie tournante sans l&rsquo;arr\u00eater permet d&rsquo;apporter de l&rsquo;interactivit\u00e9 au globe. Pour ce faire, un bus de communication entre la partie fixe et la partie tournante est n\u00e9cessaire. Mais nous ne disposons que de deux conducteurs entre la partie fixe et mobile : la masse et le 9V. Pour ne pas compliquer la m\u00e9canique, l&rsquo;alimentation peut \u00eatre modul\u00e9e par un Arduino fixe pour envoyer des informations \u00e0 l&rsquo;Arduino MEGA tournant. Pour ceci,\u00a0il modifie la masse en la passant \u00e0 5V pendant de tr\u00e8s courts instants, ce qui cr\u00e9e des impulsions. Le d\u00e9lai entre les impulsions permet de coder des 1 et des 0, et donc d&rsquo;envoyer des messages binaires.<\/p>\n<p>Le m\u00e9canisme pour cr\u00e9er ces impulsions sur le fil de masse est int\u00e9gr\u00e9 \u00e0 la carte. Il est visible sur la partie gauche de la photo et d\u00e9taill\u00e9 sur le sch\u00e9ma ci-dessus. La sortie GND_MOD peut \u00eatre utilis\u00e9e \u00e0 la place de la vraie masse pour alimenter la partie tournante. Un condensateur branch\u00e9 en parall\u00e8le sur l&rsquo;alimentation de l&rsquo;Arduino \u00e9vite qu&rsquo;il ne soit perturb\u00e9 par les impulsions. Ce condensateur est isol\u00e9 du PIN de lecture (3) par une diode pour rendre les impulsions visibles par le PIN 3. L&rsquo;entr\u00e9e CTRL est un signal g\u00e9r\u00e9 par l&rsquo;Arduino externe. Quand cette entr\u00e9e passe \u00e0 0, GND_MOD\u00a0passe \u00e0 5V \u00e0 cause du transistor (un MOSFET N) par l&rsquo;interm\u00e9diaire d&rsquo;une r\u00e9sistance de pull-up d&rsquo;1k\u03a9.\u00a0Sinon GND_MOD\u00a0reste \u00e0 la masse. Si aucun fil n&rsquo;est connect\u00e9 \u00e0 CTRL, GND_MOD\u00a0reste \u00e0 la masse gr\u00e2ce \u00e0 la r\u00e9sistance de pull-up de 10k\u03a9 sur CTRL. L&rsquo;Arduino de contr\u00f4le externe est donc facultatif.<\/p>\n<p>Le circuit qui permet de g\u00e9n\u00e9rer les impulsions a \u00e9t\u00e9 fait \u00ab\u00a0au feeling\u00a0\u00bb, en s&rsquo;inspirant du syst\u00e8me de communication <a href=\"http:\/\/fr.wikipedia.org\/wiki\/1-Wire\">1-wire<\/a>. Des retours d&rsquo;experts pour am\u00e9liorer le circuit seraient les bienvenus. Mais pour le moment, ce circuit fonctionne bien.<\/p>\n<h2>Le logiciel embarqu\u00e9<\/h2>\n<p>Le logiciel embarqu\u00e9 est en une librairie qui g\u00e8re l&rsquo;affichage et la communication, et des exemples d&rsquo;utilisation. Tout le code est\u00a0<a href=\"https:\/\/github.com\/telefab\/POV3DLED\">sur Github<\/a>\u00a0dans le dossier \u00ab\u00a0Globe\u00a0\u00bb.<\/p>\n<h3>Librairie : l&rsquo;affichage<\/h3>\n<p>L&rsquo;affichage est g\u00e9r\u00e9 par la classe singleton <strong>Globe<\/strong>. Cette classe fournit une m\u00e9thode d&rsquo;initialisation (<strong>begin<\/strong>), \u00e0 partir de son appel, l&rsquo;affichage sur le globe est g\u00e9r\u00e9 par l&rsquo;Arduino. La classe fournit aussi des m\u00e9thodes de dessin (<strong>setLed<\/strong>,\u00a0<strong>getLed<\/strong>,\u00a0<strong>rotate<\/strong>,<strong> setLedRot<\/strong>,<strong> getLedRot<\/strong>) qui permettent de modifier l&rsquo;image affich\u00e9e sur le globe. Les changements sont visibles d\u00e9s le prochain rafraichissement de l&rsquo;image. Enfin, la librairie contient des m\u00e9thodes de synchronisation (<strong>delayRound, passedRound<\/strong>) qui permettent de synchroniser le d\u00e9roulement du programme par rapport \u00e0 la vitesse de rotation.<\/p>\n<p>Le fonctionnement de la librairie est enti\u00e8rement bas\u00e9 sur des interruptions : les interruptions du capteur de tour permettent de mesurer la vitesse de rotation et de commencer l&rsquo;affichage ; les interruptions d&rsquo;un timer permettent d&rsquo;allumer les LEDs les unes apr\u00e8s les autres. L&rsquo;ex\u00e9cution de la librairies est critique et les interruptions ne doivent pas \u00eatre inhib\u00e9es. La librairie utilise une part non n\u00e9gligeable du temps du processeur, qui augmente avec la vitesse de rotation.<\/p>\n<p>L&rsquo;affichage de l&rsquo;image se fait colonne par colonne et LED par LED. Une seule LED est allum\u00e9e \u00e0 un instant donn\u00e9. Chacune des trois couleurs est g\u00e9r\u00e9e en binaire (allum\u00e9e ou \u00e9teinte), ceci \u00e0 cause du faible nombre de sorties analogiques de l&rsquo;Arduino. Il serait possible d&rsquo;afficher les colonnes couleur par couleur (rouge puis vert puis bleu) au lieu de LED par LED pour aller plus vite. Cette alternative a \u00e9t\u00e9 tent\u00e9e, mais elle nuit au m\u00e9lange des couleurs.<\/p>\n<h3>Librairie : la communication<\/h3>\n<p>La communication entre la partie fixe et tournante ne fonctionne que dans un seul sens : l&rsquo;Arduino fixe envoie des ordres \u00e0 l&rsquo;Arduino MEGA tournant. L&rsquo;Arduino fixe est donc le ma\u00eetre et l&rsquo;Arduino tournant est l&rsquo;esclave. La librairie est donc divis\u00e9e en deux classes : <strong>BusMaster<\/strong> et <strong>BusSlave<\/strong>. Elles ont toutes les deux une m\u00e9thode d&rsquo;initialisation (<strong>begin<\/strong>). Ensuite la classe ma\u00eetre a une m\u00e9thode\u00a0<strong>send<\/strong> et la classe esclave a des\u00a0m\u00e9thodes <strong>available<\/strong>, <strong>read<\/strong> et <strong>readString<\/strong> pour savoir si un message est disponible, lire un octet du message, ou lire une chaine enti\u00e8re.<\/p>\n<p>La communication fonctionne par impulsions. Il y a 3 symboles : 0, 1, et fin qui correspondent \u00e0 des d\u00e9lais diff\u00e9rents entre deux impulsions. Chaque octet est envoy\u00e9 suivi de 2 bits permettant de num\u00e9roter l&rsquo;octet, d&rsquo;un bit de parit\u00e9, et d&rsquo;un symbole fin. Chaque octet est envoy\u00e9 \u00e0 3 reprises. Cette redondance est ajout\u00e9e pour fiabiliser la communication. Deux facteurs rendent la communication complexe : le bruit d\u00fb au contact tournant et l&rsquo;impr\u00e9cision de mesure due au fait que l&rsquo;Arduino esclave s&rsquo;occupe d\u00e9j\u00e0 de l&rsquo;affichage, ce qui l&#8217;emp\u00eache de mesurer les d\u00e9lais avec pr\u00e9cision. Le second facteur est au moins aussi important que le premier.<\/p>\n<p>Du c\u00f4t\u00e9 maitre, les messages sont envoy\u00e9s de mani\u00e8re bloquante en utilisant la fonction Arduino <strong>delay<\/strong>. Du c\u00f4t\u00e9 esclave, les mesures sont faites \u00e0 l&rsquo;aide d&rsquo;interruptions et de deux timers. Nous avons essay\u00e9 d&rsquo;utiliser un ICP (Input Capture Pin) de l&rsquo;ATMega pour rendre les mesures plus pr\u00e9cises (le timer est d\u00e9clench\u00e9 automatiquement par les interruptions) mais les interruptions ICP ont une priorit\u00e9 trop forte qui ne peut pas \u00eatre r\u00e9gl\u00e9e, ce qui emp\u00eache le fonctionnement de l&rsquo;affichage du globe.<\/p>\n<h3>Les exemples<\/h3>\n<p>Diff\u00e9rents exemples sont disponibles avec la librairie : une carte du monde qui tourne sur lui-m\u00eame, un texte qui d\u00e9file et un bonhomme qui court \u00e0 contre-sens du globe. Deux exemples interactifs sont aussi disponibles : la possibilit\u00e9 d&rsquo;afficher le texte qu&rsquo;on veut en l&rsquo;envoyant sur le port s\u00e9rie de l&rsquo;Arduino fixe, ainsi qu&rsquo;un jeu de Snake pouvant se jouer \u00e0 2. Pour ce dernier jeu, des joysticks doivent \u00eatre connect\u00e9s \u00e0 l&rsquo;Arduino fixe.<\/p>\n<h2>Les logiciels de support<\/h2>\n<p>Certains logiciels ne servent pas directement \u00e0 faire fonctionner le globe, mais sont utiles pour le programmer. C&rsquo;est le cas par exemple du programme ImageConverter disponible <a href=\"https:\/\/github.com\/telefab\/POV3DLED\">sur Github<\/a>. Il a \u00e9t\u00e9 d\u00e9velopp\u00e9 en Java\u00a0par les premiers \u00e9tudiants qui ont travaill\u00e9 sur le globe. Il permet de prendre une image, de diminuer sa r\u00e9solution, de convertir ses couleurs, et de g\u00e9n\u00e9rer un format qui permet d&rsquo;int\u00e9grer l&rsquo;image dans du code pour l&rsquo;afficher le globe. C&rsquo;est ainsi qu&rsquo;a \u00e9t\u00e9 fait le programme avec la carte du monde qui tourne.<\/p>\n","protected":false},"author":1,"featured_media":1139,"parent":0,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"categories":[39,20],"type_projet":[],"class_list":["post-1875","projet","type-projet","status-publish","has-post-thumbnail","hentry","category-a-la-une","category-projets"],"acf":{"objectifs":"","categorie":false,"fichiers_associes":null},"_links":{"self":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/1875","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\/1875\/revisions"}],"predecessor-version":[{"id":10526,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/1875\/revisions\/10526"}],"wp:attachment":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/media?parent=1875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/categories?post=1875"},{"taxonomy":"type_projet","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/type_projet?post=1875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}