Module SD universel pour Reprap: premier test grandeur nature !

Après une longue phase de debugging et d’incantations aux dieux de l’électronique, j’ai finalement osé tester mon petit montage sur l’imprimante 3D! (rappel des faits)

J’avais une boîte à imprimer pour madame, et j’ai profité de l’occasion pour essayer le bazar. Je ne vous cacherai pas qu’il y a eu quelques faux départs et réglages avant d’arriver à cette impression impeccable de 2h50 🙂

Le montage est connecté au port AUX1 de la carte RAMPS (connexion qu’on ne voit absolument pas sur cette photo…)

L’unique connexion se fait par 4 fils avec le port AUX1 du RAMPS. Ces 4 fils correspondent au +5V, 0V, Rx et Tx.

Donc ce module n’a pas besoin d’alimentation externe, ce qui est plutôt cool!

Et voilà une belle boîte pour ranger le mascara et autres poupouilles de salle de bain 🙂

Changement forcé de firmware sur l’imprimante 3D

Une nouvelle année s’ouvre à nous, et je vous la souhaite bien bonne!

Pour démarrer en beauté, j’ai commencé par « casser » mon imprimante 3D. Bravo champion!

L’histoire a commencé (enfin c’est ce que je pense) alors que je regardais jusqu’où je pouvais pousser mon plateau Y, dans l’idée d’imprimer une pièce assez grande (une pièce de quadricoptère, mais j’aurai tout loisir de revenir là-dessus dans les mois à venir!)

Bref, suite à ça, je vais pour imprimer une petite pièce en PLA, et là, paf! le plateau ne chauffe pas. Je contrôle la résistance du plateau, 1Ω et quelques (correct), mais à la sortie du RAMPS, j’avais 2 pauvres volts qui se couraient après pour alimenter le plateau (normalement on est à 12…)

Visiblement un fusible ou un Mosfet a grillé à cause d’un court circuit que je suppose provoqué par ma poussée un peu extrême du plateau (oui, les connexions sont artisanales…)

Alors je ne me démonte pas de souci, je remplace le RAMPS par un deuxième que j’avais en stock. Je rebranche tout mon petit bazar, j’allume, et là… j’ai plus rien compris au fonctionnement des moteurs. X et Y nickel, par contre Z et extrudeur ne tournaient plus. Ou si. Ah, et puis finalement non.

J’ai flashé l’Arduino avec la dernière version de Marlin, pas mieux. Alors après analyse, un des Pololus avait grillé, mais même en le remplaçant, j’avais un fonctionnement totalement aléatoire des moteurs Z et E…

Au bout d’une journée et demie d’agacement intensif et d’une envie (heureusement réprimée) de sauter dessus à pieds joints, j’ai décidé d’installer un autre firmware déjà essayé dans le passé sur une autre machine: Teacup.

Hé ben tu l’crois, tu l’crois pas: tout est rentré dans l’ordre. Les 4 axes fonctionnent, les endstops aussi, le plateau chauffant et la buse aussi, il n’y a plus qu’à tout recalibrer (depuis l’écriture ce cet article, c’est fait et ça marche nickel).

Des fois faut pas trop chercher… En tout cas pour moi, Marlin, c’est fini. Non Marlin, ne dis rien, je ne t’écouterai pas! Mais il va quand même que je trouve un palliatif pour pouvoir imprimer depuis une carte SD parce que là, je dois me brancher en USB depuis le PC…

CNC itération 2 : pratiquement achevée!

Pendant ces deux dernières semaines, j’ai bien travaillé! J’étais en vacances et il faisait un temps de chiotte, alors ça aide à se motiver à la maison…

J’ai complètement revu la conception de ma machine, le but étant de diminuer le nombre de pièces à imprimer, mais aussi d’avoir un minimum de pièces différentes.

CNC v2 : vue d'ensemble
CNC v2 : vue d’ensemble

J’utilise maintenant des coulisses de tiroirs pour le guidage. Ça a l’avantage d’être bien plus fiable que des tiges lisses et des paliers en plastique. Et contrairement à ce que j’annonçais dans mon précédent article, je suis resté sur l’idée d’un plateau Y, et d’un chariot X. Comme avant, quoi.

Enfin, j’ai fabriqué une table de fixation du brut, qui inclut le système de réglage de niveau présenté ici.

Optimisation des pièces à imprimer

Il n’y plus que cinq pièces distinctes :

Supports moteur (entretoise en bonus car je n’avais pas de vis M3 de 8mm)

CNC v2 - Support moteur

Plots d’espacement

CNC v2 - Plots

Supports d’écrou pour l’entraînement (composé de deux pièces pour limiter le jeu, sur le principe présenté ici)

CNC v2 - Ecrou sans jeu

Support d’outil (pour ma Dremel, un support en bas et un en haut)

CNC v2 - Support perceuse

Coulisses de tiroirs à billes

Alors ça, c’est l’idée du siècle, et je bénis le premier à l’avoir eue!

Je les ai achetées dans un grand magasin de bricolage dont le nom commence par Leroy et finit par Merlin (au passage, si vous connaissez un anglais pas ou peu francophone, faites-le lui prononcer, vous verrez c’est très amusant 🙂

Ce n’est pas très cher, entre 5 et 7 euros la paire selon la taille (il en faut trois paires). Par contre il faut faire attention à bien éviter la sciure dans le mécanisme car c’est très chiant à nettoyer…

Table de fixation

La fixation du brut sur la table, c’était un peu la misère pour moi jusqu’à présent. J’utilisais des serre-joints. ça impliquait d’avoir un brut qui fasse grosso modo la largeur de la table, même pour faire une petite pièce… Ça fait un peu de gâchis quand même.

Alors en regardant ce qui se faisait sur des vraies machines industrielles, j’ai opté pour une table de fixation avec des rainures en T, mais la mienne est roulée à la main sous les aisselles.

Elle va me permettre de fixer des pièces de petite taille à l’aide de boulons de 6 ou 8 et des rondelles.

CNC v2 - tableIl ne me reste plus qu’à la fixer et à régler son niveau, et les tests pourront reprendre! Particulièrement la gravure de circuits imprimés et d’une plaque pour mon ami Gégé 🙂

 

Petit tuto CamBam, de la modélisation à l’usinage

Je découvre peu à peu des nouvelles techniques; la modélisation 3D et l’impression, et maintenant l’usinage de pièces. L’approche de l’usinage est un peu différente de la « bête » impression 3D. Je dis bête, mais faut pas déconner, il y a plusieurs étapes:

  • La modélisation (c’est pas rien)
  • Le tranchage, qui génère le G-code
  • Avec le G-code, l’imprimante 3D fait son boulot

Pour l’usinage, il y a une bonne phase de boulot supplémentaire, qui consiste à définir les opérations à effectuer sur la pièce. Voici comment je m’y prends. N’hésitez surtout pas à me dire s’il y a plus simple!

1. Modélisation en 3D

 

modélisation

2. Exportation de face de la pièce en deux dimensions, au format DXF

export dxf

3. Import du DXF dans CamBam

import cambam

Lorsqu’on ouvre le fichier DXF dans CamBam, on voit en haut à gauche que toutes les lignes, les arcs, les cercles ont été créés dans un calque (nommé 0 par défaut).

On va réorganiser un peu toutes ces entités.

Tout d’abord, je crée un nouveau calque nommé « contour » en faisant un clic droit sur « calques » en haut à gauche. Puis je sélectionne toutes les entités du contour, et je les fais glisser dans ce nouveau calque.

calque-contour

Puis je sépare aussi les perçages et les deux poches pour pouvoir définir les opérations plus facilement.

4. Définir les dimensions de la pièce à usiner

Dans les propriétés du dossier Usinage, on va définir les dimensions du brut, c’est à dire dans mon cas le morceau de bois de 20mm d’épaisseur. Dans ce cas précis, seule l’épaisseur est importante, la largeur et la profondeur, on s’en fout. Faut juste que la pièce loge dedans :). Après cela, on positionne le bloc brut en définissant son décalage x, y et z (appelé surface pièce dans le CamBam). Perso, j’aime bien laisser la surface à zéro.

On en arrive donc ici:

proprietes-usinage

Pour la rotation 3D, il suffit d’appuyer sur Alt et de cliquer en glissant la souris.

Avant de passer à la suite, nous devons réunir toutes les lignes de notre contour en une seule entité, appelée polyligne. Sinon, le programme ne saura pas où est l’intérieur et l’extérieur de la forme.

Pour cela, on va sélectionner toutes les lignes, et aller dans le menu Edition>joindre (ou Ctrl+J). On donne la tolérance pour la jonction : 1mm ira très bien car les lignes sont déjà bout à bout.

Notre calque Contour contient ne maintenant plus que deux entités: le cercle central, et la polyligne du contour.

5. Créer les opérations d’usinage

On va maintenant sélectionner tout ce que contient le calque Contour puis cliquer, en haut à droite, sur le bouton couleur un peu caca Contour.

Par défaut, la profondeur finale correspond à l’épaisseur du brut définie plus haut. Hé hé… Il faut bien penser à lui indiquer quelle est le diamètre de la fraise (dans la zone de propriétés en bas à gauche). Ici, j’ai une fraise de 3.12mm. Renseigner aussi la profondeur des passes. Ici j’ai mis des passes fines parce que ma machine n’est pas hyper rigide, mais on peut attaquer plus fort avec une meilleure machine.

Maintenant, clic droit sur l’opération de contour fraichement créée, et Générer le parcours d’outil.

decoupage-contour

La classe! On voit que la fraise va bien faire tout le tour de notre objet, couche par couche, pour le découper.

Petite précision sur cette opération de contour : si on laisse comme ça, et qu’on veut faire par la suite d’autres opérations (les deux poches et les perçages), on va avoir un problème car la pièce bougera, fatalement… Vu qu’elle aura été découpée.

Alors soit on fait la découpe du contour à la fin, soit on ajoute des attaches. Ce la permet de laisser un peu de matière entre le brut et la pièce découpée.

Pour cela, dans les propriétés du contour, je clique sur le bouton Avancé, puis je vais sur la propriété Gestion des attaches, et je sélectionne Automatique. Je régénère le parcours d’outil, et… oh… c’est beau…

attaches

Le programme a automatiquement généré des mouvements pour créer les attaches. On peut éventuellement déplacer les points d’attache à notre guise s’ils ne sont pas bien positionnés. CamBam a aussi créé des attaches autour du rond central, mais ce n’est pas bien grave.

Bien! Maintenant nous allons créer l’opération pour les deux poches dans lesquelles les axes vont s’enfiler. Pour cela, nous sélectionnons les deux cercles, et créons une opération Poche. Puis dans les propriétés de la poche, on indique jusqu’où on veut creuser. 10mm, ça me semble correct, donc la profondeur finale est à -10. On génère le parcours d’outil et hop:

poches

Même approche pour les perçages, on crée une opération de perçage sur les 4 cercles.

percage

Hé ben voilà! on a défini toutes nos opérations, il n’y a plus qu’à générer le G-code. Ce sont les instructions qui seront envoyées à la machine.

Un clic droit sur Usinage, puis Créer le fichier GCode. On l’enregistre sur le disque dur, et c’est gagné!

6. Importer dans Repetier-Host

[edit 21.01.2016: Maintenant je tourne avec grbl sur la carte, et l’excellent bCNC côté PC. Il y a aussi Universal G-Code Sender qui marche bien avec grbl.]

Alors moi, une fois arrivé là, je modifie mon fichier G-code pour ajouter un point-virgule devant les lignes entre parenthèses.
En effet, les parenthèses et les lignes commencées par un point-virgule sont des commentaires G-code, mais Repetier-Host ne gère que les point-virgules et s’arrête s’il trouve des parenthèses…
Quand c’est fait, je copie-colle l’intégralité de mon G-code dans Repetier-Host. J’utilise Repetier parce que mon firmware est Marlin, sur un environnement Arduino Mega + RAMPS, et je suis habitué à ce logiciel. Ici, pas de tranchage évidemment. On s’en sert juste pour envoyer du G-code à l’Arduino, pour piloter les axes x, y et z.

repetier

Pas d’inquiétude, Repetier-Host n’affichera pas de preview du G-code.

Il faut maintenant régler la position zéro de la machine. Pour cela, à l’aide des commandes manuelles de Repetier, je positionne la pointe de ma fraise (qui ne tourne pas!!) en X et Y. Ensuite, je la descends en Z jusqu’à ce qu’elle soit juste à fleur de la surface du brut. C’est du réglage visuel…

Quand elle est positionnée pile comme je veux, j’envoie une commande d’arrêt d’urgence depuis Repetier, pour remettre à zéro toutes les positions courantes dans le firmware (car les mouvements manuels ont modifié les valeurs internes de position dans Marlin).

Ce point est très important si on ne veut pas tout casser (j’ai cassé un coupleur à cause de ça) ou mettre le feu…

7. Et enfin… lancer la machine !

Tout est prêt? la mèche est à fleur de la surface? Alors on va juste la remonter de 3mm (toujours à l’aide des commandes manuelles de Repetier) et démarrer la Dremel. Lunettes de sécurité, bouchons d’oreilles, bonnet de bain, tout ce que vous voulez.

Et voilà, il n’y a plus qu’à cliquer sur le gros bouton Démarrer job dans Repetier, serrer les fesses et apprécier le spectacle!

Tuto OpenSCAD, coupleur paramétrable

Je m’essaie doucement à OpenSCAD. Si vous ne connaissez pas encore, c’est un logiciel de conception 3D paramétrique pour les gars qui ont au moins 25mm de barbe (ou les filles qui ont un minimum de 5mm de poils aux pattes).
Comparé à SolidWorks auquel je suis assez habitué, c’est… du roots!
Pour modéliser une pièce, il faut écrire un programme.

Il y a les formes de base, comme cube() ou cylinder(), des fonctions booléennes comme union() ou difference(), des fonctions de transformation, comme translate() ou rotate(). Et bien sûr beaucoup d’autres fonctionnalités que je n’ai pas testées, pour faire des révolutions, des extrusions en suivant un chemin et plein d’autres.

Vous vous souvenez de mon coupleur 5/8mm? Hé bien je l’ai refait dans OpenSCAD pour le rendre paramétrable à souhait et utilisable dans le module Customizer de Thingiverse (https://www.thingiverse.com/thing:299663).

Résultat fini

openscadcc_1

Classe, non ? Et concis, parce que le programme ne fait que 122 lignes (formaté et tout).

Après plusieurs expérimentations d’OpenSCAD, je me suis rendu compte qu’il était TRES important de travailler par modules. C’est l’équivalent des fonctions dans n’importe quel langage de programmation. Ca paermet de structurer le code, et d’éviter de se répéter (la règle fondamentale du DRY -> Don’t Repeat Yourself).

Nous allons écrire le premier module, qui va simplement dessiner le…

Cylindre principal

Facile. Dans ce module, nous appelons la fonction native cylinder(), en lui passant des paramètres nommés : h, r, center et $fn.

h est la hauteur du cylindre
r est son rayon
center indique si le cylindre doit être centré sur l’axe Z
$fn est la résolution, c’est à dire le nombre de segments qui composent le cylindre.

Pour appeler ce module, nous devrons fournir le diamètre. La hauteur et la résolution sont fixées dans des variables globales au début du programme (ils deviendront des paramètres dans le customizer de Thingiverse).

Si on appelle main_cylinder(24), nous obtenons le résultat suivant :

openscadcc_2

On peut voir que notre cylindre est automatiquement centré en X et Y, et que sa base est sur le plan Z=0.

Voici le programme complet. Comme je l’ai mis sur Thingiverse, j’ai fait les commentaires en anglais, et comme je suis une grosse feignasse, je ne les traduirai pas!

Un cylindre, c’est bien beau mais ça ne fait pas tout; il va falloir le percer.
Nous allons pour cela utiliser la fonction booléenne difference().

Perçage du cylindre principal

Créons un deuxième cylindre, de diamètre plus petit et de la même hauteur que notre cylindre principal :
[codesyntax lang= »php »]

[/codesyntax]

Si on appelle successivement

on verra toujours seulement notre cylindre principal. Le petit est « dedans ».
En revanche, si on écrit :

openscadcc_3

Voilà qui devient intéressant! Par contre on peut voir au niveau du trou que c’est assez bizarre:

openscadcc_4Ce zigouigoui est causé par une épaisseur nulle, et ça peut poser des problèmes par la suite, lors du tranchage de l’objet (facettes fantômes, normales inversées… que du bonheur…)
Alors pour éviter ça, on va juste rallonger le 2ème cylindre de 1mm en haut et en bas, et ça va aller tout de suite mieux. En plus, ça va nous permettre d’utiliser la fonction translate(), car doit rallonger la hauteur du cylindre de 2mm, et le décaler vers le bas de 1mm. Voici le programme complet:

J’appelle cette constante ozp (offset-zero-planes), et nous allons l’utiliser à plusieurs endroits par la suite.
C’est une bonne chose de prévoir ceci dès le début, comme ça on n’aura pas de surprises avec le STL par la suite.

Ce qui nous donne :

openscadcc_5

Cool! Propre et tout 🙂

Maintenant c’est pas le tout, mais nous voulons deux diamètres pour notre trou central. Nous allons écrire deux modules, qui prennent en paramètre les diamètres respectifs et qui vont percer le cylindre en haut et en bas.
On va aussi créer un module main() dans lequel les opérations de différence sont faites, ce qui nous donne le programme suivant:

Et voici le résultat (dans une vue fil de fer par en dessous, pour bien voir le décalage à l’intérieur)

openscadcc_6

Ouvertures latérales

Occupons nous maintenant de l’ouverture du côté des vis de serrage (avec dans l’idée que sa largeur devra être paramétrable dans le customizer thingiverse).

Nous allons pour cela définir un parallélépipède rectangle avec la fonction cube(), en lui donnant ses 3 dimensions.
Et nous allons décaler ce cube avec translate() pour qu’il vienne se positionner au bon endroit. On n’oublie pas le paramètre ozp pour éviter les facettes fantômes, et nous créons un nouveau paramètre opening_width (largeur de l’ouverture).

Nous allons dans la foulée réaliser la rainure en face, qui est composée d’un cylindre et d’un pavé.
Nous ajoutons le paramètre articulation_thickness, qui correspond à l’épaisseur de matière qui relie les deux parties du coupleur.

On ajoute ces deux modules dans le module main(), on sort encore quelques paramètres et voici le programme complet:

openscadcc_7

Bien! Maintenant, passons aux…

Emplacements des boulons de serrage

Pour les trous des boulons, nous allons écrire un module qui prend en paramètre la hauteur (z), et qui crée une empreinte de boulon. On calcule un offset Y pour que l’empreinte tombe au milieu de la partie pleine du coupleur. Puis on perce le trou principal (diamètre: bolt_diameter), l’empreinte de l’écrou (nut_diameter, avec une résolution de 6 segments… futé :), et enfin l’empreinte de la rondelle ou de la tête de la vis (washer_diameter).

Le module main() devient :

Résultat

openscadcc_1

Pour aller plus loin, jetez vous sur le tutoriel de RepRapide.fr!

Quand la buse est trop près de la plaque de verre…

Nouveau problème récent avec ma Prusa 🙂

Jusqu’à présent, j’avais imprimé des objets avec une surface relativement réduite. Ce week-end, j’ai lancé l’impression d’un objet dont la base est un disque plein de 9cm de diamètre. Epaisseur de la 1ère couche : 0.1mm, épaisseur des autres couches, 0.2mm.

L’impression démarre, je surveille un peu, ça a l’air de rouler, alors je la laisse continuer comme une grande.

Je reviens 1h30 plus tard, et là… C’est le drame. Enfin le drame… Disons que l’impression se déroulait correctement, mais sans extruder quoi que ce soit. Sympa… J’ouvre l’extrudeur, et là, je vois que la vis rugueuse qui entraine le filament a patiné, et a bouffé le filament sur la moitié de son épaisseur. Sur le coup, je me dis que comme c’est la fin du rouleau, les boucles sont plus serrées, et peut-être que la descente du filament est gênée par cette courbure.

Je retire le filament de la base, je passe sur une bobine neuve, je réinsère le filament. En le poussant à la main, ça sort en bas.

Alors je relance l’impression, mais même topo. Le filament est bloqué dans sa descente, et la vis patine.

En retirant le filament, je me rends compte qu’il y a une espèce de surépaisseur à la jointure entre le Jhead et l’extrudeur.

Hé ben vous savez quoi? La sortie de ma buse était trop proche du verre. A l’impression de la 1ère couche, le PLA était gêné à la sortie. Cela provoquait une surpression dans le Jhead, ce qui entrainait un bourrage à la jointure entre le corps de l’extrudeur et le Jhead, bloquant le filament. Et la vis d’entrainement patinait.

En remontant très légèrement le zéro de mon Z, la matière sort plus facilement et du coup, plus de bourrage 🙂

 

Visualiser les fichiers STL

J’ai remarqué qu’il n’était pas toujours évident d’avoir un aperçu facile et rapide d’un lot de fichiers STL.

Dans les outils que j’ai pu trouver, il faut importer chaque STL pour pouvoir le visualiser. Alors je ne me suis pas démonté, j’ai fait le mien.

On lui donne un répertoire, qu’il scanne récursivement à la recherche des fichiers STL. Le tout apparait dans une liste, et on peut rapidement passer d’un modèle à un autre sans se prendre la tête.

Le programme a été écrit en C#, et s’appuie sur la librairie VTK : un monstre outil pour visualiser tout et n’importe quoi facilement. A l’époque, je l’avais utilisé en C++ pour construire des modèles 3D à partir de séries d’images DICOM (issues d’IRM ou de scanners). Là, pour le C#, j’ai utilisé le portage Activiz.NET.

On peut afficher seulement les surfaces, surfaces et arêtes, arêtes seules, ou rien du tout (mais ça perd un peu de son intérêt).

La caméra est pilotable avec la souris :

  • clic molette + drag ->pan
  • clic gauche + drag ->rotation
  • molette -> zoom

Télécharger DirtySTL Viewer

Sources: https://github.com/toxnico/dirty-stl-viewer

dirty_stl_reader_2 dirty_stl_reader_1

Blender sous linux

Hey, j’ai testé hier soir Blender sous Linux, en suivant le Getting started.

Ca a l’air plutôt bien fait et utilisable, malgré le fait qu’il faille apprendre de nouveaux raccourcis clavier…

Je ne sais pas pourquoi, j’en avais le souvenir d’un logiciel hyper barbu, mais il me semble finalement accessible. A moins que ce soit ma barbe qui s’allonge…

Snapping, disions-nous

Le snapping, c’est cool. Mais c’est surtout capital pour pouvoir aligner un objet soit sur la grille, soit avec un autre objet.

On peut activer temporairement le snapping en gardant appuyées au choix la touche :

  • X (snap sur un croisement de la grille)
  • V (snap sur un sommet de poly)
  • C (snap sur une courbe de NURBS)

Le fonctionnement du snapping est intimement lié à la position du pivot de l’objet à déplacer. En effet, c’est le pivot de l’objet que l’on va coller à l’élément désiré.

Et comme le pivot, de base, se trouve au centre des objets, il faut pratiquement toujours le déplacer sur une face de l’objet, sur un de ses sommets, ou sur une arête.

Prenons un exemple : j’ai un plan tout bête et un cube complètement idiot; je veux plaquer le cube sur ce plan.

Pour faire ça, je dois d’abord descendre le pivot de mon cube sur sa face inférieure. C’est ce pivot qui sera ensuite collé au plan.

  • Je garde la touche D appuyée, pour passer en mode déplacement de pivot,
  • Je déplace un petit peu le pivot sur son axe vertical afin de contraindre le snapping sur cet axe,
  • J’appuie sur V pour dire que je veux snapper sur un sommet(vertex),
  • Je me positionne sur un vertex du bas de mon cube et je clique sur la molette de ma souris en bougeant un peu autour du vertex (c’est important)

Eeeeeet hop ! Mon pivot est descendu et il est calé pile poil sur la face inférieure du cube.

Maintenant, je veux aligner ce pivot sur le plan. Je dois snapper sur un des sommets du susdit plan…

  • Je sélectionne mon cube et passe en mode déplacement (W).
  • Je contrains le déplacement sur l’axe vertical en bougeant un petit peu le cube (l’axe devient jaune).
  • Je maintiens la touche V
  • Je clique avec la molette sur un vertex quelconque de mon plan (il faut encore une fois bouger un peu la souris pour que Maya chope le vertex)

Tac! Mon cube est maintenant parfaitement aligné avec le plan.

Bientôt des images pour illustrer ces manipulations 🙂