Go Down

Topic: Rewersing directionof stepper motor with limit switch (Read 2 times) previous topic - next topic

dewy721

#5
Feb 23, 2013, 05:22 am Last Edit: Feb 23, 2013, 05:28 am by dewy721 Reason: 1
top of file add: (replace A0 & A1 with your selection of pins.)
#define switchPinA A0
#define switchPinB A1

Add to void setup()

 pinMode(switchPinA,INPUT);
 pinMode(switchPinB,INPUT);
 digitalWrite(switchPinA,HIGH);
 digitalWrite(switchPinB,HIGH);

in void loop() replace:
//stepper.moveTo(rand() % 200);
*with*
long someRandomPosition=rand() % 200;
if(digitalRead(switchPinA)==HIGH || digitalRead(switchPinB)==HIGH)
{
  someRandomPosition=someRandomPosition * -1; // just invert data
}
stepper.moveTo(someRandomPosition);



PS: According to  if (stepper.distanceToGo() == 0)
it will change direction based on switches, ONLY after it completes the previous move.

If you wish to have it switch directions instantly, then you just need to put the blue code outside of the if (stepper.distanceToGo() == 0) statement.

websonic

Hi Dewy,

Thanks for advice and your time.

I am still having trouble

when I include long someRandomPosition=rand() % 200;
Stepper just gets blocked.

With out that change motor always runs in one direction.

Pls take >look at the code, What I have done wrong?

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::FULL4WIRE, 8, 9, 10,11);

#define switchPinA 2
#define switchPinB 3

void setup()

  pinMode(switchPinA,INPUT);
  pinMode(switchPinB,INPUT);
  digitalWrite(switchPinA,HIGH);
  digitalWrite(switchPinB,HIGH);
}

void loop()
{
    if (stepper.distanceToGo() == 0)
    {
   // Random change to speed, position and acceleration
   // Make sure we dont get 0 speed or accelerations
   delay(1000);
   long someRandomPosition=rand() % 200;
   stepper.setMaxSpeed((rand() % 200) + 1);
   stepper.setAcceleration((rand() % 200) + 1);
    if(digitalRead(switchPinA)==HIGH || digitalRead(switchPinB)==HIGH)
{
        //someRandomPosition=someRandomPosition * -1; // just invert data
}
        stepper.moveTo(-1);
    }
    stepper.run();
}

dewy721

Try this instead:

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::FULL4WIRE, 8, 9, 10,11);

#define switchPinA 2
#define switchPinB 3
#define lowestRandomNum -100
#define highestRandomNum 100

void setup()
{
  pinMode(switchPinA,INPUT);
  pinMode(switchPinB,INPUT);
  digitalWrite(switchPinA,HIGH);
  digitalWrite(switchPinB,HIGH);
}

void loop()
{
   if (stepper.distanceToGo() == 0)
   {
     // Random change to speed, position and acceleration
     // Make sure we dont get 0 speed or accelerations
     delay(1000);
     long someRandomPosition=random(lowestRandomNum, highestRandomNum);
     stepper.setMaxSpeed(random(0, highestRandomNum) + 1);
     stepper.setAcceleration(random(1, highestRandomNum) + 1);
     if(digitalRead(switchPinA)==HIGH || digitalRead(switchPinB)==HIGH)
     {
       someRandomPosition=someRandomPosition * -1; // just invert data
     }
     stepper.moveTo(someRandomPosition);
   }
   stepper.run();
}

websonic

Hi Dewy,

This time it is working :) thanks, thanks ,thanks :)

If you do have more time for me,

1) I do not think that when limit switch is activated motor changes direction straight away.
2) and I would greatly appreciated if you can advise me how to set minimum speed in random behavior.

I have checked limit switches with simple sketch to activate 2 LEDs, and I am sure that part is ok.

Thanks in advance

dewy721

Ok for that, let's take a look at the AccelStepper command reference:

First, lets fix the brakes:
From:
    Quickstop.pde.

We'll need to add the use of:
stop() "Sets a new target position that causes the stepper to stop as quickly as possible..."
runToPosition() "Moves the motor at the currently selected constant speed (forward or reverse) to the target position..."

Now lets rev up the minimum speed:
setMaxSpeed() "Sets the maximum permitted speed."

void loop()
{
   if (stepper.distanceToGo() == 0)
   {
     // Random change to speed, position and acceleration
     // Make sure we dont get 0 speed or accelerations
     delay(1000);
     long someRandomPosition=random(lowestRandomNum, highestRandomNum);
     stepper.setMaxSpeed(random(10, highestRandomNum) + 1);
     stepper.setAcceleration(random(1, highestRandomNum) + 1);
     if(digitalRead(switchPinA)==HIGH || digitalRead(switchPinB)==HIGH)
     {
       someRandomPosition=someRandomPosition * -1; // just invert data
       stepper.stop(); // Stop as fast as possible: sets new target
       stepper.runToPosition();
     }
     stepper.moveTo(someRandomPosition);
   }
   stepper.run();
}

Ok, that's my limit of two freebies per customer. Its your turn to hack at it. :)

Go Up