Rewersing directionof stepper motor with limit switch

Hi everybody,
I am very new in this field,
can somebody help me with a sample code how to reverse direction of a stepper motor when 5v is applied through limit switch?

I have managed to switch of an on LED, with switch, but Stepper are out of my range.

Thanks In advance

How is your stepper wired up?

It is 6 wire unipolar motor,
Controlled over arduino uno,

And i am trying to use accel stepper library

Existing code?

Hardly any,

I want to use random example from accelstepper

any ideas hot to incorporate two limit switches which would only reverse reverse direction if activated

Thanks in advance

// Random.pde
// -- mode: C++ --
//
// Make a single stepper perform random changes in speed, position and acceleration
//
// Copyright (C) 2009 Mike McCauley
// $Id: Random.pde,v 1.1 2011/01/05 01:51:01 mikem Exp mikem $

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

void setup()
{
}

void loop()
{
if (stepper.distanceToGo() == 0)
{
// Random change to speed, position and acceleration
// Make sure we dont get 0 speed or accelerations
delay(1000);
stepper.moveTo(rand() % 200);
stepper.setMaxSpeed((rand() % 200) + 1);
stepper.setAcceleration((rand() % 200) + 1);
}
stepper.run();
}

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.

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();
}

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();
}

Hi Dewy,

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

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

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. :slight_smile:

God Bless my friend :slight_smile:

I am greatfull and for this much