Go Down

Topic: Motor running forward and reverse at different speeds (Read 153 times)previous topic - next topic

frankernest1935

Hi All

Please bear with me, as in spite of my advanced years, I am trying to learn coding my Arduino Uno.
Whilst I am learning I am trying to construct a sketch to opearate a stepper motor with two buttons. One button to run the motor in one direction at a certain speed and to keep running whilst the button is depressed.
When the other button is pressed the motor needs to run in the reverse direction but at a different set speed, also to run whilst the button is pressed.

I have been studying the sketches of Brian Schmalz for the EasyDriver, and have found them very useful and instructive, so I have tried to modify one of those sketches to do what I want.

I list the sketch below and would appreciate some guidance and advice. I do realise that the more experienced of you could well get exasperated by such questions, but much of this stuff related to steppers isn't to be found in any of the books I have acquired so far.

Thanks in anticipation:

#define DISTANCE 3200

int StepCounter = 0;
int Stepping = false;

void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

pinMode(2, INPUT);
pinMode(3, INPUT);
}

void loop() {
if (digitalRead(3) == LOW && Stepping == false)
{
digitalWrite(8, LOW);
Stepping = true;
}

if (Stepping == true)
{
digitalWrite(9, HIGH);
delay(1);
digitalWrite(9, LOW);
delay(1);

StepCounter = StepCounter + 1;

if (StepCounter == DISTANCE)
{
StepCounter = 0;
Stepping = false;
}
}
if (digitalRead(2) == LOW && Stepping == false)
{
digitalWrite(8, HIGH);
Stepping = true;

if (Stepping == true)
{
digitalWrite(9, HIGH);
delay(10);
digitalWrite(9, LOW);
delay(10);

StepCounter = StepCounter + 1;

if (StepCounter == DISTANCE)
{
StepCounter = 0;
Stepping = false;
}
}
}

AWOL

#1
Jun 25, 2019, 08:00 pm
Pins without names suck.
"Pete, it's a fool (who) looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

PaulS

#2
Jun 25, 2019, 08:11 pm
Code: [Select]
`    if (StepCounter == DISTANCE)`
It does not appear logical to compare the number of steps taken to a distance. One of these names needs to change.

What kind of stepper driver are you using? The AccelStepper library could handle the stepping at differing speeds for you.

frankernest1935

#3
Jun 25, 2019, 08:50 pm
PaulS

I am using Easydriver with Nema17 motor.

The basis of the sketch as I said was as published by Brai Scmalz, the designer of the Easydriver module.

I will look into AccelStepper library, but would still appreciate any guidance.

PaulS

#4
Jun 26, 2019, 10:59 am
Quote
but would still appreciate any guidance.
The sketch you posted does something. You did not explain what it actually does.

You want the sketch to do something. It is not clear how what the sketch actually does differs from what you want, so any guidance is not going to lead you where you want to go.

Robin2

#5
Jun 26, 2019, 11:27 am
Give all your I/O pins names so we can understand what writing to different pins is intended to do.

There is a missing } in your code and I don't know where it should go.

The structure of the code that deals with
Code: [Select]
`if (digitalRead(3) == LOW && Stepping == false)`
is completely different from the structure of the code that deals with
Code: [Select]
`    if (digitalRead(2) == LOW && Stepping == false)`

If you use the AutoFormat tool to lay out your code consistently the missing } and the different structures would be more obvious.

When posting code please use the code button </>

Code: [Select]
`so your code looks like this`
and is easy to copy to a text editor See How to use the Forum

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Blue Eyes

#6
Jun 26, 2019, 04:37 pm
My advice is to first get the buttons working and then add motor movement.  You should have variables for both buttons and read them each time through loop().  If the "move forward" or "move in reverse" button is pressed write a message to the serial monitor.  When this is working you can move on to motor control.

In code it would look something like this (with an added variable set to true when either button is pressed):

Code: [Select]
`const byte FORWARD_BTN = 2;  // forwared buttonconst byte REV_BTN = 3;      // reverse buttonboolean moveMotor = false;  // true => motor should movevoid setup(){  Serial.begin(9600);  // buttons  pinMode(FORWARD_BTN, INPUT);  pinMode(REV_BTN, INPUT);}void loop(){  // foward button  if( digitalRead(FORWARD_BTN) == LOW )  {    // set flag     moveMotor = true;    Serial.println("Moving forward ...");  }   else if(digitalRead(REV_BTN) == LOW) {    // set flag     moveMotor = true;    Serial.print("Moving in reverse ...");  } // else  // reset flag   moveMotor = false;}`

Now consider what the difference is, in terms of the Easy Driver, between moving in one direction or the other.  The direction pin is either HIGH or LOW.  Each time through loop() if a button is pressed set the direction pin and move the motor.  I think your speed requirement could be met by changing the number of steps moved in each direction.

I don't have an Easy Driver board but based on you posting and the guide at SparkFun I took a stab at filling in the motor control to the above, try it out if you like.

Code: [Select]
`const byte FORWARD_BTN = 2;  // forwared buttonconst byte REV_BTN = 3;      // reverse button// steps for one moveconst int FWD_STEPS = 500;const int REV_STEPS = 250;int stepCount;// easy driver pinsconst byte MOTOR_DIR_PIN = 8;const byte MOTOR_STEP_PIN = 9;const byte MOTOR_ENABLE_PIN = 6;byte motorDir;  // direction pin valueboolean moveMotor = false;  // true => motor should movevoid setup(){  Serial.begin(9600);  // easy driver  pinMode(MOTOR_ENABLE_PIN, OUTPUT);  pinMode(MOTOR_DIR_PIN, OUTPUT);  pinMode(MOTOR_STEP_PIN, OUTPUT);  digitalWrite(MOTOR_ENABLE_PIN, HIGH);  // buttons  pinMode(FORWARD_BTN, INPUT);  pinMode(REV_BTN, INPUT);}void loop(){  // foward button  if( digitalRead(FORWARD_BTN) == LOW )  {    // set flag     moveMotor = true;    // set direction    motorDir = LOW;    // # of steps    stepCount = FWD_STEPS;    Serial.println("Moving forward ...");  }   else if(digitalRead(REV_BTN) == LOW) {    // set flag     moveMotor = true;    // set direction    motorDir = HIGH;    // # of steps    stepCount = 250;    Serial.print("Moving in reverse ...");  } // else  // if we should move the motor  if( moveMotor )  {    digitalWrite(MOTOR_ENABLE_PIN, LOW);    // move desired # of steps    for(int steps = 0; steps < stepCount; steps++)    {      digitalWrite(MOTOR_STEP_PIN, HIGH);      delay(1);      digitalWrite(MOTOR_STEP_PIN, LOW);    } // for    digitalWrite(MOTOR_ENABLE_PIN, HIGH);  } // if  // reset flag   moveMotor = false;}`

Go Up