Recycler 2 lecteurs DVD en Mini Traceur (CNC Plotter) avec un Arduino Uno et 2 ponts en H L293D • Domotique et objets connectés à faire soi-même

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).

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.

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   4x
Entretoises   4x

4x

Equerres de fixation pour la breadboard   4x
Plateau support axe Z   1x
Porte crayon pour crayon de diamètre 8mm (par exemple pour Stabilo Point 88)   1x
Bague anti-basculement diamètre 8mm    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.

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.

Câblage des deux ponts en H L293D

Câblage de l’Arduino Uno

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é.

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.

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.

Modèle 3D du porte crayon sur son support

Vue de gauche du porte crayon Vue de droite du 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.

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          //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          //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 YNotre 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 
#include 

#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 = LINE_BUFFER_LENGTH-1 ) {
            Serial.println( "ERROR - lineBuffer overflow" );
            lineIsComment = false;
            lineSemiColon = false;
          } 
          else if ( c >= 'a' && c