A library for the Arduino motor shield board

Dependents:   HIDTympDeviceWithPIDController

Committer:
piniels
Date:
Thu Nov 07 12:44:13 2013 +0000
Revision:
1:5f2774bf44a5
Parent:
0:f4e71504732d
added enable pins to be enabled when stepper is running:-)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piniels 0:f4e71504732d 1 #include "ArduinoMotorShield.h"
piniels 0:f4e71504732d 2 #include "mbed.h"
piniels 0:f4e71504732d 3
piniels 0:f4e71504732d 4 //Timer for measure time between steps
piniels 0:f4e71504732d 5 Timer timer;
piniels 0:f4e71504732d 6
piniels 0:f4e71504732d 7 //Ticker for running at a specified speed
piniels 0:f4e71504732d 8 Ticker runTick;
piniels 0:f4e71504732d 9
piniels 0:f4e71504732d 10 /*
piniels 0:f4e71504732d 11 * constructor for four-pin version
piniels 0:f4e71504732d 12 * Sets which wires should control the motor.
piniels 0:f4e71504732d 13 */
piniels 0:f4e71504732d 14 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)
piniels 0:f4e71504732d 15 {
piniels 0:f4e71504732d 16 this->step_number = 0; // which step the motor is on
piniels 0:f4e71504732d 17 this->speed = 0; // the motor speed, in revolutions per minute
piniels 0:f4e71504732d 18 this->direction = 0; // motor direction
piniels 0:f4e71504732d 19 this->last_step_time = 0; // time stamp in ms of the last step taken
piniels 0:f4e71504732d 20 this->number_of_steps = numberOfSteps; // total number of steps for this motor
piniels 0:f4e71504732d 21
piniels 0:f4e71504732d 22
piniels 0:f4e71504732d 23 this->_ENA_A = 1; //TODO: move. For enable the L298 in stepper mode
piniels 0:f4e71504732d 24 this->_ENA_B = 1; //TODO: move. For enable the L298 in stepper mode
piniels 0:f4e71504732d 25
piniels 0:f4e71504732d 26 }
piniels 0:f4e71504732d 27
piniels 0:f4e71504732d 28
piniels 0:f4e71504732d 29 void ArduinoMotorShield::setStepperSpeed(long whatSpeed)
piniels 0:f4e71504732d 30 {
piniels 0:f4e71504732d 31 this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
piniels 0:f4e71504732d 32 }
piniels 0:f4e71504732d 33
piniels 0:f4e71504732d 34
piniels 0:f4e71504732d 35 void ArduinoMotorShield::step(int numberOfSteps)
piniels 0:f4e71504732d 36 {
piniels 0:f4e71504732d 37 timer.start();
piniels 0:f4e71504732d 38 int steps_left = abs(numberOfSteps); // how many steps to take
piniels 0:f4e71504732d 39
piniels 0:f4e71504732d 40 // determine direction based on whether steps_to_mode is + or -:
piniels 0:f4e71504732d 41 if (numberOfSteps > 0) {this->direction = 1;}
piniels 0:f4e71504732d 42 if (numberOfSteps < 0) {this->direction = 0;}
piniels 0:f4e71504732d 43
piniels 0:f4e71504732d 44
piniels 0:f4e71504732d 45 // decrement the number of steps, moving one step each time:
piniels 0:f4e71504732d 46 while(steps_left > 0) {
piniels 0:f4e71504732d 47 // move only if the appropriate delay has passed:
piniels 0:f4e71504732d 48 if (timer.read_ms() - this->last_step_time >= this->step_delay) {
piniels 0:f4e71504732d 49 // get the timeStamp of when you stepped:
piniels 0:f4e71504732d 50 this->last_step_time = timer.read_ms();
piniels 0:f4e71504732d 51 // increment or decrement the step number,
piniels 0:f4e71504732d 52 // depending on direction:
piniels 0:f4e71504732d 53 if (this->direction == 1) {
piniels 0:f4e71504732d 54 this->step_number++;
piniels 0:f4e71504732d 55 if (this->step_number == this->number_of_steps) {
piniels 0:f4e71504732d 56 this->step_number = 0;
piniels 0:f4e71504732d 57 }
piniels 0:f4e71504732d 58 }
piniels 0:f4e71504732d 59 else {
piniels 0:f4e71504732d 60 if (this->step_number == 0) {
piniels 0:f4e71504732d 61 this->step_number = this->number_of_steps;
piniels 0:f4e71504732d 62 }
piniels 0:f4e71504732d 63 this->step_number--;
piniels 0:f4e71504732d 64 }
piniels 0:f4e71504732d 65 // decrement the steps left:
piniels 0:f4e71504732d 66 steps_left--;
piniels 0:f4e71504732d 67 // step the motor to step number 0, 1, 2, or 3:
piniels 0:f4e71504732d 68 stepMotor(this->step_number % 4);
piniels 0:f4e71504732d 69 }
piniels 0:f4e71504732d 70 }
piniels 0:f4e71504732d 71 }
piniels 0:f4e71504732d 72
piniels 0:f4e71504732d 73 // tick event handler for running the motor at a specified speed
piniels 0:f4e71504732d 74 void ArduinoMotorShield::runMotor(void)
piniels 0:f4e71504732d 75 {
piniels 0:f4e71504732d 76 // increment or decrement the step number,
piniels 0:f4e71504732d 77 // depending on direction:
piniels 0:f4e71504732d 78 if (this->direction == 1) {
piniels 0:f4e71504732d 79 this->step_number++;
piniels 0:f4e71504732d 80 if (this->step_number == this->number_of_steps) {
piniels 0:f4e71504732d 81 this->step_number = 0;
piniels 0:f4e71504732d 82 }
piniels 0:f4e71504732d 83 }
piniels 0:f4e71504732d 84 else {
piniels 0:f4e71504732d 85 if (this->step_number == 0) {
piniels 0:f4e71504732d 86 this->step_number = this->number_of_steps;
piniels 0:f4e71504732d 87 }
piniels 0:f4e71504732d 88 this->step_number--;
piniels 0:f4e71504732d 89 }
piniels 0:f4e71504732d 90
piniels 0:f4e71504732d 91 // step the motor to step number 0, 1, 2, or 3:
piniels 0:f4e71504732d 92 stepMotor(this->step_number % 4);
piniels 0:f4e71504732d 93 }
piniels 0:f4e71504732d 94
piniels 0:f4e71504732d 95 // Run at a specified speed, no blocking
piniels 0:f4e71504732d 96 void ArduinoMotorShield::runStepperAtSpeed(bool startStop, int whatSpeed, int direction)
piniels 0:f4e71504732d 97 {
piniels 0:f4e71504732d 98 this->direction = direction;
piniels 0:f4e71504732d 99 if(whatSpeed != 0)
piniels 0:f4e71504732d 100 {
piniels 0:f4e71504732d 101 this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
piniels 0:f4e71504732d 102 }
piniels 0:f4e71504732d 103 else
piniels 0:f4e71504732d 104 {
piniels 0:f4e71504732d 105 this->step_delay = 60L * 1000L / this->number_of_steps / 1;
piniels 0:f4e71504732d 106 }
piniels 0:f4e71504732d 107
piniels 0:f4e71504732d 108 if(startStop)
piniels 0:f4e71504732d 109 {
piniels 1:5f2774bf44a5 110 this->_ENA_A = 1; //TODO: move. For enable the L298 in stepper mode
piniels 1:5f2774bf44a5 111 this->_ENA_B = 1; //TODO: move. For enable the L298 in stepper mode
piniels 0:f4e71504732d 112 runTick.attach_us(this, &ArduinoMotorShield::runMotor, step_delay*1000); // the address of the function to be attached
piniels 0:f4e71504732d 113 }
piniels 0:f4e71504732d 114 else
piniels 0:f4e71504732d 115 {
piniels 0:f4e71504732d 116 runTick.detach();
piniels 0:f4e71504732d 117 _BRAKEA = 0;
piniels 0:f4e71504732d 118 _BRAKEB = 0;
piniels 0:f4e71504732d 119 _DIRA = 0;
piniels 0:f4e71504732d 120 _DIRB = 0;
piniels 0:f4e71504732d 121 _ENA_A = 0;
piniels 0:f4e71504732d 122 _ENA_B = 0;
piniels 0:f4e71504732d 123 }
piniels 0:f4e71504732d 124 }
piniels 0:f4e71504732d 125
piniels 0:f4e71504732d 126 /*
piniels 0:f4e71504732d 127 * Moves the motor forward or backwards.
piniels 0:f4e71504732d 128 */
piniels 0:f4e71504732d 129 void ArduinoMotorShield::stepMotor(int thisStep)
piniels 0:f4e71504732d 130 {
piniels 0:f4e71504732d 131 switch (thisStep) {
piniels 0:f4e71504732d 132 case 0: // 1010
piniels 0:f4e71504732d 133 _BRAKEA = 0; // brake A
piniels 0:f4e71504732d 134 _BRAKEB = 0; // brake B
piniels 0:f4e71504732d 135 _DIRA = 1;
piniels 0:f4e71504732d 136 _DIRB = 1;
piniels 0:f4e71504732d 137 break;
piniels 0:f4e71504732d 138 case 1: // 0110
piniels 0:f4e71504732d 139 _BRAKEA = 0; // brake A
piniels 0:f4e71504732d 140 _BRAKEB = 0; // brake B
piniels 0:f4e71504732d 141 _DIRA = 0;
piniels 0:f4e71504732d 142 _DIRB = 1;
piniels 0:f4e71504732d 143 break;
piniels 0:f4e71504732d 144 case 2: //0101
piniels 0:f4e71504732d 145 _BRAKEA = 0; // brake A
piniels 0:f4e71504732d 146 _BRAKEB = 0; // brake B
piniels 0:f4e71504732d 147 _DIRA = 0;
piniels 0:f4e71504732d 148 _DIRB = 0;
piniels 0:f4e71504732d 149 break;
piniels 0:f4e71504732d 150 case 3: //1001
piniels 0:f4e71504732d 151 _BRAKEA = 0; // brake A
piniels 0:f4e71504732d 152 _BRAKEB = 0; // brake B
piniels 0:f4e71504732d 153 _DIRA = 1;
piniels 0:f4e71504732d 154 _DIRB = 0;
piniels 0:f4e71504732d 155 break;
piniels 0:f4e71504732d 156 }
piniels 0:f4e71504732d 157 }
piniels 0:f4e71504732d 158
piniels 0:f4e71504732d 159
piniels 0:f4e71504732d 160
piniels 0:f4e71504732d 161
piniels 0:f4e71504732d 162
piniels 0:f4e71504732d 163