1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

DivNum Plateau rotatif pour usinage et soudage via Arduino

Discussion dans 'Arduino' créé par vibram, 21 Août 2016.

  1. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    Salut à tous,

    Après quelques heures pas toujours évidentes passées dessus, j'ai enfin fini la partie opérationnelle de mon plateau rotatif.
    Je suis parti de cette base:
    http://www.usinages.com/threads/diviseur-et-arduino.91695/

    J'ai donc sorti mon plateau rotatif. J'ai usiné une piece en CM2 afin de pouvoir facilement brider mon mandrin sur le plateau. C'est la partie la plus agréable :wink:

    Je ne connaissais pas l'usage du keypad (clavier pour les anglophobes :wink: ) ni comment naviguer dans les menus via le LCD.
    J'ai donc utilisé ce bout de code et conservé la fonction de division en degrés et en divisions, car sait-on jamais, ca pourrait me servir un jour.
    J'ai ajouté à cela une fonction TIG car ce qui m’intéressait, c'est d'avoir un tout en un: positionneur TIG + diviseur.
    Et surtout la possibilité de faire varier la vitesse via un potentiomètre.
    Après un premier test hier, j'ai finalement décidé de rajouter un bouton poussoir que je mets sous le pied lors du soudage car je n'ai pas 12 mains et c'est indispensable de lancer le mouvement apres avoir amorcé l'arc et chauffé un minimum la pièce.

    J'ai du modifier une grosse partie du code pour la commande du moteur PaP afin d'avoir une plage de vitesses plus importante et surtout linéaire, ce qui n'était pas possible avec le code original.
    Dans la version du code que je vous présente, j'ai une vitesse variable entre 1 et 700 pas/sec
    Sachant qu'il faut 200 pas pour effectuer 1 tour, j'ai donc une vitesse max de 210tr/m ce qui est largement suffisant dans le cas de soudure de petit diamètre pour le TIG

    Ce que j'ai utilisé:
    - plateau rotatif (90 tours pour 360°)
    - arduino uno/ mini pro 5v atmega 328
    - un nema 23 (ici: http://www.ebay.fr/itm/131413459189?_trksid=p2060353.m2749.l2649&ssPageName=STRK:MEBIDX:IT )
    - un driver TB6560 (reglé en full step, 2.6A pour le moteur donné à 2.8A
    - une alim 24V (3A doivent suffire: 2.6A pour le driver, le reste ne consomme pas grand chose)
    - ecran LCD 20X4 avec module I2C (indispensable sinon on manque de pin sur l'arduino uno/mini)
    - un bouton poussoir
    - un potentiomètre
    - un keypad 4X4

    La video:


    Le code:
    Code:
    /*
    A program for controlling a single stepper motor driving a rotary table.
    Uses a 4x4 matrix keypad for entry of degrees and direction or number of divisions to move the table.
    Serial I2C display, TB6560 stepper driver.
    Inspired by CrankyTechGuy CNC, modded by Vibram for usinages.com
    */
    
    
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <Keypad.h>
    #include <AccelStepper.h>
    
    const byte ROWS = 4;
    const byte COLS = 4;
    char keys[ROWS][COLS] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'.','0','#','D'}
    };
    
    byte rowPINS[ROWS] = {11,10,9,8};
    byte colPINS[COLS] = {7,6,5,4};
    
    Keypad kpd = Keypad(makeKeymap(keys),rowPINS,colPINS, ROWS, COLS);
    
    LiquidCrystal_I2C lcd(0x3F,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display
    
    //setup vars
    const int buttonPin = 3;      // the number of the pushbutton pin
    int buttonState = 0;          // variable for reading the pushbutton status
    const int stp = 12;           //connect pin 12 to step
    const int dir = 13;           // connect pin 13 to dir
    const int StepsPerRotation = 200; //Set Steps per rotation of stepper
    const int TableRatio = 90;    //ratio of rotary table
    const int Multiplier = (StepsPerRotation * TableRatio)/360;
    float Degrees = 0;            //Degrees from Serial input
    float ToMove = 0;             //Steps to move
    float Divisions;
    float current = 0;
    int Mode = 0;
    int speed = 0;                //read from potentiometer
    int maxspeed = 700;           //max speed in steps per sec
    int stepspeed = 600;          //speed in steps per sec
    byte percentage = 0;          //speed % on LCD
    AccelStepper stepper(1, stp, dir); //(mode:1 = driver)
    
    void setup()
    {
      lcd.init();                      // initialize the lcd
      pinMode(stp, OUTPUT);
      pinMode(dir, OUTPUT);
      pinMode(buttonPin, INPUT);       // initialize the push button
      pinMode(A0, INPUT);              // initialize the potentiometer
      Serial.begin(9600);
      stepper.setMaxSpeed(maxspeed);   // stepper max speed
      stepper.setSpeed(stepspeed);     // stepper speed
      stepper.setAcceleration(600);    // stepper acceleration: not needed
      stepper.setCurrentPosition(0);   // stepper current position
    
      // Print welcome message to the LCD.
      lcd.backlight();
      lcd.print("Rotary Table Control");
      lcd.setCursor(0,2);
      lcd.print("  usinages.com");
      lcd.setCursor(0,3);
      lcd.print("      Vibram    ");
      delay(1000);
      lcd.begin(20,4);
      Mode = GetMode();
    }
    
    void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
    {
    asm volatile ("  jmp 0");
    }
    
    float GetNumber()
    {
       float num = 0.00;
       float decimal = 0.00;
       float decnum = 0.00;
       int counter = 0;
       char key = kpd.getKey();
       lcd.setCursor(0,0);
       lcd.print("Enter degrees then");
       lcd.setCursor(0,1);
       lcd.print("    press [#].");
       lcd.setCursor(0,3);
       lcd.print("Reset [D]");
       lcd.setCursor(8,2);
       bool decOffset = false;
    
       while(key != '#')
       {
          switch (key)
          {
             case NO_KEY:
                break;
            
             case '.':
               if(!decOffset)
               {
                 decOffset = true;
               }
                lcd.print(key);
                break;
           
             case '0': case '1': case '2': case '3': case '4':
             case '5': case '6': case '7': case '8': case '9':
               if(!decOffset)
               {
                num = num * 10 + (key - '0');
                lcd.print(key);
               }
               else if((decOffset) && (counter <= 1))
               {
                num = num * 10 + (key - '0');
                lcd.print(key);
                counter++;
               }
               break;
    
             case 'D':
               software_Reset();
             break;
          }
    
          decnum = num / pow(10, counter);
          key = kpd.getKey();
       }
      return decnum;
    }
    
    float GetDivisions()
    {
       float num = 0.00;
       char key = kpd.getKey();
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Enter Divisions then");
       lcd.setCursor(0,1);
       lcd.print("     press [#].");
       lcd.setCursor(0,3);
       lcd.print("Reset [D]");
       lcd.setCursor(8,2);
    
       while(key != '#')
       {
          switch (key)
          {
             case NO_KEY:
                break;
            
             case '0': case '1': case '2': case '3': case '4':
             case '5': case '6': case '7': case '8': case '9':
                num = num * 10 + (key - '0');
                lcd.print(key);
                break;
        
            case 'D':
              software_Reset();
              break;
          }
          key = kpd.getKey();
       }
      return num;
    }
    
    int TigRotation()
    {
       int num = 0;
       char key = kpd.getKey();
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Enter number of laps");
       lcd.setCursor(0,1);
       lcd.print("Then press [#].");
       lcd.setCursor(0,3);
       lcd.print("Reset [D]");
       lcd.setCursor(8,2);
    
       while(key != '#')
       {
          switch (key)
          {
             case NO_KEY:
                break;
            
             case '0': case '1': case '2': case '3': case '4':
             case '5': case '6': case '7': case '8': case '9':
                num = num * 10 + (key - '0');
                lcd.print(key);
                break;
        
            case 'D':
              software_Reset();
              break;
          }
          key = kpd.getKey();
    }
    
      return num;
    }
    int GetMode()
    {
      int mode = 0;
      lcd.setCursor(0,0);
      lcd.print("Select Op Mode");
      lcd.setCursor(0,1);
      lcd.print("       DIV[A]");
      lcd.setCursor(0,2);
      lcd.print("       DEG[B]");
      lcd.setCursor(0,3);
      lcd.print("       TIG[C]");
      while(mode == 0)
      {
      char key = kpd.getKey();
      if(key == 'A')
      {
        mode = 1;
      }
    
      else if(key == 'B')
      {
        mode = 2;
      }
      else if(key == 'C')
      {
        mode = 3;
      }
      }
     
    lcd.clear();
    return mode;
    }
    
    void loop()
    {
      if(Mode == 1)
      {
        Divisions = GetDivisions();
        Degrees = (360/Divisions);
      }
      if(Mode == 2)
      {
        Degrees = GetNumber();
      }
      if(Mode == 3)
      {
        Degrees = (TigRotation()*360);
      }
    
        lcd.clear();
        lcd.setCursor(0,3);
        lcd.print("FWD[A] REV[B] CAN[C]");
        char key = kpd.getKey();
        while(key != 'C')
        {
        speed = analogRead(A0);
        stepspeed = map(speed,0,1023,1,maxspeed);
        percentage = map(speed,0,1023,1,100);
        stepper.setSpeed(stepspeed);
        lcd.setCursor(0,0);
        lcd.print("POS:");
        lcd.print(current);
        lcd.setCursor(11,0);
        lcd.print("Speed:");
        lcd.setCursor(17,0);
        lcd.print("   ");
        lcd.setCursor(17,0);
        lcd.print(percentage);
        lcd.print("%");
        lcd.setCursor(0,1);
        lcd.print("DPM:");
        lcd.print(Degrees);
          key = kpd.getKey();
    
          if(key == 'A')
          {
            if(current + Degrees <= 360)
            {
             current = ((stepper.currentPosition()/ Multiplier) + Degrees);
            }
            else
            {
             current = (stepper.currentPosition()/ Multiplier) + Degrees-360;
            }
     
           ToMove = Degrees*Multiplier;
           // stepper.setSpeed(stepspeed);
           // Serial.println(ToMove);
           stepper.move(ToMove);
           Serial.println(ToMove);
           Serial.println(stepper.speed()); 
           lcd.setCursor(0,2);
           lcd.print("Ready for forward   ");
          }
          if(key == 'B')
          {   
            if(current - Degrees >= 0)
            {
             current = ((stepper.currentPosition()/ Multiplier) - Degrees);
             }
             else
             {
              current = (stepper.currentPosition()/ Multiplier) - Degrees + 360;
             }
           ToMove = Degrees*Multiplier*-1;
           stepper.move(ToMove);
           Serial.println(ToMove);
           stepper.setSpeed(-stepspeed);
           Serial.println(stepper.speed());
           lcd.setCursor(0,2);
           lcd.print("Ready for reverse   ");
           }
    
        buttonState = digitalRead(buttonPin);
        if (buttonState == HIGH) {
          lcd.setCursor(0,2);
           lcd.print("       Moving       ");
           while (stepper.distanceToGo() != 0)
            {
            stepper.runSpeedToPosition();
            }
            lcd.setCursor(0,2);
           lcd.print("                    ");
          }
         }
         lcd.clear();
    }
    NB: dans le cas de rotation avant puis arrière ou inversement, il n'y a pas de rattrapage de l’éventuel jeu

    Amélioration(s) possible(s):
    1. La première qui me vient à l'esprit, ce serait de calculer une vitesse théorique en fonction du diamètre de la pièce que l'on veut souder. Mais dans tous les cas il faudra ajuster donc je ne suis pas sur du réel gain de temps...

    2. A reflechir












    3. Faire un boitier propre et ranger le bordel :) IMG_21082016_145218.jpg IMG_21082016_145213.jpg
     
    Dernière édition: 21 Août 2016
  2. bipbip30

    bipbip30 Compagnon

    Messages:
    2 388
    Inscrit:
    23 Décembre 2012
    Projets:
    H130 De Vallière en cours
    Département:
    30
    Plateau rotatif pour usinage et soudage via Arduino
    bonjour vibram

    joli travail. Je me demande pourquoi le moteur pap fait autant de bruit ?
     
  3. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    Merci. C'est loin d'être joli pour le moment mais c'est la prochaine étape.
    J'ai peu d éléments de comparaison mais celui ci comme le précédent moteur est assez bruyant.
    Après il a aussi un gros effet de raisonnance car le bois vibre beaucoup et le bordel autour n arrange rien
     
  4. neophyte

    neophyte Apprenti

    Messages:
    95
    Inscrit:
    17 Avril 2011
    Plateau rotatif pour usinage et soudage via Arduino
    Bonjour,

    C'est un outil très pratique,
    mais tu devrait fixer la masse sur le mandrin du haut, car le courant de soudage va détruire rapidement ton plateau rotatif.
     
  5. speedjf37

    speedjf37 Compagnon

    Messages:
    982
    Inscrit:
    15 Octobre 2009
    Localité:
    indre et loire
  6. bipbip30

    bipbip30 Compagnon

    Messages:
    2 388
    Inscrit:
    23 Décembre 2012
    Projets:
    H130 De Vallière en cours
    Département:
    30
    Plateau rotatif pour usinage et soudage via Arduino
    ok ça n'enlève rien à la qualité du travail après c'est vrai qu'une fois dans un boitier etc ... etc ... ça ira mieux

    merci c'est noté
     
  7. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    Merci.
    Pourquoi donc?
    Carnormalement, le courant ne passe pas à travers les roulements. Un membre de soudeurs.com a fait exactement le meme montage sans probleme (enfin j'ai fait le meme montage que lui). Ou le courant risque d'abimer la surface du plateau?

    Tu soulèves quelques questions.
    1. tous les moteurs sont ils compatibles avec les micros pas ?
    2. Si je regle le drivers sur des 1/2 pas ou 1/4 pas, est-ce que je doi changer quelque chose dans mon code ? (faut il compter 400 x 1/2 pas pour 200 pas ? ou alors c'est le driver qui 'occupe de la conversion ?
    3. J'avais un NEMA17 a 1.6A (ou 2 je ne sais plus..) et je manquait de couple pour entrainer le plateau. J'ai peur que diminuer l'amperag résulte dans le meme probleme. Lorsque je fais tourner le moteur à vide, le bruit est nettement moins
    4. Coupleur commandé :wink:

    merci de ton aide
     
    Dernière édition: 22 Août 2016
  8. speedjf37

    speedjf37 Compagnon

    Messages:
    982
    Inscrit:
    15 Octobre 2009
    Localité:
    indre et loire
    Plateau rotatif pour usinage et soudage via Arduino
    Les micros pas sont acceptés par tous les moteurs ( à tester car le couple est réduit par les micro pas)

    En 1/4 c'est déjà beaucoup plus souple et silencieux et il faut multiplier par 4 le nombre d'impulsions.

    JF
     
  9. stanloc

    stanloc Compagnon

    Messages:
    4 366
    Inscrit:
    29 Octobre 2012
    Plateau rotatif pour usinage et soudage via Arduino
    Bonjour,
    Je débarque sur ce fil par hasard et je me permets une suggestion. Désacoupler entièrement le moteur du plateau et refaire les mêmes tests le moteur encore posé dans le morceau de bois. Pour moi ce n'est pas le niveau sonore qui m'interpelle c'est que "ça tourne comme une patate au niveau son". Il faut vérifier donc si cela ne vient pas de l'électronique de commande du moteur. Le moteur seul doit faire un bruit parfaitement monotone. Lorsque cela sera obtenu, il faudra comme déjà dit mettre un accouplement souple comme montré dans le lien
    Stan
     
  10. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    J'ai d'abord passé pas mal d''heures à élaborer le code et donc voir mon moteur tourner dans le vide sur mon bureau. Pas de problème il ne tourne pas patate.
    je ferai une vidéo lorsque je retournerai chez mes parents.
    le problème vient du manque de rigidité des deux morceaux de bois censés tenir le moteur ainsi que la planche sur laquelle les morceaux sont fixés. Ajouté à cela que mon coupleur n'est pas usinée de maniere assez précise et c'est lui qui fait tourner le moteur patate car le diviseur est lui bien bridé, résultat le moteur prend tout dans la tronche.

    C'était un montage "primaire" pour valider l'ensemble. je vais faire le même accouplement que speedjf37 (le coupleur est deja en route). Moteur solidement fixé au plateau = plus de problème.

    Merci de vos apports en tout cas
     
  11. Precis84

    Precis84 Compagnon

    Messages:
    838
    Inscrit:
    7 Décembre 2008
    Plateau rotatif pour usinage et soudage via Arduino
    Salut vibram
    Dans tout les cas , je tiens à te remercier pour le travail que tu as fais et que tu partage.
    J'aurai des questions à te poser , mais pas dans l'immédiat car j'attends encore des éléments
    que j'ai commandé. Je pense avoir demain le driver TB6560. Ensuite je n'ai que l'écran 16x2
    du kit R3 . J'ai une carte UNO et 3 claviers. Pour l'alim , j'ai pas ( est ce qu'une alim de pC covient ? ).
    Je me demande à partir de quel code tu es parti ( j'en récupéré sur CNC Zone et Homemachinist ).
    claude
     
  12. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    Salut Claude,
    Avec plaisir, c'est le but du forum.
    Pour le code de base:
    http://www.cnczone.com/forums/arduino/215402-cnc.html

    c'est sympa un 16x2 mais tu vas voir que tu es tres tres vite limité, les caractères sont chers

    Pour l'alim, tu parles d'alimenter l'ensemble?
    TU as quoi comme moteur? car l'arduino consomme presque rien, en revanche pour ton moteur il te faut minimum du 24v (via le driver TB6560), entre 2 et 5A environ...
    Tu peux trouver des alimentation d'ordinateur portable en 24v 3 ou 4A, ca va nickel ! et ca coute pas grand chose sur les sites chinois
    N'hésites pas pour les questions
     
  13. Precis84

    Precis84 Compagnon

    Messages:
    838
    Inscrit:
    7 Décembre 2008
    Plateau rotatif pour usinage et soudage via Arduino
    Merci pour ta réponse.
    Pour l'écran , je vais en commander 1 vite fait.:wink:
    Pour le moteur , je pense comme toi prendre 1 nema 23 ou + gros.
    Pour l'alim , j'ai 3 vieux portable qui traine , mais je ne sais pas si ils sont en 24volts.
    Dans le pire des cas , j'en achèterai 1. ( on a rien sans rien ).
    Pour le code , effectivement , je l'avais récupéré sur CNC.zone.
    Mon but , c'est de me faire entre autre 1 petite machine pour tailler des engrenages
    à partir d'un petit tour ancien.
    claude
     
  14. vibram

    vibram Compagnon

    Messages:
    793
    Inscrit:
    15 Mars 2014
    Plateau rotatif pour usinage et soudage via Arduino
    Oui tu en trouves pour 10euros des alim que ce soit sur banggood ou aliexpress.com. Mais il faut obligatoirement du 24v
    Pour le moteur tu vas commander quoi ? La poupée du tour ou un plateau diviseur ?
    Les nema ya de toutes les tailles et de tous les couples. A étudier ce dont tu as besoin.
    Pour le code, celui ci me paraît particulièrement bien adapté avec les divisions ou les degrés.
    Mais je te conseille quand même de faire la modification pour avoir à appuyer sur un bouton poussoir plutôt que sur un clavier car le BP tu peux facilement le déporter à proximité soit de tes mains ou de tes pieds tandis que le clavier sera plus facilement à côté de l'écran donc éventuellement un poil plus loin. La encore à toi de voir :wink:
    En tout cas je te conseille de réfléchir aux vitesses de rotation afin de savoir quelle librairie choisir. Le code que tu as est assez contraignant sur la vitesse de rotation des Pap.
    La librairie que j'ai choisi est un poil plus complexe mais nettement plus poussée (choix de la vitesse, de l'accélération, suivi de la position du moteur en relatif ou en réel etc)
     
  15. Precis84

    Precis84 Compagnon

    Messages:
    838
    Inscrit:
    7 Décembre 2008
    Plateau rotatif pour usinage et soudage via Arduino
    Je pense utiliser le tour complet . Le tour a été ....réduit en longueur .
    ( pour les engrenages , c'est pour de l'horlogerie assez grosse....pas de montres)
    Petite question , les écrans 20x4 sont tous I2C ou pas ?
    http://www.ebay.fr/itm/5131-20-x-4-...545332?hash=item280d858274:g:05UAAOSwNphWaelw
    Pour l'instant j'ai des moteurs de récup. que je voulais utiliser pur des essais ( type imprimante)
    powermax II
    2.3A Bipolar 1.8°( model P21N8XB DSCN1049.JPG DSCN1051.JPG
     

Partager cette page