585,959 active members*
4,536 visitors online*
Register for free
Login
IndustryArena Forum > OpenSource CNC Design Center > Arduino > Arduino Sherline Rotary Table controller
Page 1 of 5 123
Results 1 to 20 of 86
  1. #1
    Join Date
    Mar 2009
    Posts
    9

    Arduino Sherline Rotary Table controller

    So I decided that I wanted to be able to do repetitive moves on my Sherline cnc rotary table without using my computer and Mach3. Sherline makes a standalone controller but it's in the $400 range even on Ebay. Using an Arduino Nano, a 20x4 serial lcd, a 4x4 matrix keypad and a pololu stepper driver, I put together a simple stand alone rotary table controller. I'm using a 4amp 13.8v regulated DC power supply to power this project but I plan to use a laptop AC adapter when finished and put the controller in a 3d printed enclosure.

    Attachment 228786Attachment 228788

    I'm not a great Arduino programmer but here's the sketch:

    HTML Code:
    /*
    A program for controlling a single stepper motor driving a rotary table.
    Uses a 4x4 matrix keypad for entry of degrees and direction to move the table.
    Serial I2C display, Pololu stepper driver.
    */
    
    
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <Keypad.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(0x27,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display
    
     //setup vars
    const int stp = 12;  //connect pin 12 to step
    const int dir = 13;  // connect pin 13 to dir
    const int StepsPerRotation = 400; //Set Steps per rotation of stepper
    const int TableRatio = 72; //ratio of rotary table
    const int Multiplier = (StepsPerRotation * TableRatio)/360;
    const int stepdelay = 1;
     float Degrees = 0;                //Degrees from Serial input
     float ToMove = 0;                 //Steps to move
     int Direction;
     int repeat = 0;
     
     
    
    void setup()
    {
      lcd.init();                      // initialize the lcd 
      pinMode(stp, OUTPUT);
      pinMode(dir, OUTPUT); 
     
      // Print welcome message to the LCD.
      lcd.backlight();
      lcd.print("Rotary Table Control");
      lcd.setCursor(0,2);
      lcd.print("  CrankyTechGuy CNC");
      lcd.setCursor(0,3);
      lcd.print("   Copyright 2014");
      delay(2000);
      lcd.init();
    }
    
    void rotation(float tm, int d)
    {   
      if(d == 0)
      {
        digitalWrite(dir, LOW);
      }
      else
      {
        digitalWrite(dir, HIGH);
      }
      
      for(int i = 0; i < tm; i++)  
       {    
        digitalWrite(stp, HIGH);   
        delay(stepdelay);               
        digitalWrite(stp, LOW);  
        delay(stepdelay);              
       }
    }
    
    float GetNumber()
    {
       float num = 0.00;
       float decimal = 0.00;
       float decnum = 0.00;
       int counter = 0;
       char key = kpd.getKey();
       lcd.print("Rotary Table Control");
       lcd.setCursor(0,2);lcd.print("Enter degrees then");lcd.setCursor(0,3);lcd.print("press [#].");
       lcd.setCursor(8,1);
       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;
          }
          decnum = num / pow(10, counter);
          key = kpd.getKey();
       }
      return decnum;
    }
    
    int GetDirection()
    {
      int dir = 0;
      lcd.setCursor(0,2);lcd.print("                    ");
      
      lcd.setCursor(0,3);
      lcd.print("    FWD[A] REV[B]");
      while(dir == 0)
      {
      char key = kpd.getKey();
      if(key == 'A')
      {
        dir = 1;
      }
      else if(key == 'B')
      {
        dir = -1;
      }
      }
         
    lcd.clear();  
    return dir;
    }
    
    void loop()
    {
        if(repeat == 0)
        {
          Degrees = GetNumber();
          Direction = GetDirection();
        }
        
        Degrees = Degrees * Direction;
    
        if(Degrees < 0)
        {
          ToMove = (Degrees*Multiplier)*-1;
          lcd.setCursor(0,0);
          lcd.print("REV ");
          lcd.print(abs(Degrees),2);lcd.print((char)223);
          lcd.setCursor(6,1);
          lcd.print("Moving");
          rotation(ToMove,0);
          lcd.setCursor(6,1);
          lcd.print("      ");      
        }
        else
        {
          ToMove = Degrees*Multiplier;
          lcd.setCursor(0,0);
          lcd.print("FWD ");
          lcd.print(Degrees,2);lcd.print((char)223);
          lcd.setCursor(6,1);
          lcd.print("Moving"); 
          rotation(ToMove,1);
          lcd.setCursor(6,1);
          lcd.print("      "); 
        }
        lcd.setCursor(0,2);
        lcd.print("Repeat[A] Cancel[B]");
        char key = kpd.getKey();
        while(key != 'B')
        {
          key = kpd.getKey();
          if(key == 'A')
          {
            if(Degrees < 0)
            {
              ToMove = (Degrees*Multiplier)*-1;
              lcd.setCursor(6,1);
              lcd.print("Moving");
              rotation(ToMove,0);
              lcd.setCursor(6,1);
              lcd.print("      ");          
            }
            else
            {
              ToMove = Degrees*Multiplier;
              lcd.setCursor(6,1);
              lcd.print("Moving");
              rotation(ToMove,1);
              lcd.setCursor(6,1);
              lcd.print("      ");          
            }
          }
        }
        lcd.clear();
        
    }

  2. #2
    Join Date
    Apr 2006
    Posts
    3498
    weldone. want to watch the video
    http://free3dscans.blogspot.com/ http://my-woodcarving.blogspot.com/
    http://my-diysolarwind.blogspot.com/

  3. #3
    Join Date
    Oct 2010
    Posts
    1189
    Question How high is the Holding force ? Looks nice

    Gesendet von meinem SM-N9005 mit Tapatalk

  4. #4
    Join Date
    Jan 2006
    Posts
    156
    I know nothing about writing a sketch so I have to ask will the sketch still work if I change the Tableratio and the steps for a turn to 2oo.

  5. #5
    Join Date
    Mar 2009
    Posts
    9
    The stepper is a 270ozin stepper. With the worm drive system of the rotary table, holding force of the stepper isn't a huge factor.

  6. #6
    Join Date
    Mar 2009
    Posts
    9
    Quote Originally Posted by salzburg View Post
    I know nothing about writing a sketch so I have to ask will the sketch still work if I change the Tableratio and the steps for a turn to 2oo.
    The sketch calculates steps per degree of movement based on the steps per rotation of the stepper and table ratio. If you change these to match your stepper and table, it should work fine.

  7. #7
    Join Date
    Mar 2009
    Posts
    9

    Re: Arduino Sherline Rotary Table controller

    Updated my Sketch. The controller will now allow you to choose between degrees or divisions.

    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, Pololu stepper driver.
    */
    
    
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <Keypad.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(0x27,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display
    
     //setup vars
    const int stp = 12;  //connect pin 12 to step
    const int dir = 13;  // connect pin 13 to dir
    const int StepsPerRotation = 400; //Set Steps per rotation of stepper
    const int TableRatio = 72; //ratio of rotary table
    const int Multiplier = (StepsPerRotation * TableRatio)/360;
    const int stepdelay = 1;
    float Degrees = 0;                //Degrees from Serial input
    float ToMove = 0;                 //Steps to move
    float Divisions;
    float current = 0;
    int Mode = 0; 
     
    
    void setup()
    {
      lcd.init();                      // initialize the lcd 
      pinMode(stp, OUTPUT);
      pinMode(dir, OUTPUT); 
     
      // Print welcome message to the LCD.
      lcd.backlight();
      lcd.print("Rotary Table Control");
      lcd.setCursor(0,2);
      lcd.print("  CrankyTechGuy CNC");
      lcd.setCursor(0,3);
      lcd.print("   Copyright 2014");
      delay(2000);
      lcd.init();
      Mode = GetMode();
    }
    
    void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
    {
    asm volatile ("  jmp 0");  
    } 
    
    void rotation(float tm, int d)
    {   
      if(d == 0)
      {
        digitalWrite(dir, LOW);
      }
      else
      {
        digitalWrite(dir, HIGH);
      }
      
      for(int i = 0; i < tm; i++)  
       {    
        digitalWrite(stp, HIGH);   
        delay(stepdelay);               
        digitalWrite(stp, LOW);  
        delay(stepdelay);              
       }
    }
    
    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,3);lcd.print("    press [#].");
       lcd.setCursor(0,30);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,30);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();
         // num = 360/num;
       }
      return num;
    }
    
    int GetMode()
    {
      int mode = 0;
      lcd.setCursor(0,1);lcd.print("Select Op Mode");
      
      lcd.setCursor(0,3);
      lcd.print("    DIV[A] DEG[B]");
      while(mode == 0)
      {
      char key = kpd.getKey();
      if(key == 'A')
      {
        mode = 1;
      }
      else if(key == 'B')
      {
        mode = 2;
      }
      }
         
    lcd.clear();  
    return mode;
    }
    
    void loop()
    {
      if(Mode == 1)
      {
        Divisions = GetDivisions();
        Degrees = (360/Divisions);
      }
      if(Mode == 2)
      {
        Degrees = GetNumber();
      }
        lcd.clear();
        lcd.setCursor(0,3);
        lcd.print("FWD[A] REV[B] CAN[C]");
        char key = kpd.getKey();
        while(key != 'C')
        {
          lcd.setCursor(0,0);lcd.print("POS:");lcd.print(current);lcd.setCursor(0,1);lcd.print("DPM:");lcd.print(Degrees);
          key = kpd.getKey();
          if(key == 'A')
          {
           if(current >= 360)
           {
             current = (current + Degrees)-360;
           } else {
           current = current + Degrees;
           }
           ToMove = Degrees*Multiplier;
           lcd.setCursor(0,2);
           lcd.print("       Moving       ");
           rotation(ToMove,2);
           lcd.setCursor(0,2);lcd.print("                    ");
           lcd.setCursor(4,0);lcd.print("      ");
          }
          if(key == 'B')  
          {
           if(current <= 0)
           {
             current = 360+(current - Degrees);
           } else {
           current = current - Degrees;
           }
           ToMove = Degrees*Multiplier;
           lcd.setCursor(0,2);
           lcd.print("       Moving       ");
           rotation(ToMove,0);
           lcd.setCursor(0,2);lcd.print("                    ");
           lcd.setCursor(4,0);lcd.print("      ");
           }
         }
         lcd.clear();    
    }

  8. #8
    Join Date
    Dec 2005
    Posts
    504

    Re: Arduino Sherline Rotary Table controller

    Pretty slick. Does the Sherline rotary table have a home switch?

  9. #9
    Join Date
    Mar 2009
    Posts
    9

    Re: Arduino Sherline Rotary Table controller

    No. It would be easy to add one, though I don't have many digital inputs left on the Arduino.

  10. #10
    Join Date
    Jul 2009
    Posts
    1

    Re: Arduino Sherline Rotary Table controller

    Hello sloucks,

    Is it possible to show more of your wiring diagram? kinda hard for noob like me to trace it all back. I seem to encounter an error on the LiquidCrystal_I2C, do you know where you get the library from? The current one don't seem to be in agreement with the sketch?
    I received this message when verifying:
    C:\Users\Documents\Arduino\libraries\LiquidCrystal _I2C/LiquidCrystal_I2C.h:80: error: conflicting return type specified for 'virtual void LiquidCrystal_I2C::write(uint8_t)'
    C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:48: error: overriding 'virtual size_t Print::write(uint8_t)'

    Hopes someone can shine a light?

    Many thanks

  11. #11
    Join Date
    Mar 2009
    Posts
    9

    Re: Arduino Sherline Rotary Table controller

    Here is the schematic for my stepper controller. I do not know what the error you are getting is. I got the LiquidCrystal_I2C library from HERE .

    Attachment 244428

  12. #12
    Join Date
    Mar 2011
    Posts
    3

    Re: Arduino Sherline Rotary Table controller

    Hi, the script does not compile without error.

  13. #13
    Join Date
    Mar 2009
    Posts
    9
    Quote Originally Posted by edbart View Post
    Hi, the script does not compile without error.
    What error are you getting?

  14. #14
    Join Date
    Mar 2011
    Posts
    3

    Re: Arduino Sherline Rotary Table controller

    Hi,
    I have made a copy of the script from the web site and during the compilation there were errors - for example:

    error: missing terminating " character
    .
    .
    sketch_jan12a:24: error: 'Keypad' does not name a type
    sketch_jan12a:26: error: 'LiquidCrystal_I2C' does not name a type
    sketch_jan12a.ino: In function 'void setup()':
    .
    .
    sketch_jan12a:95: error: 'NO_KEY' was not declared in this scope
    sketch_jan12a.ino: In function 'int GetDirection()':
    sketch_jan12a:130: error: 'lcd' was not declared in this scope
    sketch_jan12a.ino: In function 'void loop()':
    .
    .
    sketch_jan12a:183: error: 'kpd' was not declared in this scope
    I did not have the necessary libraries.

    Therefore I have download a file Indexer.zip from another thread:
    http://www.cnczone.com/forums/open-s...o-based-3.html

    There were also libraries and this script is ok.
    Could you please advise how to compile your script?

    Thank you very much for your reply.
    Best regards,
    Eduard.

  15. #15
    Join Date
    Sep 2009
    Posts
    1856

    Re: Arduino Sherline Rotary Table controller

    you have libraries missing. keypad,12c
    http://danielscnc.webs.com/

    being disabled is not a hindrance it gives you attitude
    [SIGPIC][/SIGPIC]

  16. #16
    Join Date
    Mar 2011
    Posts
    3

    Re: Arduino Sherline Rotary Table controller

    Quote Originally Posted by daniellyall View Post
    you have libraries missing. keypad,12c
    Hi,

    thank you for your advice, I´ll try it.

    Regards,
    Eduard

  17. #17
    Join Date
    Jan 2015
    Posts
    1

    Re: Arduino Sherline Rotary Table controller

    Hello Everyone. Dear Sloucks - You make great job - gratulations. I have Arduino Uno few days and I not feel comfortable in programming that stuff. But If Members give me a little helping hand - I hope will be fine .. Im thinking to use that Sloucks unit to steering many rotated screw with encoder on the top of screw on the bottom of the screw will be moving device. Move will be around 30 inch (measurement accuracy of 0.01 inch) to top and down .I must know real position for example 15 inch from bottom move to 29 inch after that move to 14 inch and move to 29 and move to 13 inch . The cycle (one inch deeper and top if work semi automatic(by one button ) will be awesome ...Its able to do by that stuff ? Regards Victor

  18. #18
    Join Date
    Jan 2014
    Posts
    57

    Re: Arduino Sherline Rotary Table controller

    I downloaded the Indexer Sketch and I am having trouble compiling it as I have been getting Java stack overload errors that , being new to Arduino, I am unfamiliar with.
    The error that I get is: "at java.util.regex.Pattern$Branch.match(Pattern.java: 4604)"

  19. #19
    Join Date
    Sep 2009
    Posts
    1856

    Re: Arduino Sherline Rotary Table controller

    try a older version of arduino
    http://danielscnc.webs.com/

    being disabled is not a hindrance it gives you attitude
    [SIGPIC][/SIGPIC]

  20. #20
    Join Date
    Jan 2014
    Posts
    57

    Re: Arduino Sherline Rotary Table controller

    Quote Originally Posted by daniellyall View Post
    try a older version of arduino
    Thanks I will give that a try. Bob

Page 1 of 5 123

Similar Threads

  1. G1049 Rotary Table Versus Sherline set up
    By rkernell in forum Benchtop Machines
    Replies: 0
    Last Post: 08-21-2010, 03:31 AM
  2. Sherline rotary table threading
    By MechanoMan in forum Benchtop Machines
    Replies: 0
    Last Post: 07-08-2009, 11:23 PM
  3. Adapter for Sherline rotary table
    By diamondback21 in forum Taig Mills / Lathes
    Replies: 3
    Last Post: 04-13-2009, 11:26 AM
  4. Sherline CNC rotary table adaptation
    By uptoolateman in forum Benchtop Machines
    Replies: 14
    Last Post: 02-06-2009, 09:48 PM
  5. SHERLINE rotary table
    By ACME in forum Benchtop Machines
    Replies: 1
    Last Post: 11-17-2004, 05:15 AM

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •