Recycler 2 lecteurs DVD en Mini Traceur (CNC Plotter) avec un Arduino Uno et 2 ponts en H L293D

On trouve de nombreux projets pour recycler d’anciens lecteurs de DVD en mini traceur CNC (CNC Plotter) à base d’Arduino. C’est un projet sympa et idéal pour débuter avec son Arduino. La réalisation mécanique et plus particulièrement le support de crayon peut être difficile. Je vous propose donc dans cet article de réaliser un mini traceur en réalisant les éléments mécaniques par impression 3D. Nous utiliserons deux ponts en H L293D pour piloter les moteurs des lecteurs de DVD. On en trouve pour moins de 2€ en Chine.

Etape 1 : matériel nécessaire pour réaliser le Mini Plotter CNC

J’ai essayé d’employer des matériaux que l’on peut se procurer facilement en magasin de bricolage et des composants les moins chers possibles pour la fabrication du Mini Traceur. Pour piloter les moteurs pas à pas des axes X et Y, nous avons deux possibilités. Soit utiliser deux ponts en H L293D (un pour chaque axe), c’est ce qui coûte le moins cher, soit utiliser un Motor Shield pour Arduino.

Etape 2 : Démonter les lecteurs de DVD pour récupérer les systèmes de translation

Démontez vos lecteurs de DVD pour ne conserver que le mécanisme de déplacement de la tête de lecture. Vous pouvez également démonter (et conserver) le moteur d’ouverture de la porte (ce n’est pas toujours facile).

mini traceur cnc plotter projets diy lecteur dvd

Système de déplacement linéaire récupéré sur un lecteur de DVD

Quelques astuces

Je vous conseille une course d’au moins 35mm. Certains lecteurs ont une course plus courte. Il est possible de le changer dans les réglages mais j’ai trouvé la mise au point laborieuse et surtout la surface de dessin sera vraiment petite.

Retirez tous les éléments électroniques de la tête de lecture(et les conserver pour d’autres projets). Il faut obtenir une surface plane pour pouvoir coller correctement le plateau de dessin et le porte de crayon.

Etape 3 : Préparer les moteurs pas à pas (stepper motors) des axes X et Y

Dans cette étape, nous allons réaliser les soudures sur les moteurs pas à pas des axes X et Y.

Nous avons deux possibilités pour souder les fils sur les moteurs pas à pas. La première solution consiste à souder directement les fils au niveau du moteur. Sur certains moteurs comme celui-ci c’est assez facile car les 4 pistes sont bien distincts.

Je vous le déconseille toutefois car vous risquer des désouder les fils des bobines ou des les arracher ultérieurement lors du montage. Je vous conseille plutôt de réaliser vos soudures au niveau du ruban souple. Tout d’abord, utilisez un cutter pour séparer chaque piste sur environ 2cm. Etamez ensuite le bout de la piste et le fil préalablement dénudé. Protégez chaque soudure avec un morceau de 25mm de gaine thermo-retractable.

mini traceur cnc plotter soudure stepper motor projetdisy mini traceur cnc plotter soudure stepper motor gaine thermo projetdisy

Il n’y a aucun repérage sur le moteur mais le branchement est assez simple. Le premier fil correspond (en général) à la 1ère sortie du L293D (ou Motor Shield) et ainsi de suite. Je vous conseille vivement d’utiliser un code couleur pour vous y repérer plus facilement lors du câblage.

Etape 4 : Impression des éléments de structure

Vous pouvez récupérer les fichiers STL des éléments de structure à imprimer sur Thingiverse ou Cults3D.

Le kit contient les éléments de structure suivants :

Elément 3D Quantité
Equerres de fixation des montants de l’axe X  mini traceur cnc plotter arduino equerres montants axe Y 4x
Entretoises  mini traceur cnc plotter arduino entretoises supports axex x et y 4x

4x

Equerres de fixation pour la breadboard  mini traceur cnc plotter arduino equerre breadboard 4x
Plateau support axe Z  mini traceur cnc plotter arduino support porte crayon 1x
Porte crayon pour crayon de diamètre 8mm (par exemple pour Stabilo Point 88)  mini traceur cnc plotter arduino porte crayon diametre 8mm 1x
Bague anti-basculement diamètre 8mm  mini traceur cnc plotter arduino bague anti basculement  1x

Tous les éléments de structure ont été conçu à l’aide du logiciel open source Open Scad. Vous êtes libre de les adapter en fonction de vos besoins. Vous aurez besoin de 9.55m de PLA (29 grammes). L’impression en mode rapide demande environ 3h sur ma Dagoma discovery200.

elements de structure impression3d mini traceur cnc plotter arduino

Eléments de structure à imprimer en 3D.

Etape 5 : Fabrication de la structure en contreplaqué

Pour réduire le coût du projet, j’ai opté pour réaliser la structure en contreplaqué de 10mm d’épaisseur disponible dans n’importe quel magasin de bricolage. La fabrication est très simple. Il n’y a que 3 plaques de contreplaqué à découper. Vous devrez adapter le perçage pour la fixation des axes en fonction de vos lecteurs de DVD. Généralement, l’entre axe est de 85mm en largeur. La longueur est variable.

Etape 6 : Branchement du circuit

Le câblage du Mini Traceur est assez simple. Il est composé de 2 ponts en H L293D et d’un servomoteur pour l’axe Z. Une breadboard 400 points est suffisante.

mini traceur cnc plotter arduino schema de cablage breadboard

mini traceur cnc plotter arduino projet diy cablage l293d breadboard

Câblage des deux ponts en H L293D

mini traceur cnc plotter arduino projet diy zoom cablage arduino

Câblage de l’Arduino Uno

Etape 7 : Assemblage du Mini Traceur

Axes X et Y

Commencez par fixer l’axe X à l’aide des 4 entretoises et de 4 vis M4 x 30mm.

Fixez ensuite les 2 montants verticaux de l’axe Y en venant vous appuyer contre le cadre de l’axe X à l’aide des 4 équerres.

Enfin fixez l’axe Y sur les montants verticaux. La hauteur n’est pas importante, elle sera régler ultérieurement en ajustant simplement la position du crayon dans son support.

Vue de droite du mini traceur assemblé.

Vue de droite du mini traceur assemblé.

Plateau de dessin

Utilisez un pistolet à colle pour fixer le plateau de dessin. Pour trouver la bonne position du plateau, je vous conseille de déplacer le chariot au maximum. Utilisez des rondelles pour ajuster la planéité du plateau de dessin. Inutile de sortir le niveau à bulle, le ressort va compenser les petits défauts.

mini traceur cnc plotter arduino projet diy zoom plateau dessin

Plateau de dessin correctement réglé et fixé (vue de face)

Porte crayon (axe Z)

Après avoir vissé le servomoteur à l’aide de 2 vis M2 (ou collé) sur le support, collez celle-ci sur le chariot de l’axe Y.

Insérer l’axe de diamètre 3mm par le haut. En maintenant le ressort, mettez en place sur porte crayon puis glissez l’axe dans le logement prévu sur le porte crayon. Allez jusqu’en butée. Terminez le montage en ajoutant le serrage du crayon qui sert également d’arbre pour lever le porte crayon. Pour assembler le système de serrage, vissez un écrou M5 sur une vis M5 x 25mm en laissant un espace de 3 mm. Insérez la vis dans le logement puis vissez l’écrou papillon.

mini traceur cnc plotter arduino vue ensemble porte crayon

Modèle 3D du porte crayon sur son support

 

Vue de gauche du porte crayon Vue de droite du porte crayon
mini traceur cnc plotter arduino projet diy zoom gauche porte crayon mini traceur cnc plotter arduino projet diy zoom droit porte crayon

Breadboard et Arduino

Fixez la breadboard sur les 2 montants à l’aide en collant les 4 équerres. L’Arduino prend place sous la breadboard à l’arrière du traceur.

mini traceur cnc plotter arduino projet diy arriere breadboard

Vue arrière : breadboard accueillant les deux L293D et l’arduino

Etape 8 : Test des axes X / Y et valeurs de calibration

Le câblage et l’assemblage réalisé, nous allons maintenant pouvoir tester le bon fonctionnement de mouvements des axes X et Y et calculer les valeurs de calibration.

Test de l’axe X

L’axe X est relié aux Pins 8, 9, 10 et 11. Lancez ce code pour tester si l’axe X se déplace comme prévu. Par défaut il a du se déplacer de 100 pas. En divisant 100 par la distance parcourue en millimètre, vous obtenez la calibration de l’axe X nécessaire pour la configuration.

/*
  Mini Traceur Arduino (CNC Plotter)
  Test de l'axe X
  Projets DIY 02/2016
*/
#include <Stepper.h>         //Librairie pour piloter les moteurs pas à pas
 
const int pasParRotation = 20;  //Nombre de pas pour réaliser un tour
 
//Pins sur lesquels est relié le moteur de l'axe X
Stepper myStepperX(pasParRotation, 8,9,10,11); 
 
void setup() {
 myStepperX.setSpeed(100);      //Vitesse de déplacement
 //Indiquer le nombre de pas que le moteur pas à pas doit faire
 //Généralement un moteur de lecteur CD/DVD peut faire 250 pas au maxium
 //Indiquer un chiffre négatif pour inverser le sens de déplacement
 myStepperX.step(100);          
 delay(100);
}
 
void loop() {}

Test de l’axe Y

Procédez de la même manière pour tester l’axe Y et calculez la valeur de calibration.

/*
  Mini Traceur Arduino (CNC Plotter)
  Test de l'axe Y
  Projets DIY 02/2016
*/
#include <Stepper.h>         //Librairie pour piloter les moteurs pas à pas
 
const int pasParRotation = 20;  //Nombre de pas pour réaliser un tour
 
//Pins sur lesquels est relié le moteur de l'axe X
Stepper myStepperX(pasParRotation, 2,3,4,5); 
 
void setup() {
 myStepperX.setSpeed(100);      //Vitesse de déplacement
 //Indiquer le nombre de pas que le moteur pas à pas doit faire
 //Généralement un moteur de lecteur CD/DVD peut faire 250 pas au maxium
 //Indiquer un chiffre négatif pour inverser le sens de déplacement
 myStepperX.step(100);          
 delay(100);
}
 
void loop() {}

Problèmes fréquents

Voici les principaux problèmes que j’ai rencontré durant la mise au point de mon traceur.

  • Le moteur ne bouge pas : commencez par vérifier le câblage du L293D. Les Pins IN et OUT sont peut être inversés.
  • Le sens de déplacement est inversé. Inversez les branchements au niveau du L293D. Les deux fils du haut vont en bas et inversement et ça devrait fonctionner.
  • Le moteur s’arrête, ne va pas à la fin de sa course ou “saute”. Il y a probablement un obstacle sur son chemin. Vérifiez si une vis de fixation n’est pas trop longue…

Etape 9 : Chargement du code CNC dans l’Arduino


Calibration des axes X et Y
Notre mini traceur est presque terminé, il ne reste plus qu’à charger le programme CNC dans l’Arduino. Avant de téléverser le programme, vous devrez ajuster les paramètres suivants en fonction de votre Mini Traceur (une section configuration se trouve au début du code) :

  • Angle du servomoteur pour lever le crayon
  • Angle du servomoteur pour baisser le crayon
Attention : il ne faut pas utiliser le servomoteur pour appuyer le crayon sur la feuille. La force exercée par le servomoteur risque d’être trop forte et empêcher le déplacement de l’axe X. Le crayon est appuyé sur la feuille grâce au ressort.
/* 
 Mini Traceur CNC Arduino
 Traduction de la configuration du traceur en français et ajout d'une variable "vitesseDeplacement" permettant d'ajuster la vitesse de déplacement des axes X et Y
 Projets DIY - 02/2016
 
 D'après 
 Mini CNC Plotter firmware, based in TinyCNC https://github.com/MakerBlock/TinyCNC-Sketches
 Send GCODE to this Sketch using gctrl.pde https://github.com/damellis/gctrl
 Convert SVG to GCODE with MakerBot Unicorn plugin for Inkscape available here https://github.com/martymcguire/inkscape-unicorn
 
 More information about the Mini CNC Plotter here (german, sorry): http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/
  */

#include <Servo.h>
#include <Stepper.h>

#define LINE_BUFFER_LENGTH 512

/*
   PARAMETRES DE CONFIGURATION
*/

const int penZUp = 130;                 // Angle servomoteur, crayon relevé
const int penZDown = 40;                            // Angle servomoteur, crayon baissé
const int penServoPin = 6;              // Pin sur lequel est relié le servomoteur
const int stepsPerRevolution = 20;              // Valeur par défaut
const int vitesseDeplacement = 250;             // Vitesse de déplacement des axes X et Y

Servo penServo;                     // Objet pour actionner le servomoteur

// Initialisation des moteurs pas à pas pilotés à l'aide d'un pont H L293D
Stepper myStepperY(stepsPerRevolution, 2,3,4,5);    // Axe Y         
Stepper myStepperX(stepsPerRevolution, 8,9,10,11);  // Axe X

// Calibration, nombre de pas par millimètre
float StepsPerMillimeterX = 6.0;
float StepsPerMillimeterY = 6.0;

/*
    FIN DE LA CONFIGURATION
*/

/* Structures, global variables    */
struct point { 
  float x; 
  float y; 
  float z; 
};

// Current position of plothead
struct point actuatorPos;

//  Drawing settings, should be OK
float StepInc = 1;
int StepDelay = 0;
int LineDelay = 50;
int penDelay = 50;

// Drawing robot limits, in mm
// OK to start with. Could go up to 50 mm if calibrated well. 
float Xmin = 0;
float Xmax = 40;
float Ymin = 0;
float Ymax = 40;
float Zmin = 0;
float Zmax = 1;

float Xpos = Xmin;
float Ypos = Ymin;
float Zpos = Zmax; 

// Set to true to get debug output.
boolean verbose = false;

//  Needs to interpret 
//  G1 for moving
//  G4 P300 (wait 150ms)
//  M300 S30 (pen down)
//  M300 S50 (pen up)
//  Discard anything with a (
//  Discard any other command!

/**********************
 * void setup() - Initialisations
 ***********************/
void setup() {
  //  Setup
  Serial.begin( 9600 );
  
  penServo.attach(penServoPin);
  penServo.write(penZUp);
  delay(200);

  // Decrease if necessary
  myStepperX.setSpeed(vitesseDeplacement);
  myStepperY.setSpeed(vitesseDeplacement);  

  //  Set & move to initial default position
  // TBD

  //  Notifications!!!
  Serial.println("Mini CNC Plotter alive and kicking!");
  Serial.print("X range is from "); 
  Serial.print(Xmin); 
  Serial.print(" to "); 
  Serial.print(Xmax); 
  Serial.println(" mm."); 
  Serial.print("Y range is from "); 
  Serial.print(Ymin); 
  Serial.print(" to "); 
  Serial.print(Ymax); 
  Serial.println(" mm."); 
}

/**********************
 * void loop() - Main loop
 ***********************/
void loop() 
{
  delay(200);
  char line[ LINE_BUFFER_LENGTH ];
  char c;
  int lineIndex;
  bool lineIsComment, lineSemiColon;

  lineIndex = 0;
  lineSemiColon = false;
  lineIsComment = false;

  while (1) {

    // Serial reception - Mostly from Grbl, added semicolon support
    while ( Serial.available()>0 ) {
      c = Serial.read();
      if (( c == '\n') || (c == '\r') ) {             // End of line reached
        if ( lineIndex > 0 ) {                        // Line is complete. Then execute!
          line[ lineIndex ] = '\0';                   // Terminate string
          if (verbose) { 
            Serial.print( "Received : "); 
            Serial.println( line ); 
          }
          processIncomingLine( line, lineIndex );
          lineIndex = 0;
        } 
        else { 
          // Empty or comment line. Skip block.
        }
        lineIsComment = false;
        lineSemiColon = false;
        Serial.println("ok");    
      } 
      else {
        if ( (lineIsComment) || (lineSemiColon) ) {   // Throw away all comment characters
          if ( c == ')' )  lineIsComment = false;     // End of comment. Resume line.
        } 
        else {
          if ( c <= ' ' ) {                           // Throw away whitepace and control characters
          } 
          else if ( c == '/' ) {                    // Block delete not supported. Ignore character.
          } 
          else if ( c == '(' ) {                    // Enable comments flag and ignore all characters until ')' or EOL.
            lineIsComment = true;
          } 
          else if ( c == ';' ) {
            lineSemiColon = true;
          } 
          else if ( lineIndex >= LINE_BUFFER_LENGTH-1 ) {
            Serial.println( "ERROR - lineBuffer overflow" );
            lineIsComment = false;
            lineSemiColon = false;
          } 
          else if ( c >= 'a' && c <= 'z' ) {        // Upcase lowercase
            line[ lineIndex++ ] = c-'a'+'A';
          } 
          else {
            line[ lineIndex++ ] = c;
          }
        }
      }
    }
  }
}

void processIncomingLine( char* line, int charNB ) {
  int currentIndex = 0;
  char buffer[ 64 ];                                 // Hope that 64 is enough for 1 parameter
  struct point newPos;

  newPos.x = 0.0;
  newPos.y = 0.0;

  //  Needs to interpret 
  //  G1 for moving
  //  G4 P300 (wait 150ms)
  //  G1 X60 Y30
  //  G1 X30 Y50
  //  M300 S30 (pen down)
  //  M300 S50 (pen up)
  //  Discard anything with a (
  //  Discard any other command!

  while( currentIndex < charNB ) {
    switch ( line[ currentIndex++ ] ) {              // Select command, if any
    case 'U':
      penUp(); 
      break;
    case 'D':
      penDown(); 
      break;
    case 'G':
      buffer[0] = line[ currentIndex++ ];          // /!\ Dirty - Only works with 2 digit commands
      //      buffer[1] = line[ currentIndex++ ];
      //      buffer[2] = '\0';
      buffer[1] = '\0';

      switch ( atoi( buffer ) ){                   // Select G command
      case 0:                                   // G00 & G01 - Movement or fast movement. Same here
      case 1:
        // /!\ Dirty - Suppose that X is before Y
        char* indexX = strchr( line+currentIndex, 'X' );  // Get X/Y position in the string (if any)
        char* indexY = strchr( line+currentIndex, 'Y' );
        if ( indexY <= 0 ) {
          newPos.x = atof( indexX + 1); 
          newPos.y = actuatorPos.y;
        } 
        else if ( indexX <= 0 ) {
          newPos.y = atof( indexY + 1);
          newPos.x = actuatorPos.x;
        } 
        else {
          newPos.y = atof( indexY + 1);
          indexY = '\0';
          newPos.x = atof( indexX + 1);
        }
        drawLine(newPos.x, newPos.y );
        //        Serial.println("ok");
        actuatorPos.x = newPos.x;
        actuatorPos.y = newPos.y;
        break;
      }
      break;
    case 'M':
      buffer[0] = line[ currentIndex++ ];        // /!\ Dirty - Only works with 3 digit commands
      buffer[1] = line[ currentIndex++ ];
      buffer[2] = line[ currentIndex++ ];
      buffer[3] = '\0';
      switch ( atoi( buffer ) ){
      case 300:
        {
          char* indexS = strchr( line+currentIndex, 'S' );
          float Spos = atof( indexS + 1);
          //          Serial.println("ok");
          if (Spos == 30) { 
            penDown(); 
          }
          if (Spos == 50) { 
            penUp(); 
          }
          break;
        }
      case 114:                                // M114 - Repport position
        Serial.print( "Absolute position : X = " );
        Serial.print( actuatorPos.x );
        Serial.print( "  -  Y = " );
        Serial.println( actuatorPos.y );
        break;
      default:
        Serial.print( "Command not recognized : M");
        Serial.println( buffer );
      }
    }
  }



}


/*********************************
 * Draw a line from (x0;y0) to (x1;y1). 
 * Bresenham algo from https://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/
 * int (x1;y1) : Starting coordinates
 * int (x2;y2) : Ending coordinates
 **********************************/
void drawLine(float x1, float y1) {

  if (verbose)
  {
    Serial.print("fx1, fy1: ");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.println("");
  }  

  //  Bring instructions within limits
  if (x1 >= Xmax) { 
    x1 = Xmax; 
  }
  if (x1 <= Xmin) { 
    x1 = Xmin; 
  }
  if (y1 >= Ymax) { 
    y1 = Ymax; 
  }
  if (y1 <= Ymin) { 
    y1 = Ymin; 
  }

  if (verbose)
  {
    Serial.print("Xpos, Ypos: ");
    Serial.print(Xpos);
    Serial.print(",");
    Serial.print(Ypos);
    Serial.println("");
  }

  if (verbose)
  {
    Serial.print("x1, y1: ");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.println("");
  }

  //  Convert coordinates to steps
  x1 = (int)(x1*StepsPerMillimeterX);
  y1 = (int)(y1*StepsPerMillimeterY);
  float x0 = Xpos;
  float y0 = Ypos;

  //  Let's find out the change for the coordinates
  long dx = abs(x1-x0);
  long dy = abs(y1-y0);
  int sx = x0<x1 ? StepInc : -StepInc;
  int sy = y0<y1 ? StepInc : -StepInc;

  long i;
  long over = 0;

  if (dx > dy) {
    for (i=0; i<dx; ++i) {
      myStepperX.step(sx);
      over+=dy;
      if (over>=dx) {
        over-=dx;
        myStepperY.step(sy);
      }
      delay(StepDelay);
    }
  }
  else {
    for (i=0; i<dy; ++i) {
      myStepperY.step(sy);
      over+=dx;
      if (over>=dy) {
        over-=dy;
        myStepperX.step(sx);
      }
      delay(StepDelay);
    }    
  }

  if (verbose)
  {
    Serial.print("dx, dy:");
    Serial.print(dx);
    Serial.print(",");
    Serial.print(dy);
    Serial.println("");
  }

  if (verbose)
  {
    Serial.print("Going to (");
    Serial.print(x0);
    Serial.print(",");
    Serial.print(y0);
    Serial.println(")");
  }

  //  Delay before any next lines are submitted
  delay(LineDelay);
  //  Update the positions
  Xpos = x1;
  Ypos = y1;
}

//  Raises pen
void penUp() { 
  penServo.write(penZUp); 
  delay(LineDelay); 
  Zpos=Zmax; 
  if (verbose) { 
    Serial.println("Pen up!"); 
  } 
}
//  Lowers pen
void penDown() { 
  penServo.write(penZDown); 
  delay(LineDelay); 
  Zpos=Zmin; 
  if (verbose) { 
    Serial.println("Pen down."); 
  } 
}

Etape 10 : Préparez votre ordinateur à envoyer des fichiers gcode avec Processing

C’est presque prêt ! Tous les axes fonctionnent, la calibration est faite, le programme CNC est téléversé dans l’Arduino. Il ne reste plus qu’à préparer votre ordinateur pour envoyer les fichier gcode à votre Mini Traceur.

Pour les utilisateurs de Windows, téléchargez gctrl.exe ici et lancez le.

Pour les utilisateur Mac OS et Linux, installez tout d’abord Processing en le récupérant ici puis ouvrez gctrl.pde que vous pouvez récupérer ici.

Etape 11 : Tracer votre premier dessin avec gctrl

Avant de faire votre premier tracer

  • Assurez vous que les chariots sont à l’origine.
  • Vérifiez que rien n’entrave les mouvements des axes
  • Placez une feuille sur la zone de dessin

gctrl est un programme efficace mais basique dans le sens ou il n’effectue aucun contrôle du fichier sélectionné, le tracé démarre dès la sélection du fichier (vous pouvez l’interrompre en appuyant sur ‘x’).

C’est parti !

  • Appuyez sur ‘p’. Sélectionnez le port série sur lequel est branché votre Arduino dans la boite de dialogue qui s’affiche.
  • Appuyez ensuite sur ‘g’ pour sélectionner le fichier gcode à tracer.
  • C’est parti 🙂

mini traceur arduino - inkscape gcode gctrl_pde

Les autres commandes utiles de gctrl :

  1. ‘x’ : arrêter le tracé en cours. Attention, le crayon reste dans sa position actuelle
  2. ‘h’ : renvoie les axes aux origines

Etape 11 : Comment préparer vos propres fichiers gcode

Il est très facile de préparer ses propres fichiers gcode grâce à l’extension MakerBot Unicorn pour Inkscape. Pour ceux qui ne connaissent pas, Inkscape est un logiciel de dessin vectoriel open source (et gratuit).

Attention, l’extension MaketBot Unicorn ne fonctionne pas au delà de la version 0.48.5 d’Inkscape.

En fonction de votre ordinateur, téléchargez et installez Inkscape version 0.48.5 à cette adresse. Ensuite, récupérez l’extension MakerBot Unicorn sur github. Pour l’installer, il suffit de copier le contenu de répertoire src dans le répertoire des extensions d’Inkscape. En fonction de votre environnement, voici le chemin d’installation de l’extension.

  • OS X – /Applications/Inkscape.app/Contents/Resources/extensions
  • Linux – /usr/share/inkscape/extensions
  • Windows – C:\Program Files\Inkscape\share\extensions

L’extension installée, vous pouvez ouvrir Inkscape.

Vous devez tout d’abord commencer par configurer les propriétés du document (fichier -> propriétés du document). Choisissez l’unité par défaut en cm avec une dimension de page de 8 cm x 8 cm.

mini traceur arduino - inkscape gcode etape 1

Vous disposez d’une zone de 4cm x 4 cm. Votre dessin doit rester dans le quart supérieur droit.

mini traceur arduino - inkscape gcode etape 2

Votre dessin terminé, sélectionné tous les éléments puis allez dans Chemin -> Objet en chemin. Cette transformation est nécessaire avant de générer le fichier gcode. Par contre vous allez perdre certaines propriétés des objets (par exemple le texte ne sera plus éditable). Si vous voulez faire des modifications ultérieures, sauvegardez votre travail au format svg avant de faire la conversion.

mini traceur arduino - inkscape gcode etape 3

La conversion faite, nous pouvons générer le fichier gcode. Il suffit de faire fichier -> enregistrer sous puis de sélectionner Makerbot Unicorn (c’est l’extension que nous avons installé précédemment). Si l’option n’est pas disponible c’est que l’extension n’est pas correctement installée.

mini traceur arduino - inkscape gcode etape 4

Validez sans rien changez dans la boîte de dialogue qui apparait ensuite.

mini traceur arduino - inkscape export gcode

Et voilà, vous êtes prêt à tracer votre oeuvre !

J’espère que vous trouverez tout ce dont vous avez besoin pour fabriquer votre Mini Traceur. J’espère ne rien avoir oublié. N’hésitez pas à partager votre expérience ou ajouter vos astuces. Les commentaires sont là pour ça.

mini traceur cnc plotter arduino test minion

Pour vous aider, voici une petite vidéo qui résume l’assemblage du Mini Traceur CNC avec l’impression du Minion ci-dessus.

Licence sur les éléments de structure proposés dans ce projet

Licence Creative Commons
Mini Traceur Arduino est mis à disposition selon les termes de la licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 4.0 International.

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Promos à ne pas louper

Tags :

30
Poster un Commentaire

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  S’abonner  
Notifier de
JacK Kite

Bonjour, merci pour ce super Tuto !
Quelle alimentation utilisez-vous ? 5v ou 9v ?

Merci d’avance

Bonjour Jack et merci beaucoup. J’ai utilisé l’alimentation 9V de l’Arduino. Normalement la puissance délivrée par l’Arduino est suffisante pour alimenter les deux moteurs. Bonne journée

Pierre-Louis Lamballais

Sympa mais tu t’es mélangé les pinceaux entre ton schéma et ton code, ce qui explique sans doute les déboires de certains: ton code indique qu’un moteur est sur 2,3,4,5 et l’autre sur 8,9,10,11 alors que ce n’est pas le cas sur ton schéma. Le premier moteur doit donc être déclaré sur (2,3,10,11) et le second sur (8,9,4,5) ou alors faut changer le câblage. On a imprimé toutes les pièces et demain on devrait avoir fini le truc. Merci beaucoup et bravo pour les explications, bien claires. Je modifie mon message pour ajouter un détail: l’extension Inkscape génère des codes… Lire la suite »

Merci beaucoup pour toutes ce précisions Pierre-Louis

leludo76

Bonjour, j’essaye avec mes élèves de construire cette machine. Je ne suis pas très doué en électronique. dans la liste des fournitures à acheter, je ne vois pas les 2 composants, L293D…. mais ils sont sur le shéma de montage… faut il les commander ?
quel arduino faut il acheter ?
Merci de votre aide, Ludo.

Bonjour Leludo. Oui, il faut bien en commander 2. Il y a un pont L293D pour chaque axe X et Y. Le servo moteur est piloté (par un signal PWM) depuis l’Arduino. comment image

leludo76

bonjour, ca y est…. la machine est construite.. 😉
elle est branchée et les led ON et RX s’allument…par contre je ne sais plus quoi faire maintenant ?? j’en suis à tester les axes X et Y… entrer le code ?? ok mais le copier comment, où ??? suis perdu !!! Merci de votre aide…

Bonsoir Ludo. Il faut utiliser l’IDE Arduino et créer un nouveau croquis pour tester et régler chaque axe. Une fois que tout est bon (cablage des moteurs, calibration…), il ne reste plus qu’à modifier les paramètres dans le programme de CNC (étape 9) et téléverser celui-ci dans l’Arduino. C’est vrai que je devrais ajouter toutes ces étapes dans le tutoriel. Je vais y penser. Dites moi s’il reste des zones d’ombres. A très bientôt

freddd 3d

merci , j’attends quelques composants et je vais tester
cdlt

Avec plaisir.

freddd 3d

bonjour ce projet est très intéressant, pourriez vous me dire à quel endroit le prog mini cn doit être mis dans arduino avec une procédure détaillée svp et est ce compatible avec grbl merci

Bonjour Freed. C’est un programme standard Arduino. Il suffit de le téléverser dans l’Arduino comme n’importe quel autre code. Je n’ai pas testé avec d’autres programme que gctrl développé avec processing. j’imagine que cela ne devrait pas poser problème car le programme Arduino est “un simple” interpréteur G-Code.

ludoquad44

Salut à tous j’ai un probleme avec le code ligne 134 :
while ( Serial.available()>0 ) {
J’ai bien remplacé le &gt par >
Mais quand je compile, arduino me dit:

expected primary-expression before ‘;’ token
je séche merci

Bonjour Ludo. L’erreur est probablement située un peu avant. Il n’y a pas une erreur de frappe un peu plus haut dans le code ?

ludoquad44

Je viens de regarder mais je sèche ( je reste novice dans arduino).
je demande pas la solution sans chercher( mieux vaux comprendre par sois même que redemander 10 fois la même chose (daudet 78 pour ceux qui connaisse)).
Peut tu me donner un indice suplémentaire?
Merci

Gilbert

Bonjour le tuto m’éclaire bien dans la compréhension de la chaine dessin-gcode-arduino-moteurs. Parti pour souder les 4 fils sur les moteurs, j’ai opté pour les souder sur un connecteur de nappe qui était sur la carte du lecteur DVD plutôt que sur la nappedécoupée. Il me reste à tester le code, sachant qu’au lieu de faire le pont avec les 2 L293D j’ai opté pour un shield à base de L293D tout fait. Par contre j’ai lu que la version des l’extension pour inskape ne fonctionnait pas avec une version >= à 0.4.8. Connaissez vous une autre extension de même… Lire la suite »

NH

Bonjour,
Ayant réalisé le projet avec les lecteurs DVD, je me suis mis à en fabriquer un plus grand avec des moteurs de récup de scanners. Ayant 2 moteurs différents, je sèche quant à la programmation… Comment puis-je déclarer 2 “const int stepsPerRevolution =” de valeurs différentes ?
Merci!
NH

Bonjour NH. Il faut modifier le début du code comme ceci par exemple (je n’ai pas testé mais ça devrait fonctionner) const int stepsPerRevolutionX = 20; // Valeur par défaut const int stepsPerRevolutionY = 20; // Valeur par défaut const int vitesseDeplacement = 250; // Vitesse de déplacement des axes X et Y Servo penServo; // Objet pour actionner le servomoteur // Initialisation des moteurs pas à pas pilotés à l’aide d’un pont H L293D Stepper myStepperY(stepsPerRevolutionX, 2,3,4,5); // Axe X Stepper myStepperX(stepsPerRevolutionY, 8,9,10,11); // Axe Y sans oublier de calculer la calibration // Calibration, nombre de pas par millimètre… Lire la suite »

NH

Merci beaucoup pour cette super-rapide réponse!
Je vais essayer et donnerai des nouvelles. Je ne suis pas vraiment calé en langage arduino…donc super content.
NH

NH

Ça fonctionne parfaitement. Merci!

Génial ! merci beaucoup pour le retour. N’hésitez pas à nous envoyer des photos du projet et quelques réalisations.

yadja

bonjour je crois avoir remarquer que le schéma de câblage est incorrect quelle est le bon ?

Satoo

Lors de la compilation du programme pour calibrer l’axe des x, et me donne l’erreur suivante:

Arduino:1.6.11 (Mac OS X), Tarjeta:”Arduino Nano, ATmega328″

Blink:6: error: #include expects “FILENAME” or
#include <Stepper.h> //Librairie pour piloter les moteurs pas à pas
^
exit status 1
#include expects “FILENAME” or

Bonjour Satoo. C’est normal, il faut installer la librairie Stepper depuis le gestionnaire de librairies qui se trouve dans le menu croquis -> inclure une librairie. Faire une recherche sur le mot clé stepper

Satoo

Merci, ma faute

Kiwan Victor

Bonjour,
J’ai deux questions : Pas besoin de sources d’alimentation exterieure pour faire fonctionner les moteur en courant continu? Puisque sur d’autre vidéos que j’ai vu, ils en utilisent une
Et lorsque je lance le test de mes axes X,Y; le moteur tourne mais la “plateforme” ne se deplace pas… Une idee?

Bonjour Victor. Pour l’alimentation, ça va dépendre des moteurs utilisés. Pour les moteurs d’un ancien lecteur de CD/DVD, l’Arduino délivre assez de puissance (à condition que le port USB sur lequel il est branché suive…). Si tout vibre, il y a plusieurs causes : – le cablage n’est pas correct. Faut déplacer manuellement le chariot au centre de la tige et lancer un déplacement. 1. S’il va dans une direction ou l’autre, c’est qu’il faut inverser le sens, par exemple -100 pas au lieu de 100 pas => le cablage est correct, le moteur était en butée et on lui… Lire la suite »

Kiwan Victor

Merci beaucoup, le cablage etait en effet incorrect (malgré que j’ai vérifié…) et tout marche sans alimentation extérieure ! Merci encore, super tuto !

Matthieu

Bonjour,
L’arduino nano pourrait-il convenir pour connecter et alimenter tous les composants nécessaires à cette réalisation ?

Merci pour votre réponse

Bonjour Matthieu. Oui, ça devrait pouvoir marcher. On a besoin de 9 sorties (4×2 moteurs + x1 pour le servomoteur).

Domotique et objets connectés à faire soi-même