A library for the Arduino motor shield board
Dependents: HIDTympDeviceWithPIDController
ArduinoMotorShield.cpp@0:f4e71504732d, 2013-11-05 (annotated)
- Committer:
- piniels
- Date:
- Tue Nov 05 20:28:36 2013 +0000
- Revision:
- 0:f4e71504732d
- Child:
- 1:5f2774bf44a5
first version
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:f4e71504732d | 110 | runTick.attach_us(this, &ArduinoMotorShield::runMotor, step_delay*1000); // the address of the function to be attached |
piniels | 0:f4e71504732d | 111 | } |
piniels | 0:f4e71504732d | 112 | else |
piniels | 0:f4e71504732d | 113 | { |
piniels | 0:f4e71504732d | 114 | runTick.detach(); |
piniels | 0:f4e71504732d | 115 | _BRAKEA = 0; |
piniels | 0:f4e71504732d | 116 | _BRAKEB = 0; |
piniels | 0:f4e71504732d | 117 | _DIRA = 0; |
piniels | 0:f4e71504732d | 118 | _DIRB = 0; |
piniels | 0:f4e71504732d | 119 | _ENA_A = 0; |
piniels | 0:f4e71504732d | 120 | _ENA_B = 0; |
piniels | 0:f4e71504732d | 121 | } |
piniels | 0:f4e71504732d | 122 | } |
piniels | 0:f4e71504732d | 123 | |
piniels | 0:f4e71504732d | 124 | /* |
piniels | 0:f4e71504732d | 125 | * Moves the motor forward or backwards. |
piniels | 0:f4e71504732d | 126 | */ |
piniels | 0:f4e71504732d | 127 | void ArduinoMotorShield::stepMotor(int thisStep) |
piniels | 0:f4e71504732d | 128 | { |
piniels | 0:f4e71504732d | 129 | switch (thisStep) { |
piniels | 0:f4e71504732d | 130 | case 0: // 1010 |
piniels | 0:f4e71504732d | 131 | _BRAKEA = 0; // brake A |
piniels | 0:f4e71504732d | 132 | _BRAKEB = 0; // brake B |
piniels | 0:f4e71504732d | 133 | _DIRA = 1; |
piniels | 0:f4e71504732d | 134 | _DIRB = 1; |
piniels | 0:f4e71504732d | 135 | break; |
piniels | 0:f4e71504732d | 136 | case 1: // 0110 |
piniels | 0:f4e71504732d | 137 | _BRAKEA = 0; // brake A |
piniels | 0:f4e71504732d | 138 | _BRAKEB = 0; // brake B |
piniels | 0:f4e71504732d | 139 | _DIRA = 0; |
piniels | 0:f4e71504732d | 140 | _DIRB = 1; |
piniels | 0:f4e71504732d | 141 | break; |
piniels | 0:f4e71504732d | 142 | case 2: //0101 |
piniels | 0:f4e71504732d | 143 | _BRAKEA = 0; // brake A |
piniels | 0:f4e71504732d | 144 | _BRAKEB = 0; // brake B |
piniels | 0:f4e71504732d | 145 | _DIRA = 0; |
piniels | 0:f4e71504732d | 146 | _DIRB = 0; |
piniels | 0:f4e71504732d | 147 | break; |
piniels | 0:f4e71504732d | 148 | case 3: //1001 |
piniels | 0:f4e71504732d | 149 | _BRAKEA = 0; // brake A |
piniels | 0:f4e71504732d | 150 | _BRAKEB = 0; // brake B |
piniels | 0:f4e71504732d | 151 | _DIRA = 1; |
piniels | 0:f4e71504732d | 152 | _DIRB = 0; |
piniels | 0:f4e71504732d | 153 | break; |
piniels | 0:f4e71504732d | 154 | } |
piniels | 0:f4e71504732d | 155 | } |
piniels | 0:f4e71504732d | 156 | |
piniels | 0:f4e71504732d | 157 | |
piniels | 0:f4e71504732d | 158 | |
piniels | 0:f4e71504732d | 159 | |
piniels | 0:f4e71504732d | 160 | |
piniels | 0:f4e71504732d | 161 |