My Version of CreaBotLib
Fork of CreaBotLib by
CreaBot.cpp@5:efe80c5db389, 2018-10-31 (annotated)
- Committer:
- sepp_nepp
- Date:
- Wed Oct 31 14:36:07 2018 +0000
- Revision:
- 5:efe80c5db389
- Parent:
- 4:531b1120d3ec
- Child:
- 6:4d8938b686a6
First publish of my CreaBotLib Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
garphil | 0:a7fb03c9ea9d | 1 | #include "CreaBot.h" |
garphil | 0:a7fb03c9ea9d | 2 | |
sepp_nepp | 5:efe80c5db389 | 3 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 4 | // Motor Command and Command-FIFO classes |
sepp_nepp | 5:efe80c5db389 | 5 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 6 | |
sepp_nepp | 5:efe80c5db389 | 7 | void MotCommand::assign(cmdbot_t cmd, float p1, float p2) |
sepp_nepp | 5:efe80c5db389 | 8 | { command = cmd; |
sepp_nepp | 5:efe80c5db389 | 9 | switch (command) { |
sepp_nepp | 5:efe80c5db389 | 10 | case FORWARD : ; |
sepp_nepp | 5:efe80c5db389 | 11 | case BACKWARD: cm=p1; angle=0; break; |
sepp_nepp | 5:efe80c5db389 | 12 | case ROTATE : angle = p1; break; |
sepp_nepp | 5:efe80c5db389 | 13 | case LEFT : |
sepp_nepp | 5:efe80c5db389 | 14 | case RIGHT : angle = p1; cm=p2; break; |
sepp_nepp | 5:efe80c5db389 | 15 | case IDLE : break; |
sepp_nepp | 5:efe80c5db389 | 16 | default : break; |
sepp_nepp | 5:efe80c5db389 | 17 | }; |
sepp_nepp | 5:efe80c5db389 | 18 | }; |
sepp_nepp | 5:efe80c5db389 | 19 | |
sepp_nepp | 5:efe80c5db389 | 20 | MotCommand *CommandFIFO::put() { |
sepp_nepp | 5:efe80c5db389 | 21 | if(count<DEPTH_FIFO) { |
sepp_nepp | 5:efe80c5db389 | 22 | int old_writeIdx = writeIdx; |
sepp_nepp | 5:efe80c5db389 | 23 | writeIdx++; |
sepp_nepp | 5:efe80c5db389 | 24 | if (writeIdx==DEPTH_FIFO) writeIdx=0; |
sepp_nepp | 5:efe80c5db389 | 25 | count++; |
sepp_nepp | 5:efe80c5db389 | 26 | return &cmd[old_writeIdx]; |
sepp_nepp | 5:efe80c5db389 | 27 | } |
sepp_nepp | 5:efe80c5db389 | 28 | else |
sepp_nepp | 5:efe80c5db389 | 29 | return NULL; |
sepp_nepp | 5:efe80c5db389 | 30 | }; // put() |
sepp_nepp | 5:efe80c5db389 | 31 | |
sepp_nepp | 5:efe80c5db389 | 32 | MotCommand *CommandFIFO::get() { |
sepp_nepp | 5:efe80c5db389 | 33 | if ( !isEmpty() ) { |
sepp_nepp | 5:efe80c5db389 | 34 | int old_readIdx = readIdx; |
sepp_nepp | 5:efe80c5db389 | 35 | readIdx++; |
sepp_nepp | 5:efe80c5db389 | 36 | if (readIdx==DEPTH_FIFO) readIdx=0; |
sepp_nepp | 5:efe80c5db389 | 37 | count--; |
sepp_nepp | 5:efe80c5db389 | 38 | return &cmd[old_readIdx]; |
sepp_nepp | 5:efe80c5db389 | 39 | } |
sepp_nepp | 5:efe80c5db389 | 40 | else |
sepp_nepp | 5:efe80c5db389 | 41 | return NULL; |
sepp_nepp | 5:efe80c5db389 | 42 | }; // get() |
sepp_nepp | 5:efe80c5db389 | 43 | |
sepp_nepp | 5:efe80c5db389 | 44 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 45 | // Creabot Class |
sepp_nepp | 5:efe80c5db389 | 46 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 47 | |
sepp_nepp | 5:efe80c5db389 | 48 | Creabot::Creabot(Motor *left, Motor *right, float diameter_wheel_cm, float distance_wheel_cm): |
sepp_nepp | 5:efe80c5db389 | 49 | motor_left(left), motor_right(right), diameter_wheel(diameter_wheel_cm), distance_wheel(distance_wheel_cm) |
garphil | 0:a7fb03c9ea9d | 50 | { |
garphil | 0:a7fb03c9ea9d | 51 | perimeter_wheel = PI*diameter_wheel; |
garphil | 0:a7fb03c9ea9d | 52 | perimeter_bot = PI*distance_wheel; |
garphil | 0:a7fb03c9ea9d | 53 | degree_wheel_per_cm=360.0f/perimeter_wheel; |
garphil | 0:a7fb03c9ea9d | 54 | degree_bot_per_cm=360.0f/perimeter_bot;; |
garphil | 3:891b6a138383 | 55 | ratio_wheel_bot=perimeter_bot/perimeter_wheel; |
garphil | 0:a7fb03c9ea9d | 56 | status=0; |
garphil | 0:a7fb03c9ea9d | 57 | |
sepp_nepp | 5:efe80c5db389 | 58 | motor_left->setMotorCallback(this, &Creabot::callBackLeft); |
sepp_nepp | 5:efe80c5db389 | 59 | motor_right->setMotorCallback(this, &Creabot::callBackRight); |
garphil | 0:a7fb03c9ea9d | 60 | extCallBack = NULL; |
garphil | 0:a7fb03c9ea9d | 61 | setSpeed(DEFAULT_SPEED); |
sepp_nepp | 5:efe80c5db389 | 62 | endMoveLeft = true; |
sepp_nepp | 5:efe80c5db389 | 63 | endMoveRight = true; |
garphil | 0:a7fb03c9ea9d | 64 | endMove=true; |
garphil | 0:a7fb03c9ea9d | 65 | executingFifo=false; |
garphil | 0:a7fb03c9ea9d | 66 | } |
garphil | 0:a7fb03c9ea9d | 67 | |
garphil | 0:a7fb03c9ea9d | 68 | void Creabot::moveForward(float cm) |
garphil | 0:a7fb03c9ea9d | 69 | { |
sepp_nepp | 5:efe80c5db389 | 70 | if (cm<0) moveBackward(cm); |
sepp_nepp | 5:efe80c5db389 | 71 | else { |
sepp_nepp | 5:efe80c5db389 | 72 | float angle = cm*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 73 | setSpeed(last_speed); |
sepp_nepp | 5:efe80c5db389 | 74 | moveMotorLeft(COUNTERCLOCKWISE, angle); |
sepp_nepp | 5:efe80c5db389 | 75 | moveMotorRight(CLOCKWISE, angle); |
sepp_nepp | 5:efe80c5db389 | 76 | } |
garphil | 0:a7fb03c9ea9d | 77 | } |
garphil | 0:a7fb03c9ea9d | 78 | |
garphil | 0:a7fb03c9ea9d | 79 | void Creabot::moveBackward(float cm) |
garphil | 0:a7fb03c9ea9d | 80 | { |
garphil | 0:a7fb03c9ea9d | 81 | if(cm<0) moveForward(cm); |
sepp_nepp | 5:efe80c5db389 | 82 | else { |
sepp_nepp | 5:efe80c5db389 | 83 | float angle = cm*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 84 | setSpeed(last_speed); |
sepp_nepp | 5:efe80c5db389 | 85 | moveMotorLeft(CLOCKWISE, angle); |
sepp_nepp | 5:efe80c5db389 | 86 | moveMotorRight(COUNTERCLOCKWISE, angle); |
sepp_nepp | 5:efe80c5db389 | 87 | } |
garphil | 0:a7fb03c9ea9d | 88 | } |
garphil | 0:a7fb03c9ea9d | 89 | void Creabot::rotate(float angleBot) |
garphil | 0:a7fb03c9ea9d | 90 | { |
sepp_nepp | 5:efe80c5db389 | 91 | float angleWheel = angleBot*ratio_wheel_bot; |
sepp_nepp | 5:efe80c5db389 | 92 | setSpeed(last_speed); |
garphil | 2:3d2d6d655d01 | 93 | if(angleBot<0) { |
garphil | 2:3d2d6d655d01 | 94 | moveMotorLeft(CLOCKWISE, -angleWheel); |
garphil | 2:3d2d6d655d01 | 95 | moveMotorRight(CLOCKWISE, -angleWheel); |
garphil | 0:a7fb03c9ea9d | 96 | } else { |
garphil | 2:3d2d6d655d01 | 97 | moveMotorLeft(COUNTERCLOCKWISE, angleWheel); |
garphil | 2:3d2d6d655d01 | 98 | moveMotorRight(COUNTERCLOCKWISE, angleWheel); |
garphil | 0:a7fb03c9ea9d | 99 | } |
garphil | 0:a7fb03c9ea9d | 100 | } |
garphil | 0:a7fb03c9ea9d | 101 | |
garphil | 0:a7fb03c9ea9d | 102 | void Creabot::stopMove() |
garphil | 0:a7fb03c9ea9d | 103 | { |
sepp_nepp | 5:efe80c5db389 | 104 | motor_left->MotorOFF(); |
sepp_nepp | 5:efe80c5db389 | 105 | motor_right->MotorOFF(); |
sepp_nepp | 5:efe80c5db389 | 106 | endMoveLeft = true; |
sepp_nepp | 5:efe80c5db389 | 107 | endMoveRight = true; |
garphil | 0:a7fb03c9ea9d | 108 | endMove = true; |
garphil | 0:a7fb03c9ea9d | 109 | flushFifo(); |
garphil | 0:a7fb03c9ea9d | 110 | // callBack(); // ? To be called or set as parameter? |
garphil | 0:a7fb03c9ea9d | 111 | } |
garphil | 0:a7fb03c9ea9d | 112 | |
garphil | 0:a7fb03c9ea9d | 113 | void Creabot::waitEndMove() |
garphil | 0:a7fb03c9ea9d | 114 | { |
garphil | 0:a7fb03c9ea9d | 115 | while(!endMove || executingFifo) { |
garphil | 0:a7fb03c9ea9d | 116 | wait(0.1); |
garphil | 0:a7fb03c9ea9d | 117 | } |
garphil | 1:974d020bb582 | 118 | |
garphil | 0:a7fb03c9ea9d | 119 | } |
garphil | 0:a7fb03c9ea9d | 120 | void Creabot::waitEndMove(uint32_t delay_us) |
garphil | 0:a7fb03c9ea9d | 121 | { |
garphil | 0:a7fb03c9ea9d | 122 | uint32_t v=0; |
garphil | 0:a7fb03c9ea9d | 123 | while(!endMove || executingFifo) { |
garphil | 0:a7fb03c9ea9d | 124 | wait(0.1); |
garphil | 0:a7fb03c9ea9d | 125 | v++; |
garphil | 0:a7fb03c9ea9d | 126 | if((v*10000)>delay_us) endMove = true; |
garphil | 0:a7fb03c9ea9d | 127 | } |
garphil | 0:a7fb03c9ea9d | 128 | } // watchdog |
garphil | 0:a7fb03c9ea9d | 129 | |
garphil | 0:a7fb03c9ea9d | 130 | void Creabot::setCallBack(void (*callback)(int status)) |
garphil | 0:a7fb03c9ea9d | 131 | { |
garphil | 0:a7fb03c9ea9d | 132 | extCallBack = callback; |
garphil | 0:a7fb03c9ea9d | 133 | } |
garphil | 0:a7fb03c9ea9d | 134 | |
garphil | 0:a7fb03c9ea9d | 135 | void Creabot::fifo(cmdbot_t moveType, float angle_or_cm) |
garphil | 0:a7fb03c9ea9d | 136 | { |
sepp_nepp | 5:efe80c5db389 | 137 | MotCommand *cmd = fifoBot.put(); |
sepp_nepp | 5:efe80c5db389 | 138 | if(cmd != NULL) { |
sepp_nepp | 5:efe80c5db389 | 139 | cmd->assign(moveType, angle_or_cm, 0); |
sepp_nepp | 5:efe80c5db389 | 140 | } |
garphil | 0:a7fb03c9ea9d | 141 | executeFifo(); |
garphil | 0:a7fb03c9ea9d | 142 | } |
garphil | 0:a7fb03c9ea9d | 143 | |
sepp_nepp | 5:efe80c5db389 | 144 | void Creabot::fifo(cmdbot_t moveType, float angle, float cm) |
sepp_nepp | 5:efe80c5db389 | 145 | { |
sepp_nepp | 5:efe80c5db389 | 146 | MotCommand *cmd = fifoBot.put(); |
sepp_nepp | 5:efe80c5db389 | 147 | if(cmd!=NULL) { |
sepp_nepp | 5:efe80c5db389 | 148 | cmd->assign(moveType, angle, cm); |
sepp_nepp | 5:efe80c5db389 | 149 | } |
sepp_nepp | 5:efe80c5db389 | 150 | executeFifo(); |
sepp_nepp | 5:efe80c5db389 | 151 | } |
garphil | 0:a7fb03c9ea9d | 152 | |
garphil | 0:a7fb03c9ea9d | 153 | void Creabot::moveAndWait(cmdbot_t moveType, float angle_or_cm) |
garphil | 0:a7fb03c9ea9d | 154 | { |
sepp_nepp | 5:efe80c5db389 | 155 | move(moveType,angle_or_cm); |
sepp_nepp | 5:efe80c5db389 | 156 | waitEndMove(); |
garphil | 0:a7fb03c9ea9d | 157 | } |
garphil | 0:a7fb03c9ea9d | 158 | |
sepp_nepp | 5:efe80c5db389 | 159 | void Creabot::moveAndWait(cmdbot_t moveType, float angle, float cm) |
garphil | 0:a7fb03c9ea9d | 160 | { |
sepp_nepp | 5:efe80c5db389 | 161 | move(moveType,angle,cm); |
sepp_nepp | 5:efe80c5db389 | 162 | waitEndMove(); |
garphil | 0:a7fb03c9ea9d | 163 | } |
garphil | 0:a7fb03c9ea9d | 164 | |
garphil | 0:a7fb03c9ea9d | 165 | void Creabot::flushFifo() |
garphil | 0:a7fb03c9ea9d | 166 | { |
garphil | 0:a7fb03c9ea9d | 167 | fifoBot.empty(); |
garphil | 0:a7fb03c9ea9d | 168 | if(executingFifo) botTicker.detach(); |
garphil | 0:a7fb03c9ea9d | 169 | executingFifo=false; |
garphil | 0:a7fb03c9ea9d | 170 | } |
sepp_nepp | 5:efe80c5db389 | 171 | |
garphil | 0:a7fb03c9ea9d | 172 | int Creabot::moveInFifo() |
garphil | 0:a7fb03c9ea9d | 173 | { |
sepp_nepp | 5:efe80c5db389 | 174 | return fifoBot.getCount(); |
sepp_nepp | 5:efe80c5db389 | 175 | } |
sepp_nepp | 5:efe80c5db389 | 176 | |
sepp_nepp | 5:efe80c5db389 | 177 | void Creabot::spirale(float b, float turns) { |
sepp_nepp | 5:efe80c5db389 | 178 | float r=0.0; |
sepp_nepp | 5:efe80c5db389 | 179 | float angle = 0.0f; |
sepp_nepp | 5:efe80c5db389 | 180 | while(angle < float( 360.0 * turns) ) { |
sepp_nepp | 5:efe80c5db389 | 181 | this->moveAndWait(RIGHT, 10, r); |
sepp_nepp | 5:efe80c5db389 | 182 | r=r+b; |
sepp_nepp | 5:efe80c5db389 | 183 | } |
sepp_nepp | 5:efe80c5db389 | 184 | } |
sepp_nepp | 5:efe80c5db389 | 185 | |
sepp_nepp | 5:efe80c5db389 | 186 | void Creabot::callBackLeft() |
sepp_nepp | 5:efe80c5db389 | 187 | { |
sepp_nepp | 5:efe80c5db389 | 188 | endMoveLeft=true; |
sepp_nepp | 5:efe80c5db389 | 189 | if(endMoveRight)callBack(); |
sepp_nepp | 5:efe80c5db389 | 190 | } |
sepp_nepp | 5:efe80c5db389 | 191 | |
sepp_nepp | 5:efe80c5db389 | 192 | void Creabot::callBackRight() |
sepp_nepp | 5:efe80c5db389 | 193 | { |
sepp_nepp | 5:efe80c5db389 | 194 | endMoveRight=true; |
sepp_nepp | 5:efe80c5db389 | 195 | if(endMoveLeft)callBack(); |
sepp_nepp | 5:efe80c5db389 | 196 | } |
sepp_nepp | 5:efe80c5db389 | 197 | |
sepp_nepp | 5:efe80c5db389 | 198 | void Creabot::callBack() |
sepp_nepp | 5:efe80c5db389 | 199 | { |
sepp_nepp | 5:efe80c5db389 | 200 | endMove=true; |
sepp_nepp | 5:efe80c5db389 | 201 | if(extCallBack!=NULL) extCallBack(status); |
garphil | 0:a7fb03c9ea9d | 202 | } |
sepp_nepp | 5:efe80c5db389 | 203 | |
sepp_nepp | 5:efe80c5db389 | 204 | |
sepp_nepp | 5:efe80c5db389 | 205 | //****************************************** |
sepp_nepp | 5:efe80c5db389 | 206 | // Executing the FIFO of Motor Commands |
sepp_nepp | 5:efe80c5db389 | 207 | //****************************************** |
sepp_nepp | 5:efe80c5db389 | 208 | |
sepp_nepp | 5:efe80c5db389 | 209 | // This is the own callback function of the ticker, that works throught the FIFO stack |
sepp_nepp | 5:efe80c5db389 | 210 | void Creabot::executeFifo() |
sepp_nepp | 5:efe80c5db389 | 211 | { if (fifoBot.isEmpty()) flushFifo(); |
sepp_nepp | 5:efe80c5db389 | 212 | else { |
sepp_nepp | 5:efe80c5db389 | 213 | if(endMove) { |
sepp_nepp | 5:efe80c5db389 | 214 | MotCommand *cmd = fifoBot.get(); |
sepp_nepp | 5:efe80c5db389 | 215 | executeCommand(cmd); |
sepp_nepp | 5:efe80c5db389 | 216 | if (!executingFifo) botTicker.attach_us( callback( this, &Creabot::executeFifo), 3150); |
sepp_nepp | 5:efe80c5db389 | 217 | executingFifo=true; |
sepp_nepp | 5:efe80c5db389 | 218 | } |
sepp_nepp | 5:efe80c5db389 | 219 | } |
sepp_nepp | 5:efe80c5db389 | 220 | } |
sepp_nepp | 5:efe80c5db389 | 221 | |
sepp_nepp | 5:efe80c5db389 | 222 | void Creabot::move(cmdbot_t moveType, float angle_or_cm) |
sepp_nepp | 5:efe80c5db389 | 223 | { |
sepp_nepp | 5:efe80c5db389 | 224 | current_cmd.assign(moveType, angle_or_cm, 0); |
sepp_nepp | 5:efe80c5db389 | 225 | executeCommand(¤t_cmd); |
sepp_nepp | 5:efe80c5db389 | 226 | } |
sepp_nepp | 5:efe80c5db389 | 227 | |
sepp_nepp | 5:efe80c5db389 | 228 | void Creabot::move(cmdbot_t moveType, float angle, float cm) |
sepp_nepp | 5:efe80c5db389 | 229 | { |
sepp_nepp | 5:efe80c5db389 | 230 | current_cmd.assign(moveType, angle, cm); |
sepp_nepp | 5:efe80c5db389 | 231 | executeCommand(¤t_cmd); |
sepp_nepp | 5:efe80c5db389 | 232 | } |
sepp_nepp | 5:efe80c5db389 | 233 | |
sepp_nepp | 5:efe80c5db389 | 234 | // Direct Command Execution, called by FIFO-Handler. |
sepp_nepp | 5:efe80c5db389 | 235 | void Creabot::executeCommand(MotCommand *cmd) { |
garphil | 0:a7fb03c9ea9d | 236 | switch (cmd->command) { |
garphil | 0:a7fb03c9ea9d | 237 | case FORWARD: |
garphil | 0:a7fb03c9ea9d | 238 | moveForward(cmd->cm); |
garphil | 0:a7fb03c9ea9d | 239 | break; |
garphil | 0:a7fb03c9ea9d | 240 | case BACKWARD: |
garphil | 0:a7fb03c9ea9d | 241 | moveBackward(cmd->cm); |
garphil | 0:a7fb03c9ea9d | 242 | break; |
garphil | 0:a7fb03c9ea9d | 243 | case ROTATE: |
garphil | 0:a7fb03c9ea9d | 244 | rotate(cmd->angle); |
garphil | 0:a7fb03c9ea9d | 245 | break; |
garphil | 0:a7fb03c9ea9d | 246 | case LEFT: |
garphil | 0:a7fb03c9ea9d | 247 | moveLeft(cmd->angle, cmd->cm); |
garphil | 0:a7fb03c9ea9d | 248 | break; |
garphil | 0:a7fb03c9ea9d | 249 | case RIGHT: |
garphil | 0:a7fb03c9ea9d | 250 | moveRight(cmd->angle, cmd->cm); |
garphil | 0:a7fb03c9ea9d | 251 | break; |
garphil | 0:a7fb03c9ea9d | 252 | case IDLE: |
garphil | 1:974d020bb582 | 253 | // wait(10); // Not to be done in an interrupt. could start a timer with a call back with 'end move'? Would be stopped by stopMove... |
garphil | 0:a7fb03c9ea9d | 254 | break; |
garphil | 0:a7fb03c9ea9d | 255 | default: |
garphil | 0:a7fb03c9ea9d | 256 | break; |
garphil | 0:a7fb03c9ea9d | 257 | }; |
sepp_nepp | 5:efe80c5db389 | 258 | }; // executeCommand |
sepp_nepp | 5:efe80c5db389 | 259 | |
garphil | 0:a7fb03c9ea9d | 260 | |
sepp_nepp | 5:efe80c5db389 | 261 | //*********************************************** |
sepp_nepp | 5:efe80c5db389 | 262 | // Execute high level motor functions directly, no FIFO |
sepp_nepp | 5:efe80c5db389 | 263 | //*********************************************** |
garphil | 0:a7fb03c9ea9d | 264 | |
sepp_nepp | 5:efe80c5db389 | 265 | void Creabot::moveRight(float angle) |
sepp_nepp | 5:efe80c5db389 | 266 | { |
sepp_nepp | 5:efe80c5db389 | 267 | moveRight(angle,distance_wheel); |
garphil | 0:a7fb03c9ea9d | 268 | } |
garphil | 0:a7fb03c9ea9d | 269 | |
sepp_nepp | 5:efe80c5db389 | 270 | void Creabot::moveRight(float angle, float center_cm) |
sepp_nepp | 5:efe80c5db389 | 271 | { |
sepp_nepp | 5:efe80c5db389 | 272 | if(center_cm<0) center_cm=0; /* TO remove? */ |
sepp_nepp | 5:efe80c5db389 | 273 | float perimeter_outer = 2.0f*angle*(center_cm+distance_wheel)*PI/360.0f; |
sepp_nepp | 5:efe80c5db389 | 274 | float perimeter_inner = 2.0f*angle*(center_cm)*PI/360.0f; |
sepp_nepp | 5:efe80c5db389 | 275 | float angleLeft = perimeter_outer*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 276 | float angleRight = perimeter_inner*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 277 | float ratio = angleRight/angleLeft; |
sepp_nepp | 5:efe80c5db389 | 278 | float speedRight = last_speed * ratio; |
sepp_nepp | 5:efe80c5db389 | 279 | // pc_uart.printf("Set Perimeter angle =%f center_cm=%f outer = %f inner = %f angle_left %f angle right %f ratio %f cs %f\n\r",angle, center_cm, perimeter_outer,perimeter_inner,angleLeft,angleRight,ratio, last_speed); |
sepp_nepp | 5:efe80c5db389 | 280 | setSpeedMot(motor_left,last_speed); |
sepp_nepp | 5:efe80c5db389 | 281 | setSpeedMot(motor_right,speedRight); |
sepp_nepp | 5:efe80c5db389 | 282 | moveMotorLeft(COUNTERCLOCKWISE, angleLeft); |
sepp_nepp | 5:efe80c5db389 | 283 | moveMotorRight(CLOCKWISE, angleRight); |
sepp_nepp | 5:efe80c5db389 | 284 | } |
sepp_nepp | 5:efe80c5db389 | 285 | |
sepp_nepp | 5:efe80c5db389 | 286 | void Creabot::moveLeft(float angle) |
sepp_nepp | 5:efe80c5db389 | 287 | { |
sepp_nepp | 5:efe80c5db389 | 288 | moveLeft(angle,0); |
garphil | 4:531b1120d3ec | 289 | } |
garphil | 4:531b1120d3ec | 290 | |
sepp_nepp | 5:efe80c5db389 | 291 | void Creabot::moveLeft(float angle, float center_cm) |
garphil | 0:a7fb03c9ea9d | 292 | { |
sepp_nepp | 5:efe80c5db389 | 293 | if(center_cm<0) center_cm=0; /* TO remove? */ |
sepp_nepp | 5:efe80c5db389 | 294 | float perimeter_outer = 2.0f*angle*(center_cm+distance_wheel)*PI/360.0f; |
sepp_nepp | 5:efe80c5db389 | 295 | float perimeter_inner = 2.0f*angle*(center_cm)*PI/360.0f; |
sepp_nepp | 5:efe80c5db389 | 296 | float angleLeft = perimeter_inner*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 297 | float angleRight = perimeter_outer*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 298 | float ratio = angleLeft/angleRight; |
sepp_nepp | 5:efe80c5db389 | 299 | float speedRLeft = last_speed * ratio; |
sepp_nepp | 5:efe80c5db389 | 300 | setSpeedMot(motor_left,speedRLeft); |
sepp_nepp | 5:efe80c5db389 | 301 | setSpeedMot(motor_right,last_speed); |
sepp_nepp | 5:efe80c5db389 | 302 | moveMotorLeft(COUNTERCLOCKWISE, angleLeft); |
sepp_nepp | 5:efe80c5db389 | 303 | moveMotorRight(CLOCKWISE, angleRight); |
garphil | 0:a7fb03c9ea9d | 304 | } |
garphil | 0:a7fb03c9ea9d | 305 | |
sepp_nepp | 5:efe80c5db389 | 306 | //****************************************************************************** |
sepp_nepp | 5:efe80c5db389 | 307 | // low level motor functions, filters for angle>0, remembers that a motor moves |
sepp_nepp | 5:efe80c5db389 | 308 | //****************************************************************************** |
garphil | 0:a7fb03c9ea9d | 309 | |
sepp_nepp | 5:efe80c5db389 | 310 | void Creabot::moveMotorLeft(motorDir dir, float angle) |
garphil | 0:a7fb03c9ea9d | 311 | { |
garphil | 0:a7fb03c9ea9d | 312 | if(angle>0) { |
garphil | 0:a7fb03c9ea9d | 313 | motor_left->RunDegrees(dir, angle); |
sepp_nepp | 5:efe80c5db389 | 314 | endMove = endMoveLeft = false; |
garphil | 0:a7fb03c9ea9d | 315 | } |
garphil | 0:a7fb03c9ea9d | 316 | } |
sepp_nepp | 5:efe80c5db389 | 317 | |
sepp_nepp | 5:efe80c5db389 | 318 | void Creabot::moveMotorRight(motorDir dir, float angle) |
sepp_nepp | 5:efe80c5db389 | 319 | { if(angle>0) { |
garphil | 0:a7fb03c9ea9d | 320 | motor_right->RunDegrees(dir, angle); |
sepp_nepp | 5:efe80c5db389 | 321 | endMove = endMoveRight = false;} |
sepp_nepp | 5:efe80c5db389 | 322 | } |
sepp_nepp | 5:efe80c5db389 | 323 | |
sepp_nepp | 5:efe80c5db389 | 324 | int Creabot::getStatus() |
sepp_nepp | 5:efe80c5db389 | 325 | { if(endMove ) return 0; // No Movement |
sepp_nepp | 5:efe80c5db389 | 326 | if(endMoveRight) return 1; // Returns 1, assuming that only Left Motor is still running |
sepp_nepp | 5:efe80c5db389 | 327 | if(endMoveLeft ) return 3; // Returns 2, Right Motor is running aloone |
sepp_nepp | 5:efe80c5db389 | 328 | return 2; // Both Motors are still running!!! |
sepp_nepp | 5:efe80c5db389 | 329 | } |
sepp_nepp | 5:efe80c5db389 | 330 | |
sepp_nepp | 5:efe80c5db389 | 331 | void Creabot::setSpeed(float cm_per_second) |
sepp_nepp | 5:efe80c5db389 | 332 | { |
sepp_nepp | 5:efe80c5db389 | 333 | setSpeedMot(motor_left,cm_per_second); |
sepp_nepp | 5:efe80c5db389 | 334 | setSpeedMot(motor_right,cm_per_second); |
sepp_nepp | 5:efe80c5db389 | 335 | last_speed = cm_per_second; |
sepp_nepp | 5:efe80c5db389 | 336 | } |
sepp_nepp | 5:efe80c5db389 | 337 | |
sepp_nepp | 5:efe80c5db389 | 338 | void Creabot::setSpeedMot(Motor *motor, float cm_per_second) |
sepp_nepp | 5:efe80c5db389 | 339 | { if (cm_per_second <0.0001f) |
sepp_nepp | 5:efe80c5db389 | 340 | motor->setStepTime_us( 1000000 ); |
sepp_nepp | 5:efe80c5db389 | 341 | else { uint32_t tick = motor->getStepsFullTurn(); |
sepp_nepp | 5:efe80c5db389 | 342 | motor->setStepTime_us( perimeter_wheel * 1000000 / cm_per_second / tick ) ; |
sepp_nepp | 5:efe80c5db389 | 343 | } |
sepp_nepp | 5:efe80c5db389 | 344 | } |
sepp_nepp | 5:efe80c5db389 | 345 |