Random Movement

I have this code I found on the internet and it's the basic idea of what I want. Here's what I want, to have constant speed in both directions and have the direction change randomly. I tried to modify this code but it didn't work the way I wanted. I tried to adjust ".setMaxSpeed" and "setAcceleration".

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

if you use

then you don't get constant speed. There is a reason why there is the prefix accel in the name of the library ➜ it implements acceleration

you need to use runSpeed()

brutally changing direction at high speed is harsh on your motor. Acceleration management helps protect it

1 Like

Ok, I understand about trying to change the motor's direction at high speed, I want to keep it at a low speed. I was thinking have it run in one direction, stop, delay, then run in the other direction or maybe the same direction.

I didn't consider the "accel" part meaning implementing acceleration because I got this sketch from the "examples", it uses runSpeed().

// ConstantSpeed.pde
// -*- mode: C++ -*-
//
// Shows how to run AccelStepper in the simplest,
// fixed speed mode with no accelerations
/// \author  Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2009 Mike McCauley
// $Id: ConstantSpeed.pde,v 1.1 2011/01/05 01:51:01 mikem Exp mikem $

#include <AccelStepper.h>

AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

void setup()
{  
   stepper.setMaxSpeed(1000);
   stepper.setSpeed(500);	
   
}

void loop()
{  
   stepper.runSpeed();
}

Actually, I just found this in the "Examples" under "AccelStepper" and is close to what I want but don't know exactly how to put the random() part in.

// Quickstop.pde
// -*- mode: C++ -*-
//
// Check stop handling.
// Calls stop() while the stepper is travelling at full speed, causing
// the stepper to stop as quickly as possible, within the constraints of the
// current acceleration.
//
// Copyright (C) 2012 Mike McCauley
// $Id:  $

#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()
{  
  stepper.setMaxSpeed(150);
  stepper.setAcceleration(100);
}

void loop()
{    
  stepper.moveTo(500);
  while (stepper.currentPosition() != 300) // Full speed up to 300
    stepper.run();
  stepper.stop(); // Stop as fast as possible: sets new target
  stepper.runToPosition(); 
  // Now stopped after quickstop

  // Now go backwards
  stepper.moveTo(-500);
  while (stepper.currentPosition() != 0) // Full speed basck to 0
    stepper.run();
  stepper.stop(); // Stop as fast as possible: sets new target
  stepper.runToPosition(); 
  // Now stopped after quickstop

}
int a = random(2); // a random integer, 0 or 1
if (a)
  direction = direction * -1;

xfpd

Thanks, I'll give it a try.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.