IMA4 2017/2018 P42
Sommaire
- 1 Présentation générale
- 2 Analyse du projet
- 3 Préparation du projet
- 4 Réalisation du Projet
- 5 Documents Rendus
Présentation générale
Le but de notre projet est de recycler une imprimante 3D de façon à ce qu'elle assemble des Lego selon un modèle dessiné par l'utilisateur sur une application web.
Description
Le projet sera composé d'une imprimante 3D associée à un réservoir. Il fonctionnera avec une application web nous permettant de dessiné le modèle que l'on désire.
- Imprimante 3D
Il nous faudra modifier la tête d'impression de l'imprimante pour qu'elle puisse récupérer les pièces de Lego et les déposer sur la plaque. Il nous faudra étudier le Gcode de l'imprimante et voir si on peut l'adapter à notre application.
- Application web
L'application web sera séparée en deux parties:
- Une partie permettant à l'utilisateur de dessiner le modèle qu'il désire réaliser
- Une partie permettant à l'utilisateur de renseigner les pièces présentes dans le réservoir (position, couleur, quantité...)
Objectifs
On peut décomposer le projet en plusieurs partie:
Partie mécanique
- Adaptation d'une base d'imprimante 3D
- Réalisation d'un réservoir pour les pièces de Lego
Partie électronique
- Utilisation d'un Arduino pour gérer l'imprimante 3D
Partie informatique
- Réalisation d'une application web
- Etude et possible modification du gcode de l'imprimante 3D
- Réalisation d'une application pour gérer le remplissage du réservoir
Analyse du projet
Positionnement par rapport à l'existant
Notre projet possède assez peu de concurrents, la majorité d'entre eux étant des réalisations personnelles trouvables sur YouTube. Pour l'élaboration de ce projet nous nous sommes inspiré du bricasso.
Analyse du premier concurrent
Une projet similaire au notre s'appelle Bricasso [1]. Il s'agit d'un projet réalisé en Lego Mindstorm EV3.
Cette imprimante scanne un dessin papier et l'imprime en LEGO en plaçant des pièces de couleurs correspondantes. Il possèdes beaucoup de limitations dont notre projet s’affranchira : impression uniquement en 2D, un seul type de pièces, absence de connectivité.
Cependant, ce projet contient de très bonnes idées dont nous allons nous inspirer, notamment pour la tête d’impression.
Analyse du second concurrent
Au niveau de l’application WEB, notre principal concurrent serait le logiciel Lego Digital Designer qui permet de créer en 3D des objets LEGO et de les exporter sous différents formats. Ce logiciel est très complet, cependant il ne contient pas toutes les fonctionnalités dont nous aurons besoin pour notre projet. Il permet d’utiliser toutes les pièces LEGO existantes alors que seules certaines seront utilisables dans notre projet. À terme, nous voulons essayer de mettre en place une compatibilité entre notre application et le logiciel, mais les formats d’export sont très mal documentés et ce sera difficile.
Scénario d'usage du produit ou du concept envisagé
Justine, jeune elfe d’IMA4, souhaite construire des objets en LEGO pour les assembler en un robot. Elle souhaite concevoir ses LEGO en cours de réseau au lieu de travailler, mais ne dispose pas du matériel nécessaire. Une fois rentrée chez elle le soir, elle n’a pas le temps de s’en occuper car elle doit travailler son espagnol. Depuis n’importe quel ordinateur, Justine peut construire son modèle et l’enregistrer. Une fois rentrée chez elle, elle branche son imprimante LEGO et son objet se construit sans aucune intervention de sa part. Son imprimante ira chercher les pièces désirées (spécifiques à son modèle) dans le réservoir et va ensuite aller les placer sur la plaque LEGO servant de support. Le réservoir possédant 5 rails différents il est possible d'utiliser des pièces de 5 couleurs différentes. Le choix des pièces étant limité par la taille du réservoir on utilisera donc des pièces carrées LEGO 1x1.
Réponse aux questions difficiles
Comment démarrer l'imprimante à distance ?
L'impression pourra être déclenchée depuis l'application Web lorsque l'imprimante est allumée et connectée. Le processus d'impression sera divisé en plusieurs parties :
Avant ces étapes, un message est affiché à l'utilisateur pour lui rappeler de bien positionner la plaque d'impression. L'imprimante ne vérifie pas que la plaque est bien positionnée avant de lancer le processus. Si l'utilisateur valide cette étape, la processus continue.
- Connexion à l'imprimante : L'application tente de se connecter à l'Arduino de l'imprimante via Wifi. L'adresse IP de l'Arduino devra être renseignée par l'utilisateur mais pourra être enregistrée en préférences. Si la connexion échoue, un message d'erreur est affiché à l'utilisateur. Si la connexion réussit, l'impression se lance.
- Envoi des données : après la première connexion, l'application envoie les données du projet à l'Arduino.
- Impression : l'imprimante positionne la tête d'impression et lance le processus.
Comment sera calibrée la plaque d’impression ?
La plaque d'impression utilisée sera fournie avec l'imprimante. Il s'agira d'une plaque LEGO classique, ses dimensions seront donc parfaitement connues. Si l'utilisateur décide de créer un projet de dimensions inférieures dans l'application web, le coin de la plaque sera utilisé.
Étant donné que la plaque sur laquelle sera "imprimé" l'objet fait partie de l'objet il nous faut trouver un moyen pour qu'elle soit toujours à la bonne position. Nous avons pensé à réaliser un coin contre lequel un des coin de la plaque sera bloqué (comme sur un massicot pour bloquer les feuilles de papiers). L'utilisateur devra s'assurer que la plaque est dans le bon sens et qu'elle repose bien contre le coin.
Comment la plaque va se fixer sur le sol ?
Il nous faut un système qui permette de récupérer et d'installer la plaque facilement tout en s'assurant qu'elle reste en place lors de l'utilisation de l'imprimante. On pourra donc utiliser un système d'aimants en en mettant à chaque coin et au milieu de la plaque pour qu'elle reste fixée durant l'utilisation et que l'utilisateur puisse l'enlever une fois le projet terminé.
Préparation du projet
Cahier des charges
Le projet est séparé en deux parties principales : l'application Web qui permettra de créer le modèle, le sauvegarder, et l'envoyer vers l'imprimante, et l'imprimante elle-même. Les cahiers des charges de ces deux parties sont très différents et nous permettent d'aborder de nombreux aspects de la formation IMA. La liaison entre les deux se fera via un protocole qui sera précisé plus tard, grâce à un Raspberry Pi connecté à l'Arduino Mega de l'imprimante. Nous aurions voulu utiliser un module Wifi pour Arduino, cependant le bouclier contrôleur moteur ne nous permet pas d'en utiliser un.
Application Web
L'application Web fonctionne en Cloud, sur un principe proche de Google Drive. Les projets sont sauvegardés sur une base de données centralisée et accessible depuis n'importe où via un login. Une fois créés, les projets peuvent être envoyés en local vers l'imprimante.
- Partie Frontend
- Proposer une interface paramétrable de création du modèle, en trois dimensions. Cette interface doit permettre de placer les pièces selon des règles de placement adaptées, de les faire tourner et les supprimer.
- Gérer les différents types et couleurs de pièces possibles.
- Permettre d'envoyer le modèle créé vers l'imprimante via un protocole à définir.
- Permettre de créer un nouveau projet, ouvrir un projet existant, supprimer un projet.
- Permettre à l'utilisateur de s'authentifier (optionnel).
- Partie Backend
- Mettre en place une base de données permettant de gérer les projets.
- Mettre en place une base de données permettant de gérer les utilisateurs.
- Proposer une API facilement utilisable par l'application, en tirant parti des différentes méthodes HTTP et en utilisant les bons codes de retour.
Choix techniques : matériel et logiciel
Choix matériel
Réutilisation d'une imprimante 3D Prusa i3 [2].
Réservoir
- Réalisation d'un "toboggan" en polystyrène
- Une face en plexiglas pour vérifier le remplissage
Tête d'impression
- Dans un premier temps elle sera réalisée en Lego pour la modularité
- La version finale pourra être réalisée en impression 3D
Plaque d'impression
- La plaque d'impression sera une plaque Lego
- Elle sera maintenu avec des aimants
- Le coin de calibrage pourra être réalisé en plexiglas ou en bois
Informatique
- Arduino Mega pour contrôler l'imprimante
- Raspberry Pi3 pour le serveur
- ESP8266 pour la communication entre le serveur et l'Arduino
Choix logiciel
L'architecture choisie pour l'application web est basée sur trois éléments : l'utilisateur, le serveur de sauvegarde et l'imprimante. Nous avons jugé essentiel d'utiliser un serveur de sauvegarde sur un modèle type Google Drive, car un des intérêts du projet est de pouvoir concevoir son modèle depuis n'importe où. Ce serveur sera donc accessible en ligne à tout moment via un système de connexion. Depuis cette application web, l'utilisateur aura la possibilité de se connecter à son imprimante en fournissant son adresse IP. Les données seront alors transmises sous forme d'un paquet POST ou JSON. A la réception du paquet, l'imprimante lancera l'impression de l'objet.
Backend
- Node.js : API RESTful
- PostgreSQL : Base de données projets et utilisateurs
Frontend
- HTML5/CSS3/JS
- Utilisation de la balise canvas pour la conception du schéma.
Arduino
- (provisoire)
- Utilisation du logiciel Marlin pour le contrôle de l'imprimante [3]
- Réutilisation de la base du projet [4]
- Base de l'imprimante [5]
Liste des tâches à effectuer
Adaptation de l'imprimante 3D
Pour notre projet, il est nécessaire d'adapter l'imprimante 3D pour qu'elle puisse effectuer les tâches nécessaires. Le bras de l'imprimante bouge selon les axes x et z et le plateau de l'imprimante selon l'axe y.
Plateau de l'imprimante
Le plateau actuel est une planche de bois de 22*22cm et d'une épaisseur de 0,5cm. Cette surface correspond à toute la surface que la tête d'impression peut atteindre. Il nous faut donc agrandir ce plateau pour pouvoir y mettre le réservoir de pièces. On doit donc couper un rectangle d'environ 22*30cm en bois pour le nouveau plateau de l'imprimante.
Réservoir de pièces
Ce dessin représente un rail du réservoir. Chaque rail peut recevoir une quinzaine de pièces d'un type précis. On va donc réaliser un réservoir pouvant recevoir 6 types de pièces donc contenant 6 rails. Les pièces que nous allons utiliser pour notre projet sont des pièces de Lego 1x1 qui mesurent 0,8*0,8cm.
Tête d'impression
Calendrier prévisionnel
Réalisation du Projet
Feuille d'heures
Tâche | Prélude | Heures S1 | Heures S2 | Heures S3 | Heures S4 | Heures S5 | Heures S6 | Heures S7 | Heures S8 | Heures S9 | Heures S10 | Total |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Analyse du projet | 0 |
Prologue
Nous avons commencé la partie développement web largement en amont, pour être sûrs que ce ne soit pas un facteur limitant à notre avancée. Nous avons commencé par la partie Front End, avec la programmation de l'application de modélisation. Celle-ci se présente sous la forme d'un canvas 2d, quadrillé comme une plaque LEGO, et d'un certain nombre de boutons.
Afin de modéliser une utilisation réaliste, nous avons effectué certains choix pour le prototype de l'application.
- Trois types de pièces disponibles (1x1, 1x2, 2x2)
- Nombre de calques paramétrable, dimensions max 20x20x5
- Coloration des pièces en fonction de leur calque
Les fonctionnalités déjà réalisées lors du début du projet étaient :
- Placement et suppression de pièces
- Rotation des pièces
- Changement de calque
- Règles de placement basiques
Semaine 1
Application Web
Lors de la première semaine, nous avons commencé la partie communication de l'application web. Du côté Back End, nous avons établi une première version élémentaire de l'API RESTful, capable de recevoir et répondre des messages simples à des requêtes HTTP. Nous avons réussi à mettre en place la communication entre l'application et le serveur, et à transmettre les données de toutes les pièces en JSON. Plus tard dans la semaine, nous avons implémenté la majorité des fonctionnalités de l'API et mis en place la base de données sur le Raspberry Pi. A la fin de la première semaine, nous étions en mesure de charger la liste des pièces depuis la BDD, charger la liste des projets et sauvegarder un projet. Du côté Front End, nous avons avancé sur le protocole d'envoi des données vers l'imprimante. Pour commencer, nous avons formaté les données sous un simple format URL-encoded. A terme, l'objectif est de les envoyer également en JSON pour plus de simplicité et de clarté. Un problème que nous allons devoir réussir à contourner est la contrainte CORS de même origine pour les requêtes HTTP, qui risque de nous empêcher d'envoyer des requêtes à l'imprimante. Nous réussirons peut-être à nous affranchir de cette contrainte en configurant correctement l'imprimante.
Imprimante 3D
Cette première semaine a été dédié à tester l'imprimante 3D que nous avons récupéré d'un ancien projet et à la remettre en état. En effet, l'imprimante que nous allons utiliser n'a pas été terminé par ses précédents utilisateurs: certaines pièces ne sont pas ou mal fixées et la courroie de l'axe x n'est pas correctement tendue. Nous avons donc lu le wiki du projet de l'imprimante à chocolat pour voir comment fonctionne l'imprimante et nous l'avons testé en remettant l'imprimante en position initiale. On constate donc que les 4 moteurs et les 3 capteurs de fin de course fonctionnent correctement cependant, le capteur de fin de course de l'axe z est mal fixé et mal positionné: la pièce ne l'actionne pas et le fait descendre en même temps qu'elle descend. Une fois que nous étions assurés que l'imprimante fonctionnait correctement, nous avons commencé à nous occuper de la partie mécanique en elle même en fixant des pièces non fixées notamment le plateau d'impression et en retendant la courroie qui est actuellement maintenue avec du scotch. Il nous reste donc à trouver une solution plus solide pour la courroie, un moyen pour fixer le capteur de fin de course de l'axe x et à fixer quelques pièces.
De plus, nous avons commencé à réfléchir à comment modifié cette imprimante pour l'adapter à notre projet: notre problème est de savoir où l'on pourra positionner le réservoir pour que l'imprimante puisse aller chercher les pièces. Nous avions prévu de le mettre sur le côté de l'imprimante cependant il ne sera pas possible d'utiliser cette disposition car l'axe x est trop petit et le "bras" ne pourra pas l'atteindre. Une autre solution est d'agrandir le plateau de l'imprimante pour installer le réservoir dessus il faudra donc faire attention à sa taille et son positionnement. Cette solution réduira l'espace disponible pour monter les Lego car il faut tout de même positionner le réservoir de manière à ce que le bras puisse l'atteindre. Et il nous faut aussi trouver un moyen de fixer notre "tête d'impression".
Semaine 2
Application Web
Durant la seconde semaine, nous nous sommes concentrés sur la partie Backend de l'application. Après avoir établi une première version de l'API, la plus grande partie de la séance de mercredi a été dédiée à du débug et de l'harmonisation de données. A la fin de cette séance, toutes les fonctionnalités marchaient, avec une erreur subsistant sur le chargement de projets. Cette erreur était due à un aspect du MCD que nous avions oublié mais a été réglée rapidement en fin de semaine. L'aspect backend opérationnel, nous avons ensuite pu nous concentrer sur le cahier des charges de l'application (règles de placement, types de pièces, gestion des couleurs, gestion du réservoir, gestion des utilisateurs...).
Partie mécanique
Durant cette séance, nous avons recherché les fichiers .stl permettant d'imprimer les pièces nécessaires à la finalisation de l'imprimante 3D. Les clips permettant de tenir la courroie de l'axe x ont été imprimés par M. Redon. Nous nous sommes ensuite intéressé au réservoir de pièces: dans un premier temps nous avons pris les mesures nécessaires pour sa construction : taille du plateau et taille des pièces Lego. Nous avons ensuite réaliser un dessin à l'échelle 1:1 de manière à visualiser plus facilement le travail à effectuer sur le réservoir.
Semaine 3
Application Web
L'objectif de la seconde semaine était de finir de débuguer les sauvegardes/ouvertures de projets, puis de travailler sur le frontend et notamment les règles de placement des pièces. A la fin de la séance de mercredi, il restait encore un problème de sauvegarde sur les pièces non carrées, mais le reste fonctionnait correctement. Le même problème était présent sur les règles de placement car il s'agit d'une mauvaise représentation des coordonnées de la pièce, qui sont gérées par une seule fonction. Plusieurs solutions s'offrent à nous pour régler ce problème, parmi lesquelles nous devront choisir. La plus simple serait simplement d'imposer une rotation de la pièce en fonction de son orientation, ce qui ne correspondrait pas au système de coordonnées utilisé mais devrait fonctionner. La plus compliquée consisterait à reprendre la globalité du système de coordonnées du projet. Par ailleurs, les règles de placement ont été nettement améliorées. Nous avons également implémenté un effet de transparence sur les calques de niveau supérieur au calque en édition, qui permet de mieux visualiser le projet.
Partie mécanique
Durant cette semaine, nous nous sommes concentré sur le "toboggan" à pièce. Dans un premier temps, nous avons réalisé un schéma ainsi qu'une maquette en carton de la pièce de manière à mieux la visualiser. Suite à une discussion avec M. Redon nous avons décider de réaliser en impression 3D. Nous avons donc réalisé la modélisation 3D de la pièce pour qu'il puisse l'imprimer.
Semaine 4
Application Web
Cette semaine a été l'occasion de continuer à débugger le projet, et de refaire certaines parties qui avaient été trop vite passées en début de projet. Une bonne partie du code fonctionnel a été réécrite pour factoriser plus les tâches et optimiser l'exécution. En outre, nous nous sommes rendus compte que notre projet risquait de présenter des problèmes d'optimisation pour des projets comportant plusieurs dizaines ou centaines de pièces. En effet, en mode suppression, nous sommes obligés de parcourir le tableau des pièces à chaque déplacement de souris pour placer correctement le masque indicateur de suppression. La première optimisation que nous avons ajoutée à cette partie est de considérer uniquement les pièces ayant une distance inférieure ou égale à 4 cases de la pièce, la taille maximale d'une pièce étant de 2 cases. Cependant, nous sommes obligés de parcourir la totalité du tableau car ce dernier n'est pas trié. Nous avons alors envisagé d'autres structures de données, mais aucune ne semble vraiment donner de meilleur résultat à l'exception d'un tableau à double entrée, mais dont le gain serait probablement très faible. La meilleure solution semble donc d'essayer d'alléger le fonctionnel au plus possible, ce qui sera un objectif de la semaine prochaine. Pour parfaire les règles de placement des pièces, qui sont pour l'instant complètement buguées, il nous faudra également un moyen efficace de parcourir le tableau et d'effectuer des vérifications sur les pièces.
Nous avons commencé (certes trop tard) à mettre par écrit les choix d'implémentation de l'application, ce qui nous permettra de gagner du temps à l'avenir. Une fois l'application de base totalement fonctionnelle, soit après l'implémentation des nouvelles règles de placement, nous pourrons nous attaquer aux nouvelles étapes de développement que sont la gestion des couleurs et du réservoir. Cependant, ces avancées seront pour le moment ralenties par la partie Hardware qui avance moins vite. Il y aura donc probablement dans les prochaines semaines une partie d'étude technologique pour l'implémentation du serveur d'impression sur la Raspberry Pi.
Partie mécanique
Il a fallut effectuer des modifications sur le réservoir qui n'avait pas le comportement attendu. De plus, nous avons effectué les modélisations 3D de deux systèmes différents pour réaliser la tête de déplacement des pièces.