04-04-2015, 02:33 PM
I found a sketch on CNCZone that uses an Arduino with an I2C module on the LCD, and a 4x4 matrix keypad to control a Rotary Table. The sketch allows input of a # of degrees to move the RT.
I have adapted the code to my specific setup and have it working with the exception that it won't change direction. Will the Arduino/C++ experts please take a look at the code and see if there is something obvious. As it is, I can input # 0f degrees and cause stepper movement, repeat the movement, and reset to enter different # of degrees,but the direction option doesn't work. Either direction option moves the stepper in the same direction.
Thanks in advance,
Chuck
I have adapted the code to my specific setup and have it working with the exception that it won't change direction. Will the Arduino/C++ experts please take a look at the code and see if there is something obvious. As it is, I can input # 0f degrees and cause stepper movement, repeat the movement, and reset to enter different # of degrees,but the direction option doesn't work. Either direction option moves the stepper in the same direction.
Code:
/*
Degrees only
This sketch was downloaded from http://www.cnczone.com/forums/arduino/215402-cnc.html#post1461918.
It is the first sketch in the thread. I have modified it to match my setup.
Sketch works to set # of degree to rotate, but I cannot get it to change direction.
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 = 200; //Set Steps per rotation of stepper
const int TableRatio = 90; //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 = 1;
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 Control");
lcd.setCursor(0,2);
lcd.print("by sloucs,on CNCZone");
lcd.setCursor(0,3);
lcd.print("Modified by Chucketn" );
delay(2000);
}
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 Control");
lcd.setCursor(0,2);
lcd.print("Enter Deg & Press #");
lcd.setCursor(0,3);
lcd.print(" ");
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 d = 0;
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" FWD [A] REV [B]");
while(d == 0)
{
char key = kpd.getKey();
if(key == 'A')
{
d = 1;
}
else if(key == 'B')
{
d = -1;
}
}
Direction = d;
lcd.clear();
return d;
//lcd.print(d);
//delay(2000);
}
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(8,1);
lcd.print("Moving");
rotation(ToMove,0);
lcd.setCursor(8,1);
lcd.print(" ");
}
else
{
ToMove = Degrees*Multiplier;
lcd.setCursor(0,0);
lcd.print("FWD ");
lcd.print(Degrees,2);
lcd.print((char)223);
lcd.setCursor(8,1);
lcd.print("Moving ");
rotation(ToMove,1);
lcd.setCursor(8,1);
lcd.print(" ");
}
lcd.setCursor(0,1);
lcd.print("To Cont Press [A]");
lcd.setCursor(0,2);
lcd.print("To Reset Press [D]");
char key = kpd.getKey();
while(key != 'D')
{
key = kpd.getKey();
if(key == 'A')
{
if(Degrees < 0)
{
ToMove = (Degrees*Multiplier)*-1;
lcd.setCursor(8,1);
lcd.print("Moving");
rotation(ToMove,0);
lcd.setCursor(8,1);
lcd.print(" ");
}
else
{
ToMove = Degrees*Multiplier;
lcd.setCursor(8,1);
lcd.print("Moving");
rotation(ToMove,1);
lcd.setCursor(8,1);
lcd.print(" ");
}
}
}
lcd.clear();
}
Thanks in advance,
Chuck
Micromark 7x14 Lathe, X2 Mill , old Green 4x6 bandsaw
The difficult takes me a while, the impossible takes a little longer.
The difficult takes me a while, the impossible takes a little longer.