stepmotor: made some small API changes for consistency and usability

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Mihai Tudor Panu 2015-12-22 15:20:30 -08:00
parent 091bd9b381
commit 4dc679af70
6 changed files with 56 additions and 45 deletions

View File

@ -51,24 +51,24 @@ main(int argc, char **argv)
while (doWork) { while (doWork) {
cout << "1 Revolution forward and back at 60 rpm" << endl; cout << "1 Revolution forward and back at 60 rpm" << endl;
sensor->setSpeed (60); sensor->setSpeed(60);
sensor->stepForward(200); sensor->stepForward(200);
usleep (1000000); usleep(1000000);
sensor->stepBackwards(200); sensor->stepBackward(200);
usleep (1000000); usleep(1000000);
cout << "1 Revolution forward and back at 150 rpm" << endl; cout << "1 Revolution forward and back at 150 rpm" << endl;
sensor->setSpeed (150); sensor->setSpeed(150);
sensor->stepForward(200); sensor->stepForward(200);
usleep (1000000); usleep(1000000);
sensor->stepBackwards(200); sensor->stepBackward(200);
usleep (1000000); usleep(1000000);
cout << "1 Revolution forward and back at 300 rpm" << endl; cout << "1 Revolution forward and back at 300 rpm" << endl;
sensor->setSpeed (300); sensor->setSpeed(300);
sensor->stepForward (200); sensor->stepForward(200);
usleep (1000000); usleep (1000000);
sensor->stepBackwards (200); sensor->stepBackward(200);
usleep (1000000); usleep (1000000);
} }

View File

@ -34,21 +34,21 @@ public class StepMotorSample {
sensor.setSpeed(60); sensor.setSpeed(60);
sensor.stepForward(200); sensor.stepForward(200);
Thread.sleep(1000); Thread.sleep(1000);
sensor.stepBackwards(200); sensor.stepBackward(200);
Thread.sleep(1000); Thread.sleep(1000);
System.out.println("One complete rotation forward and back at 150 rpm."); System.out.println("One complete rotation forward and back at 150 rpm.");
sensor.setSpeed(150); sensor.setSpeed(150);
sensor.stepForward(200); sensor.stepForward(200);
Thread.sleep(1000); Thread.sleep(1000);
sensor.stepBackwards(200); sensor.stepBackward(200);
Thread.sleep(1000); Thread.sleep(1000);
System.out.println("One complete rotation forward and back at 300 rpm."); System.out.println("One complete rotation forward and back at 300 rpm.");
sensor.setSpeed(300); sensor.setSpeed(300);
sensor.stepForward(200); sensor.stepForward(200);
Thread.sleep(1000); Thread.sleep(1000);
sensor.stepBackwards(200); sensor.stepBackward(200);
Thread.sleep(1000); Thread.sleep(1000);
} }
// ! [Interesting] // ! [Interesting]

View File

@ -48,21 +48,21 @@ console.log("Rotating 1 revolution forward and back at 60 rpm.");
stepper.setSpeed(60); stepper.setSpeed(60);
stepper.stepForward(200); stepper.stepForward(200);
delay(1000); delay(1000);
stepper.stepBackwards(200); stepper.stepBackward(200);
delay(1000); delay(1000);
console.log("Rotating 1 revolution forward and back at 150 rpm."); console.log("Rotating 1 revolution forward and back at 150 rpm.");
stepper.setSpeed(150); stepper.setSpeed(150);
stepper.stepForward(200); stepper.stepForward(200);
delay(1000); delay(1000);
stepper.stepBackwards(200); stepper.stepBackward(200);
delay(1000); delay(1000);
console.log("Rotating 1 revolution forward and back at 300 rpm."); console.log("Rotating 1 revolution forward and back at 300 rpm.");
stepper.setSpeed(300); stepper.setSpeed(300);
stepper.stepForward(200); stepper.stepForward(200);
delay(1000); delay(1000);
stepper.stepBackwards(200); stepper.stepBackward(200);
delay(1000); delay(1000);
stepper.quit(); stepper.quit();

View File

@ -46,19 +46,19 @@ print "Rotating 1 revolution forward and back at 60 rpm."
stepper.setSpeed(60) stepper.setSpeed(60)
stepper.stepForward(200) stepper.stepForward(200)
time.sleep(1) time.sleep(1)
stepper.stepBackwards(200) stepper.stepBackward(200)
time.sleep(1) time.sleep(1)
print "Rotating 1 revolution forward and back at 150 rpm." print "Rotating 1 revolution forward and back at 150 rpm."
stepper.setSpeed(150) stepper.setSpeed(150)
stepper.stepForward(200) stepper.stepForward(200)
time.sleep(1) time.sleep(1)
stepper.stepBackwards(200) stepper.stepBackward(200)
time.sleep(1) time.sleep(1)
print "Rotating 1 revolution forward and back at 300 rpm." print "Rotating 1 revolution forward and back at 300 rpm."
stepper.setSpeed(300) stepper.setSpeed(300)
stepper.stepForward(200) stepper.stepForward(200)
time.sleep(1) time.sleep(1)
stepper.stepBackwards(200) stepper.stepBackward(200)
time.sleep(1) time.sleep(1)

View File

@ -34,10 +34,13 @@ using namespace upm;
using namespace std; using namespace std;
StepMotor::StepMotor (int dirPin, int stePin, int steps, int enPin) StepMotor::StepMotor (int dirPin, int stePin, int steps, int enPin)
: m_dirPinCtx(dirPin), m_stePinCtx(stePin), m_enPinCtx(0), m_steps(steps) { : m_dirPinCtx(dirPin),
m_stePinCtx(stePin),
m_enPinCtx(0),
m_steps(steps) {
m_name = "StepMotor"; m_name = "StepMotor";
setSpeed(60); setSpeed(60);
setStep(0); setPosition(0);
if (m_dirPinCtx.dir(mraa::DIR_OUT) != mraa::SUCCESS) { if (m_dirPinCtx.dir(mraa::DIR_OUT) != mraa::SUCCESS) {
throw std::runtime_error(string(__FUNCTION__) + throw std::runtime_error(string(__FUNCTION__) +
@ -95,7 +98,7 @@ StepMotor::setSpeed (int speed) {
mraa::Result mraa::Result
StepMotor::step (int ticks) { StepMotor::step (int ticks) {
if (ticks < 0) { if (ticks < 0) {
return stepBackwards(abs(ticks)); return stepBackward(abs(ticks));
} else { } else {
return stepForward(ticks); return stepForward(ticks);
} }
@ -106,37 +109,37 @@ StepMotor::stepForward (int ticks) {
dirForward(); dirForward();
for (int i = 0; i < ticks; i++) { for (int i = 0; i < ticks; i++) {
move(); move();
if (++m_position >= m_steps) { m_position++;
m_position = 0;
}
delayus(m_delay - MINPULSE_US - OVERHEAD_US); delayus(m_delay - MINPULSE_US - OVERHEAD_US);
} }
return mraa::SUCCESS; return mraa::SUCCESS;
} }
mraa::Result mraa::Result
StepMotor::stepBackwards (int ticks) { StepMotor::stepBackward (int ticks) {
dirBackwards(); dirBackward();
for (int i = 0; i < ticks; i++) { for (int i = 0; i < ticks; i++) {
move(); move();
if (--m_position < 0) { m_position--;
m_position = m_steps - 1;
}
delayus(m_delay - MINPULSE_US - OVERHEAD_US); delayus(m_delay - MINPULSE_US - OVERHEAD_US);
} }
return mraa::SUCCESS; return mraa::SUCCESS;
} }
void void
StepMotor::setStep (int step) { StepMotor::setPosition (int pos) {
if (step <= m_steps) { m_position = pos;
m_position = step; }
}
int
StepMotor::getPosition () {
return m_position;
} }
int int
StepMotor::getStep () { StepMotor::getStep () {
return m_position; return m_position < 0 ? m_steps + m_position % m_steps :
m_position % m_steps;
} }
void void
@ -157,7 +160,7 @@ StepMotor::dirForward () {
} }
mraa::Result mraa::Result
StepMotor::dirBackwards () { StepMotor::dirBackward () {
mraa::Result error = m_dirPinCtx.write(LOW); mraa::Result error = m_dirPinCtx.write(LOW);
if (error != mraa::SUCCESS) { if (error != mraa::SUCCESS) {
throw std::runtime_error(string(__FUNCTION__) + throw std::runtime_error(string(__FUNCTION__) +

View File

@ -69,7 +69,7 @@ namespace upm {
* and/or microstepping on stepper drivers that support such features. * and/or microstepping on stepper drivers that support such features.
* *
* @image html stepmotor.jpg * @image html stepmotor.jpg
* <br><em>ECS1030 Sensor image provided by SparkFun* under * <br><em>EasyDriver Sensor image provided by SparkFun* under
* <a href=https://creativecommons.org/licenses/by-nc-sa/3.0/> * <a href=https://creativecommons.org/licenses/by-nc-sa/3.0/>
* CC BY-NC-SA-3.0</a>.</em> * CC BY-NC-SA-3.0</a>.</em>
* *
@ -128,20 +128,28 @@ class StepMotor {
* *
* @param ticks Number of steps the motor moves * @param ticks Number of steps the motor moves
*/ */
mraa::Result stepBackwards (int ticks); mraa::Result stepBackward (int ticks);
/** /**
* Sets the current step. Useful if the motor is not at 0 when the * Sets the current position. Useful if the motor is not at 0 when the
* driver is initialized. * driver is initialized.
* *
* @param step Current shaft position * @param step Current position
*/ */
void setStep (int step); void setPosition (int pos);
/** /**
* Gets the current step. * Gets the current position. This is cumulative and the result of all
* the step commands sent to the motor.
* *
* @return Current shaft position. * @return Stepper's position.
*/
int getPosition ();
/**
* Gets the current step. This is relative to one revolution.
*
* @return Current step, ranges from 0 to number of steps per revolution.
*/ */
int getStep (); int getStep ();
@ -157,7 +165,7 @@ class StepMotor {
int m_position; int m_position;
mraa::Result dirForward (); mraa::Result dirForward ();
mraa::Result dirBackwards (); mraa::Result dirBackward ();
void move (); void move ();
void delayus (int us); void delayus (int us);
}; };