Interrupt Driven Rotary Table controller

Discussion in 'Software and Programming' started by rodw, Nov 30, 2015.

Help Support HMEM by donating using the link above.
  1. Nov 30, 2015 #1

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    You can read the thread where this is documented form go to woe during the development here:
    http://www.homemodelenginemachinist.com/showthread.php?p=273830#post273830
    if you need more help but this thread is designed to provide a simple easy to install solution of version 10 of my Rotary Table controller.

    I am going to assume you already have installed the Arduino IDE on your PC. Don't worry if you don't have an Arduino at this stage.

    All you have to do is to find the Arduino folder in "My Documents". On my PC it was in this folder C:\Users\Rod\Documents\Arduino and unzip the attached file into it. I am guessing that you have a different name to me so it will be a bit different on your PC :) Please substitute my name with yours....

    So you should now have the following folders in the Arduino folder
    C:\Users\Rod\Documents\Arduino\libraries
    C:\Users\Rod\Documents\Arduino\RotaryTable10


    In the Libraries folder you should find the following folders
    C:\Users\Rod\Documents\Arduino\libraries\LCD
    C:\Users\Rod\Documents\Arduino\libraries\TimerOne-r11


    In the C:\Users\Rod\Documents\Arduino\RotaryTable10 folder you will find the following files:
    EEPROMAnything.h
    RotaryTable10.ino


    Assuming you have the Arduino IDE installed on your PC if you double click on
    RotaryTable10.ino and it should open in the IDE.

    [​IMG]

    Click the Button marked with the Red Arrow to verify that the script will compile. This does not require an Arduino attached to your PC so you can get it compiling before you spend your money.

    Then, grab yourself these things:
    1. An Arduino Uno or equivalent
    2. A Freetronics LCD display; see http://www.freetronics.com.au/collections/display/products/lcd-keypad-shield
    3. A stepper controller
    4. A stepper motor. NEMA 23 is a good size for a 6 inch Rotary table
    5. Power supply (minimum 24 volt in my experience, around 80% of what you stepper driver is rated for - I use a 48 volt power supply).

    With the LCD attached to your Arduino, plug your Arduino into a USB port, check your system is properly configured and hit the button pointed to by the blue arrow. The script will be recompiled and downloaded to your Arduino. The Arduino screen should light up after this process.

    Connect up your stepper controller to the Arduino. making sure you are working on the low voltage side of the controller. You need to provide 5 volt power, ground and a step and direction port. The Arduino has enough current to drive the stepper controller.

    Then connect power to the high voltage side of your controller and connect the wires correctly to your stepper motor.

    Check the Setup menu and set up the step and direction ports to agree with those you chose when connecting your Arduino to the Stepper controller. Also set the various pulse parameters to suit your hardware.

    Check the maxHz and MinHz settings in the setup folder. Start at around 5,000 and 9,000 (for Max and Min respectively or accept the defaults).

    Makee sure you save the setup.

    You should not need to touch the code to get it going as everything is set in the setup menu and stored in the EEPROM memory forever on the Arduino.

    Note that the script also supports linear devices and multiple devices. via the new device function in setup. This simply creates a new numbered setup in the EEPROM. You can load devices at will to swap between devices when setup.

    The main feature of this controller is that it uses interrupts for high performance and this also allows it to ramp up and down to speed so that it can overcome inertia by running slowly at maximum torque and ramping up to speed.

    There are heaps of dividing functions, jogging and continuous turning. Some people have modified this script to alter the speed while continuous turning but on a 90:1 rotary table like mine, the maximum speed you are going to get is about 4 RPM so it is a bit pointless attempting to change the speed IMHO.

    Anyway, I'm sure I've overlooked some stuff but please try this and report back. Just remember if you are not using a Freetronics LCD display and keyboard you are on your own!

    View attachment RotaryTable10.zip
     
  2. Dec 1, 2015 #2

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    Here are links to hardware that will work (and you can grab both in the one order)
    Freetronics Arduino Compatible board : http://www.freetronics.com.au/collections/arduino/products/eleven#
    Freetronics Keyboard and LCD: http://www.freetronics.com.au/collections/display/products/lcd-keypad-shield#

    Any Arduino UNO Compatible board will work. I have used the board above, a genuine UNO and a Chinese Clone without any dramas.
    As stated above, the LCD display on this link is the one the LCD library is designed for.
     
  3. Dec 12, 2015 #3

    xpylonracer

    xpylonracer

    xpylonracer

    Well-Known Member

    Joined:
    Dec 23, 2010
    Messages:
    219
    Likes Received:
    51
    Hi Rod

    I Downloaded your Rotary Table 10 program but get an Error message when Verifying sketch, Error:

    Temp1_RotaryTable10.zip\RotaryTable10\RotaryTable10.ino:1:23: fatal error: BoolField.h: No such file or directory
    #include <BoolField.h>
    ^
    compilation terminated.
    exit status 1
    Error compiling.

    Any idea if it's me, my computer or the sketch ?

    Emgee
     
  4. Dec 13, 2015 #4

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    The error message shows the compiler cannot find an include file. You have not installed the LCD library which should be in
    C:\Users\YourName\Documents\Arduino\libraries\LCD

    Please read the first post carefully and follow the instructions as the missing file is included in the Zip file.
     
    xpylonracer likes this.
  5. Jan 27, 2016 #5

    mulac321

    mulac321

    mulac321

    Active Member

    Joined:
    Apr 26, 2011
    Messages:
    28
    Likes Received:
    2
    hi Rodw, amazing work. i wrote a programme to do this for a pic, but yours is far superior.
    my controller has a common anode (5v) pin and 3 pins for step pulse and enable. i think this means my controller requires the inputs to go low to step. is this compatible with your programme? i think it is backwards to most stepper controllers.
     
    rodw likes this.
  6. Jan 28, 2016 #6

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    Thanks Mulac.

    I don't think you will have any problem. I might be wrong, but I don't think this code has any concept of low and high signals. This is because if it has to move 100 steps, there are 200 distinct states which alternate on and off. The worst you could be out is therefore one step because the first state change is ignored as you started on the wrong foot so to speak. In this case, changing the definition for the variable "state" would start you off on the right foot.
     
  7. Oct 17, 2016 #7

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    minh-thanh likes this.
  8. Oct 17, 2016 #8

    John S

    John S

    John S

    Well-Known Member

    Joined:
    Apr 13, 2008
    Messages:
    654
    Likes Received:
    40
    At 1:50 he makes the unit move 3 divisions or 120 degrees.
    On the first move one chuck jaw is vertically down, subsequent moves should leave one jaw still vertically down but on the last move the jaws are well out ??
     
  9. Oct 18, 2016 #9

    Toolguy

    Toolguy

    Toolguy

    Well-Known Member

    Joined:
    Sep 18, 2010
    Messages:
    58
    Likes Received:
    12
    I was wondering about that too.:confused:
     
  10. Oct 18, 2016 #10

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    It can only be missed steps from poorly configured hardware, (maybe too low a voltage) as the software is spot on and proven by a number of other users.
     
    canadianhorsepower likes this.
  11. Feb 14, 2017 #11

    Johno1958

    Johno1958

    Johno1958

    Well-Known Member Project of the Month Winner

    Joined:
    Sep 19, 2015
    Messages:
    123
    Likes Received:
    49
    Hi Rodw.
    First of all thank you for all the time and effort documenting a great program.
    That said I can't for the life of me get it to work lol. I am using Saintsmart uno and 1602 lcd six button shield and a tb6560 driver. I can load the sketch no worries but I dont seem to be able to get the driver part working. I have the liming sketch up and running ok. My question is I can't seem to find a wiring diagram .Is there one posted?
    Cheers
    john
     
  12. Feb 15, 2017 #12

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    John, first of all, I have never used the Sainsmart but a few people have used it with this sketch. I think that you may need to modify the LCD library in the keyboard sensing code and its been documented bys others in my other thread linked to in the first post. However by the sounds of it you have got this part working. If the displays and menus work, it will be fine!

    So its always best to start with basics in the Arduino core library before you use a complex program. Maybe this one. https://www.arduino.cc/en/Reference/Stepper

    So once you know you have a working stepper driver, install my sketch and configure the settings including the step and direction pins in the setup menu. If you have not done that, it probably is the reason why nothing moves.

    There is not much to the wiring. step+ and dir+ go to the relevant digital pins and step- and dir- go to the Arduino ground. Attach the high voltage for the stepper to your controllers stepper power terminals. I'm not sure of the TB6660
    but in some cases you need active low wiring so check your documentation. I've never had to do that with the Arduino though.
     
  13. Feb 15, 2017 #13

    Johno1958

    Johno1958

    Johno1958

    Well-Known Member Project of the Month Winner

    Joined:
    Sep 19, 2015
    Messages:
    123
    Likes Received:
    49
    Hi Rod
    Yes you are right .I never configured the step and dir pins. I will read through your thread again as I glossed over a lot of parts which were flying well over my head.
    I do find this project very interesting.
    Thanks
    John
     
    Last edited: Feb 15, 2017
  14. Feb 15, 2017 #14

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    Glad you got it going.
     
  15. Jun 29, 2017 #15

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    Hmm Captain_Obvious reported a not so obvious bug in my software that bit where a rotary table has a coarse resolution. Where say a division required say 100.333 steps per division, the number was rounded to 100.0. This meant on say 36 divisions around a complete circle, the final division could end up being 12 steps short.

    I don't currently have any working hardware to test this on but I know it compiles.

    Here is a replacement GoDivide procedure. Can those using this sketch cut and paste this into your config to replace the existing goDivide procedure and see if it is working correctly?

    Code:
    void goDivide(long gAngle)
    {
       long thisDiv = 1; 
       int event = LCD_BUTTON_NONE;
       int flag = 0;
       float tmpSTEPS_PER_REV = (float)globals.stepsPerRev;
       float remainder;
       float divLeftOver = 0.0;
       long adjustSteps = 0;
       
       stepsPerDiv = (long)(tmpSTEPS_PER_REV *((float)gAngle/(float)MINUTES_IN_CIRCLE));
       remainder = (float) (tmpSTEPS_PER_REV *((float)gAngle/(float)MINUTES_IN_CIRCLE));
       remainder -= (float)stepsPerDiv;
       divisions = (long)((float) MINUTES_IN_CIRCLE / (float) gAngle);
       printDivideVals(thisDiv,gAngle);
       while(event != LCD_BUTTON_SELECT){
          event = lcd.getButton();
          switch(event){
            case LCD_BUTTON_LEFT:
              flag++;
              thisDiv--;
              divLeftOver -= remainder;
              if(thisDiv < 1)
                thisDiv = divisions;
              digitalWrite( globals.DirPin, ANTICLOCKWISE );
              break;
            case LCD_BUTTON_RIGHT:
              flag++;
              thisDiv++;
              divLeftOver += remainder; 
              if(thisDiv > divisions)
                thisDiv = 1;          
              digitalWrite( globals.DirPin, CLOCKWISE );
              break;       
        }
        if(flag){ 
          if(abs(divLeftOver) >= 1.0){
            adjustSteps = 1;
            if(abs(divLeftOver) == divLeftOver)  
              divLeftOver -= 1.0;    // Positive value >= 1.0
            else
                divLeftOver += 1.0;  // Negative Value <= 1.0
          } else
              adjustSteps = 0;
        }   
        setSteps((stepsPerDiv + adjustSteps) * 2, 1);
        printDivideVals(thisDiv,gAngle);
        flag = 0;
      }
    }
    
    So what the code attempts to do is to now is to save the fractional steps in a variable called remainder (say 0.33 in our 100.33 example). This is accumulated in each step in the variable divLeftOver every time a division is made. If this variable is <= 1.0 or >=1.0, it is adjusted by 1.0 closer to zero and the number of steps in the current division is incremented by 1. That way, we should end up back on track when we complete a complete circle.

    Please provide your feedback.
     
  16. Jun 29, 2017 #16

    Captain_Obvious

    Captain_Obvious

    Captain_Obvious

    Active Member

    Joined:
    Jun 3, 2017
    Messages:
    37
    Likes Received:
    14
    Hello again,

    I tried the new script but I don't know what went wrong. As soon as I start the division or the angle program, the stepper motor just runs continuously, briefly stopping at the given number of divisions. None of the buttons do anything except for the reset button. I'm not anywhere near advanced enough to analyze to script myself. All the other functions work just like they did before.

    Attached is the misbehaving script.

    View attachment rotaryscript.zip
     
  17. Jun 30, 2017 #17

    Cogsy

    Cogsy

    Cogsy

    Well-Known Member Global Moderator

    Joined:
    Jul 30, 2012
    Messages:
    2,073
    Likes Received:
    589
    Gender:
    Male
    Hi Rod,
    I don't have the hardware to test either, nor do I have a lot of experience programming in C but looking at the code in your if(flag) I saw this line: if(abs(divLeftOver) == divLeftOver) , which is comparing floats for equality. I realise it's the same variable and you're just taking the absolute value, but because of the abs function return I think you still run the normal risks of float equalities here. I've been stung by it before so it just sort of jumped out at me, so I thought I'd mention it.
     
  18. Jun 30, 2017 #18

    Foozer

    Foozer

    Foozer

    Well-Known Member

    Joined:
    Nov 26, 2008
    Messages:
    1,125
    Likes Received:
    56
    Freetronics shield is ordered so can test it as you wrote it . . .
     
  19. Jun 30, 2017 #19

    rodw

    rodw

    rodw

    Well-Known Member

    Joined:
    Dec 3, 2012
    Messages:
    1,062
    Likes Received:
    313
    Guys, I'm not sure what I got wrong. I'll have another look at this. Cogsy, yes I hate working with floats too. What I wanted to do is to determine if divLeftOver is a positive or negative number and there are other ways to do that.

    Before I started, I modified the code to eliminate a couple of lines of duplicated code so I might have then stuffed up the working code...
     
  20. Jun 30, 2017 #20

    Captain_Obvious

    Captain_Obvious

    Captain_Obvious

    Active Member

    Joined:
    Jun 3, 2017
    Messages:
    37
    Likes Received:
    14
    OK, no worries. I appreciate you taking the time to do this in the first place.
     

Share This Page