One year later!
I "had" the code running perfectly at my desk.
I hadn't gotten the Z Axis motor mounted so I could not test on my lathe.
Now I have the motor mounted and am ready to test.
Nothing happened when I tried to run the code in my shop on the lathe .
I "thought" I would try at my desk again.
At my desk I am using a TB6600 clone.
It took me two weeks to get to running the code and being able to test
The motor does not make a full revolution but stops and the noise continues.
This is Jim Larson's code with modifications: I tried to remove all of the unused println but got errors.
// 02/09/2023 believe this is the version installed! I it came up when I opened Arduino.
// Include the AccelStepper Library
#include <AccelStepper.h>
#include <elapsedMillis.h>
// Motor Connections (constant current, step/direction bipolar motor driver)
const int dirPin = 4;
AccelStepper myStepper(AccelStepper::DRIVER, stepPin, dirPin); // works for a4988 (Bipolar, constant current, step/direction driver)
// State definitions
#define READ_BUTTONS 01
#define RJSTR 02
#define JOG_CMD 03
#define STOP_NOW 04
#define JOG_RECOVER 05
// State variable
long STOP;
int state;
elapsedMillis printTime;
volatile int enabFlag; // controls the end stop sensor interrupt
long int endLimit = -300000;
bool findLimit = true;
bool jogged = false;
//Button pin assignments
int JogLt = A2;
int JogRt = A1;
int Run = A3;
int Pot = A0;
const int ENA = 7;
int Limit_1 = A5;
int sensorReading;
int motorSpeed;
void setup () {
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(2), rising, FALLING); // Interrupt 0 is pin D2
enabFlag = 1; // enable the sensor interrupt
state = READ_BUTTONS; // initial state is to read buttons
myStepper.setMaxSpeed(4500.);
myStepper.setAcceleration(2000.0);
// Buttons
pinMode(JogRt, INPUT_PULLUP);
pinMode(JogLt, INPUT_PULLUP);
pinMode(Run, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(Limit_1,INPUT_PULLUP); // Limit Switch needs to be 'pulled' LOW (connected to GND) to operate
pinMode(ENA,OUTPUT); // ENA, enable pin is set to OUTPUT
myStepper.moveTo (myStart );
myStepper.runToPosition();
//Serial.println(myStepper.currentPosition());
digitalWrite(ENA, HIGH);
}
void loop () {
if (digitalRead(Limit_1) == LOW) // First 'if', Limit Switch is operated and pin input is grounded or LOW
{
digitalWrite(ENA, LOW);
//Serial.print("Pot ");
/*
Serial.print(sensorReading);
Serial.print(" Motor Speed ");
Serial.print(motorSpeed);
Serial.print(" Current Speed ");
Serial.print(digitalRead(Limit_1));
Serial.print("++++");
Serial.print(digitalRead(ENA));
Serial.print("++++");
Serial.print(" Start ");
Serial.print(myStart);
Serial.print(" Target ");
Serial.print(myStepper.targetPosition());
Serial.print(" Current Position ");
Serial.print(myStepper.currentPosition());
Serial.print("find stop");
Serial.print("start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.print(endLimit);
Serial.print("After set -- start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.println(endLimit);
*/
myStepper.stop();
myStepper.runToPosition(); // brings to a stop!
myStepper.moveTo(myStart);
findLimit = true;
state = RJSTR;
}
if (digitalRead(Limit_1) == HIGH) // Second 'if', Limit Switch is operated and pin input is 'PULLED UP' or HIGH.
{ // Basically not connected because you told the Limit-1 pin to be INPUT_PULLUP
digitalWrite(ENA,HIGH);
/*
Serial.print(" Start ");
Serial.print(myStart);
Serial.print(" Target ");
Serial.print(myStepper.targetPosition());
Serial.print(" Current Position ");
Serial.print(myStepper.currentPosition());
*/
/*
Serial.print("find stop");
Serial.print("start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.print(endLimit);
Serial.print("After set -- start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.print(endLimit);
Serial.print("----");
*/
//Serial.print(digitalRead(Limit_1));
//Serial.print(" ENA ");
//Serial.print(digitalRead(ENA));
//Serial.print(" Pot ");
//Serial.print(sensorReading);
//Serial.print(" Motor Speed ");
//Serial.print(motorSpeed);
//Serial.print(" Current Speed ");
//Serial.println(myStepper.speed());
//Serial.print(" Current Position ");
//Serial.println(myStepper.currentPosition());
/*
Serial.print("++++");
Serial.print(" Start ");
Serial.print(myStart);
Serial.print(" Target ");
Serial.print(myStepper.targetPosition());
Serial.print(" Current Position ");
Serial.print(myStepper.currentPosition());
Serial.print("find stop");
Serial.print("start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.print(endLimit);
Serial.print("After set -- start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.println(endLimit);
*/
}
switch (state) {
case READ_BUTTONS:
if ( digitalRead(JogRt) == LOW )
{
//Serial.println("jog right");
//Serial.println(myStepper.currentPosition());
myStepper.move (-100 ); // right is assumed positive
//Serial.println(myStepper.targetPosition());
myStepper.setSpeed(-100.); // this is the jog speed
state = JOG_CMD;
}
if ( digitalRead(JogLt) == LOW )
{
//Serial.println("jog left");
//Serial.println(myStepper.currentPosition());
myStepper.move (100 );
//Serial.println(myStepper.targetPosition());
myStepper.setSpeed(100.);
state = JOG_CMD;
}
if ( digitalRead(Run) == LOW)
{
// if searching for the target limit, set it and then run back to START. Otherwise, just run and wait for STOP
if (findLimit) {
//Serial.println("find stop");
//Serial.print("start: ");
//Serial.println(myStart);
//Serial.print("end: ");
//Serial.println(endLimit);
myStart = myStepper.currentPosition();
//Serial.print("After set -- start: ");
//Serial.println(myStart);
//Serial.print("end: ");
//Serial.println(endLimit);
if (jogged) {
state = JOG_RECOVER;
}
else {
myStepper.moveTo(endLimit);
enabFlag = 1; // enable the sensor interrupt
findLimit = false;
state = RJSTR;
}
}
else { // heading back to start
//Serial.println("back to start");
//Serial.print("start: ");
//Serial.println(myStart);
//Serial.print("end: ");
//Serial.println(endLimit);
endLimit = myStepper.currentPosition();
//Serial.print("After set -- start: ");
//Serial.println(myStart);
//Serial.print("end: ");
//Serial.println(endLimit);
if (jogged) {
state = JOG_RECOVER;
}
else {
myStepper.moveTo(myStart);
enabFlag = 1; // enable the sensor interrupt
findLimit = true;
state = RJSTR;
}
}
}
delay(200); // tune for desired response time
break;
case JOG_RECOVER:
Serial.println("recovering");
myStepper.setCurrentPosition(myStepper.currentPosition());
if (findLimit) {
myStepper.moveTo(endLimit);
findLimit = false;
}
else
{
myStepper.moveTo(myStart);
findLimit = true;
}
enabFlag = 1; // enable the sensor interrupt
jogged = false;
state = RJSTR;
break;
case JOG_CMD:
Serial.println("jogging");
while (myStepper.distanceToGo() != 0) { // make the move before proceeding
myStepper.runSpeed();
}
//Serial.println(myStepper.currentPosition());
state = READ_BUTTONS; // read buttons again.
jogged = true;
break;
case RJSTR:
//Serial.println("running");
if (printTime >= 1000) { // happens once per second
printTime = 0;
// Use Pot to set myStepper.setMaxSpeed(?????);
// read the sensor value:
sensorReading = analogRead(A0);
// map it to a the maximum speed range
motorSpeed = map(sensorReading, 0, 1023, 5, 12000);
myStepper.setMaxSpeed(motorSpeed);
Serial.print(" Start ");
Serial.print(myStart);
Serial.print(" Target ");
Serial.print(myStepper.targetPosition());
Serial.print(" Current Position ");
Serial.print(myStepper.currentPosition());
Serial.print("find stop");
Serial.print("start: ");
Serial.print(myStart);
Serial.print("end: ");
Serial.print(endLimit);
//Serial.print("====");
//Serial.print(sensorReading);
//Serial.print("====");
//Serial.print(motorSpeed);
//Serial.print("====");
//*/
//Serial.print(myStepper.speed());
//Serial.print(" ");
//Serial.println(myStepper.currentPosition());
}
if (!myStepper.run()) {
state = READ_BUTTONS;
//Serial.println("done with run");
}
break;
case STOP_NOW:
//Serial.println("stopping");
myStepper.setAcceleration(4000); // this makes motor stop much quicker!
myStepper.stop();
myStepper.runToPosition(); // brings to a stop!
myStepper.setAcceleration(4000.0); // slow motor acceleration back down
state = READ_BUTTONS;
break;
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++ Interrupt service routine +++++++++++++++++++++++++++++
// Come here if rising edge on D2.
// If enable flag is true, enter state STOP_NOW
void rising() {
if (enabFlag == 1) {
state = STOP_NOW;
enabFlag = 0;
}
}
Appreciate the help.