A library for the Arduino motor shield board

Dependents:   HIDTympDeviceWithPIDController

Revision:
0:f4e71504732d
Child:
1:5f2774bf44a5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ArduinoMotorShield.cpp	Tue Nov 05 20:28:36 2013 +0000
@@ -0,0 +1,161 @@
+#include "ArduinoMotorShield.h"
+#include "mbed.h"
+
+//Timer for measure time between steps
+Timer timer;
+
+//Ticker for running at a specified speed
+Ticker runTick;
+
+/*
+ *   constructor for four-pin version
+ *   Sets which wires should control the motor.
+ */
+ArduinoMotorShield::ArduinoMotorShield(int numberOfSteps, PinName brakeA, PinName brakeB, PinName dirA, PinName dirB, PinName pvmA, PinName pvmB) : _BRAKEA(brakeA),_BRAKEB(brakeB),_DIRA(dirA),_DIRB(dirB),_ENA_A(pvmA),_ENA_B(pvmB)
+{
+  this->step_number = 0;      // which step the motor is on
+  this->speed = 0;        // the motor speed, in revolutions per minute
+  this->direction = 0;      // motor direction
+  this->last_step_time = 0;    // time stamp in ms of the last step taken
+  this->number_of_steps = numberOfSteps;    // total number of steps for this motor
+
+
+  this->_ENA_A = 1; //TODO: move. For enable the L298 in stepper mode
+  this->_ENA_B = 1; //TODO: move. For enable the L298 in stepper mode
+
+}
+
+
+void ArduinoMotorShield::setStepperSpeed(long whatSpeed)
+{
+  this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
+}
+
+
+void ArduinoMotorShield::step(int numberOfSteps)
+{
+  timer.start();
+  int steps_left = abs(numberOfSteps);  // how many steps to take
+
+  // determine direction based on whether steps_to_mode is + or -:
+  if (numberOfSteps > 0) {this->direction = 1;}
+  if (numberOfSteps < 0) {this->direction = 0;}
+
+
+  // decrement the number of steps, moving one step each time:
+  while(steps_left > 0) {
+  // move only if the appropriate delay has passed:
+  if (timer.read_ms() - this->last_step_time >= this->step_delay) {
+      // get the timeStamp of when you stepped:
+      this->last_step_time = timer.read_ms();
+      // increment or decrement the step number,
+      // depending on direction:
+      if (this->direction == 1) {
+        this->step_number++;
+        if (this->step_number == this->number_of_steps) {
+          this->step_number = 0;
+        }
+      }
+      else {
+        if (this->step_number == 0) {
+          this->step_number = this->number_of_steps;
+        }
+        this->step_number--;
+      }
+      // decrement the steps left:
+      steps_left--;
+      // step the motor to step number 0, 1, 2, or 3:
+      stepMotor(this->step_number % 4);
+    }
+  }
+}
+
+// tick event handler for running the motor at a specified speed
+void ArduinoMotorShield::runMotor(void)
+{
+    // increment or decrement the step number,
+      // depending on direction:
+      if (this->direction == 1) {
+        this->step_number++;
+        if (this->step_number == this->number_of_steps) {
+          this->step_number = 0;
+        }
+      }
+      else {
+        if (this->step_number == 0) {
+          this->step_number = this->number_of_steps;
+        }
+        this->step_number--;
+      }
+
+      // step the motor to step number 0, 1, 2, or 3:
+      stepMotor(this->step_number % 4);
+}
+
+// Run at a specified speed, no blocking
+void ArduinoMotorShield::runStepperAtSpeed(bool startStop, int whatSpeed, int direction)
+{
+    this->direction = direction;
+    if(whatSpeed != 0)
+    {
+        this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
+    }
+    else
+    {
+        this->step_delay = 60L * 1000L / this->number_of_steps / 1;
+    }
+
+    if(startStop)
+    {
+        runTick.attach_us(this, &ArduinoMotorShield::runMotor, step_delay*1000); // the address of the function to be attached
+    }
+    else
+    {
+        runTick.detach();
+        _BRAKEA = 0;
+        _BRAKEB = 0;
+        _DIRA = 0;
+        _DIRB = 0;
+        _ENA_A = 0;
+        _ENA_B = 0;
+    }
+}
+
+/*
+ * Moves the motor forward or backwards.
+ */
+void ArduinoMotorShield::stepMotor(int thisStep)
+{
+  switch (thisStep) {
+      case 0:    // 1010
+          _BRAKEA = 0;  // brake A
+          _BRAKEB = 0;  // brake B
+          _DIRA = 1;
+          _DIRB = 1;
+      break;
+      case 1:    // 0110
+          _BRAKEA = 0;  // brake A
+          _BRAKEB = 0;  // brake B
+          _DIRA = 0;
+          _DIRB = 1;
+      break;
+      case 2:    //0101
+          _BRAKEA = 0;  // brake A
+          _BRAKEB = 0;  // brake B
+          _DIRA = 0;
+          _DIRB = 0;
+      break;
+      case 3:    //1001
+          _BRAKEA = 0;  // brake A
+          _BRAKEB = 0;  // brake B
+          _DIRA = 1;
+          _DIRB = 0;
+      break;
+    }
+ }
+
+
+
+
+
+