I have an Arduino connected to a stepper motor with an Easy Driver as follows: enter image description here
I am controlling the position of the stepper motor using the Serial. This is my code:
#include <AccelStepper.h>
AccelStepper stepper(1, 9, 8);
void setup()
{
Serial.begin(9600);
stepper.setMaxSpeed(10000);
stepper.setAcceleration(5000);
}
void loop()
{
char c;
if(Serial.available())
{
int steps = Serial.parseInt();
Serial.print(steps);
stepper.moveTo(steps);
}
stepper.run();
}
The code works well but I'm facing a problem, when I set a high position value, it starts turning in the opposite direction, like if there was a limit on the steps. Does anyone know why it starts turning to the opposite direction?
I have tried to solve this problem by using:
if (stepper1.distanceToGo() == 0)
{
stepper1.setCurrentPosition(0);
}
so I can set lower values to the serial. But the problem goes back again when the value goes up to the power of 6 (like 1000000).
Any idea?
Thanks!
-
1Per a comment from the developer of AccelStepper, the line AccelStepper stepper(1, 9, 8); should be written as AccelStepper stepper(AccelStepper::DRIVER, 9, 8); for claritydinotom– dinotom2016年04月14日 20:03:30 +00:00Commented Apr 14, 2016 at 20:03
1 Answer 1
Ints on vanilla Arduinos are 16 bits, and signed, which means they hold values from -2^15 to +2^15-1, so of course you cannot assign 10^6 to one of them. Use unsigned long (4 bytes), or, better yet, specify the length explicitly by using uint32_t.
-
could you post me the reference of this?Alvaro– Alvaro2016年04月14日 08:02:39 +00:00Commented Apr 14, 2016 at 8:02
-
1This has always been the case for 16-bit processors. Plus, it's in the adruino documentation. Plus, you can verify it for yourself by writing a one-line program.JayEye– JayEye2016年04月14日 15:44:28 +00:00Commented Apr 14, 2016 at 15:44