My Version of CreaBotLib
Fork of CreaBotLib by
CreaBot.cpp@6:4d8938b686a6, 2018-11-28 (annotated)
- Committer:
- sepp_nepp
- Date:
- Wed Nov 28 09:46:41 2018 +0000
- Revision:
- 6:4d8938b686a6
- Parent:
- 5:efe80c5db389
- Child:
- 7:3a793ddc3490
Update with some changes to documentation. ; Not yet tried on actual robot. ; Some bugs in my doxygen code means documentation generation fails.
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 | 6:4d8938b686a6 | 4 | // BotCommand Structure Helper |
sepp_nepp | 5:efe80c5db389 | 5 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 6 | |
sepp_nepp | 6:4d8938b686a6 | 7 | // Struct Helper; set structure fields to values */ |
sepp_nepp | 6:4d8938b686a6 | 8 | void BotCommand::set(BotCmdVerb Acommand, float Adist_cm, float Aangle_deg) |
sepp_nepp | 6:4d8938b686a6 | 9 | { command = Acommand; |
sepp_nepp | 6:4d8938b686a6 | 10 | dist_cm = Adist_cm; |
sepp_nepp | 6:4d8938b686a6 | 11 | angle_deg= Aangle_deg; |
sepp_nepp | 6:4d8938b686a6 | 12 | }; |
sepp_nepp | 6:4d8938b686a6 | 13 | |
sepp_nepp | 6:4d8938b686a6 | 14 | // Struct Helper; set structure fields to values */ |
sepp_nepp | 6:4d8938b686a6 | 15 | void BotCommand::set(BotCmdVerb Acommand, float Adist_cm) |
sepp_nepp | 6:4d8938b686a6 | 16 | { command = Acommand; |
sepp_nepp | 6:4d8938b686a6 | 17 | dist_cm = Adist_cm; |
sepp_nepp | 6:4d8938b686a6 | 18 | angle_deg= 0; |
sepp_nepp | 5:efe80c5db389 | 19 | }; |
sepp_nepp | 5:efe80c5db389 | 20 | |
sepp_nepp | 6:4d8938b686a6 | 21 | // ***************************************************************** |
sepp_nepp | 6:4d8938b686a6 | 22 | // CommandFIFO Class |
sepp_nepp | 6:4d8938b686a6 | 23 | // ***************************************************************** |
sepp_nepp | 6:4d8938b686a6 | 24 | |
sepp_nepp | 6:4d8938b686a6 | 25 | // Class Creator: initializes an empties FIFO |
sepp_nepp | 6:4d8938b686a6 | 26 | CommandFIFO::CommandFIFO(); |
sepp_nepp | 6:4d8938b686a6 | 27 | { readIdx = writeIdx = count = 0; |
sepp_nepp | 6:4d8938b686a6 | 28 | cmd_idle.set(IDLE, 0, 0); |
sepp_nepp | 6:4d8938b686a6 | 29 | } |
sepp_nepp | 6:4d8938b686a6 | 30 | |
sepp_nepp | 6:4d8938b686a6 | 31 | // Reserve a new element at the head of the FIFO |
sepp_nepp | 6:4d8938b686a6 | 32 | BotCommand *CommandFIFO::put() |
sepp_nepp | 6:4d8938b686a6 | 33 | { |
sepp_nepp | 6:4d8938b686a6 | 34 | if( !isFull() ) { |
sepp_nepp | 5:efe80c5db389 | 35 | int old_writeIdx = writeIdx; |
sepp_nepp | 5:efe80c5db389 | 36 | writeIdx++; |
sepp_nepp | 6:4d8938b686a6 | 37 | if (writeIdx==DEPTH_FIFO) writeIdx=0; |
sepp_nepp | 5:efe80c5db389 | 38 | count++; |
sepp_nepp | 5:efe80c5db389 | 39 | return &cmd[old_writeIdx]; |
sepp_nepp | 6:4d8938b686a6 | 40 | } else |
sepp_nepp | 5:efe80c5db389 | 41 | return NULL; |
sepp_nepp | 5:efe80c5db389 | 42 | }; // put() |
sepp_nepp | 5:efe80c5db389 | 43 | |
sepp_nepp | 6:4d8938b686a6 | 44 | // Get and remove the oldest element at the tail of the FIFO |
sepp_nepp | 6:4d8938b686a6 | 45 | BotCommand *CommandFIFO::get() |
sepp_nepp | 6:4d8938b686a6 | 46 | { |
sepp_nepp | 5:efe80c5db389 | 47 | if ( !isEmpty() ) { |
sepp_nepp | 6:4d8938b686a6 | 48 | int old_readIdx = readIdx; |
sepp_nepp | 5:efe80c5db389 | 49 | readIdx++; |
sepp_nepp | 6:4d8938b686a6 | 50 | if (readIdx==DEPTH_FIFO) readIdx=0; |
sepp_nepp | 6:4d8938b686a6 | 51 | count--; |
sepp_nepp | 5:efe80c5db389 | 52 | return &cmd[old_readIdx]; |
sepp_nepp | 6:4d8938b686a6 | 53 | } else |
sepp_nepp | 5:efe80c5db389 | 54 | return NULL; |
sepp_nepp | 5:efe80c5db389 | 55 | }; // get() |
sepp_nepp | 5:efe80c5db389 | 56 | |
sepp_nepp | 5:efe80c5db389 | 57 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 58 | // Creabot Class |
sepp_nepp | 5:efe80c5db389 | 59 | // ***************************************************************** |
sepp_nepp | 5:efe80c5db389 | 60 | |
sepp_nepp | 5:efe80c5db389 | 61 | Creabot::Creabot(Motor *left, Motor *right, float diameter_wheel_cm, float distance_wheel_cm): |
sepp_nepp | 5:efe80c5db389 | 62 | motor_left(left), motor_right(right), diameter_wheel(diameter_wheel_cm), distance_wheel(distance_wheel_cm) |
garphil | 0:a7fb03c9ea9d | 63 | { |
sepp_nepp | 6:4d8938b686a6 | 64 | // Initialize dimensions |
garphil | 0:a7fb03c9ea9d | 65 | perimeter_wheel = PI*diameter_wheel; |
garphil | 0:a7fb03c9ea9d | 66 | perimeter_bot = PI*distance_wheel; |
garphil | 0:a7fb03c9ea9d | 67 | degree_wheel_per_cm=360.0f/perimeter_wheel; |
garphil | 0:a7fb03c9ea9d | 68 | degree_bot_per_cm=360.0f/perimeter_bot;; |
garphil | 3:891b6a138383 | 69 | ratio_wheel_bot=perimeter_bot/perimeter_wheel; |
sepp_nepp | 6:4d8938b686a6 | 70 | setSpeed(DEFAULT_SPEED); |
garphil | 0:a7fb03c9ea9d | 71 | |
sepp_nepp | 6:4d8938b686a6 | 72 | // Attach the Crabot functions as callbacks to the motors |
sepp_nepp | 6:4d8938b686a6 | 73 | motor_left->callbackSet(this, &Creabot::cbLeftMotStopped); |
sepp_nepp | 6:4d8938b686a6 | 74 | motor_right->callbackSet(this, &Creabot::cbRightMotStopped); |
sepp_nepp | 6:4d8938b686a6 | 75 | |
sepp_nepp | 6:4d8938b686a6 | 76 | // Initialize own callback as empty |
garphil | 0:a7fb03c9ea9d | 77 | extCallBack = NULL; |
sepp_nepp | 6:4d8938b686a6 | 78 | |
sepp_nepp | 6:4d8938b686a6 | 79 | // Initialize the own status fields |
sepp_nepp | 6:4d8938b686a6 | 80 | endMoveLeft = true; |
sepp_nepp | 5:efe80c5db389 | 81 | endMoveRight = true; |
sepp_nepp | 6:4d8938b686a6 | 82 | endMove = true; |
sepp_nepp | 6:4d8938b686a6 | 83 | executingFifo= false; |
garphil | 0:a7fb03c9ea9d | 84 | } |
garphil | 0:a7fb03c9ea9d | 85 | |
sepp_nepp | 6:4d8938b686a6 | 86 | void Creabot::moveForward(float dist_cm) |
garphil | 0:a7fb03c9ea9d | 87 | { |
sepp_nepp | 6:4d8938b686a6 | 88 | if (dist_cm<0) moveBackward(dist_cm); |
sepp_nepp | 5:efe80c5db389 | 89 | else { |
sepp_nepp | 6:4d8938b686a6 | 90 | float angle_deg = dist_cm*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 91 | setSpeed(last_speed); |
sepp_nepp | 6:4d8938b686a6 | 92 | moveMotorLeft(COUNTERCLOCKWISE, angle_deg); |
sepp_nepp | 6:4d8938b686a6 | 93 | moveMotorRight(CLOCKWISE, angle_deg); |
sepp_nepp | 5:efe80c5db389 | 94 | } |
garphil | 0:a7fb03c9ea9d | 95 | } |
garphil | 0:a7fb03c9ea9d | 96 | |
sepp_nepp | 6:4d8938b686a6 | 97 | void Creabot::moveBackward(float dist_cm) |
garphil | 0:a7fb03c9ea9d | 98 | { |
sepp_nepp | 6:4d8938b686a6 | 99 | if(dist_cm<0) moveForward(dist_cm); |
sepp_nepp | 5:efe80c5db389 | 100 | else { |
sepp_nepp | 6:4d8938b686a6 | 101 | float angle_deg = dist_cm*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 102 | setSpeed(last_speed); |
sepp_nepp | 6:4d8938b686a6 | 103 | moveMotorLeft(CLOCKWISE, angle_deg); |
sepp_nepp | 6:4d8938b686a6 | 104 | moveMotorRight(COUNTERCLOCKWISE, angle_deg); |
sepp_nepp | 5:efe80c5db389 | 105 | } |
garphil | 0:a7fb03c9ea9d | 106 | } |
garphil | 0:a7fb03c9ea9d | 107 | void Creabot::rotate(float angleBot) |
garphil | 0:a7fb03c9ea9d | 108 | { |
sepp_nepp | 5:efe80c5db389 | 109 | float angleWheel = angleBot*ratio_wheel_bot; |
sepp_nepp | 5:efe80c5db389 | 110 | setSpeed(last_speed); |
garphil | 2:3d2d6d655d01 | 111 | if(angleBot<0) { |
garphil | 2:3d2d6d655d01 | 112 | moveMotorLeft(CLOCKWISE, -angleWheel); |
garphil | 2:3d2d6d655d01 | 113 | moveMotorRight(CLOCKWISE, -angleWheel); |
garphil | 0:a7fb03c9ea9d | 114 | } else { |
garphil | 2:3d2d6d655d01 | 115 | moveMotorLeft(COUNTERCLOCKWISE, angleWheel); |
garphil | 2:3d2d6d655d01 | 116 | moveMotorRight(COUNTERCLOCKWISE, angleWheel); |
garphil | 0:a7fb03c9ea9d | 117 | } |
garphil | 0:a7fb03c9ea9d | 118 | } |
garphil | 0:a7fb03c9ea9d | 119 | |
garphil | 0:a7fb03c9ea9d | 120 | |
garphil | 0:a7fb03c9ea9d | 121 | void Creabot::waitEndMove() |
garphil | 0:a7fb03c9ea9d | 122 | { |
garphil | 0:a7fb03c9ea9d | 123 | while(!endMove || executingFifo) { |
garphil | 0:a7fb03c9ea9d | 124 | wait(0.1); |
garphil | 0:a7fb03c9ea9d | 125 | } |
garphil | 1:974d020bb582 | 126 | |
garphil | 0:a7fb03c9ea9d | 127 | } |
garphil | 0:a7fb03c9ea9d | 128 | void Creabot::waitEndMove(uint32_t delay_us) |
garphil | 0:a7fb03c9ea9d | 129 | { |
garphil | 0:a7fb03c9ea9d | 130 | uint32_t v=0; |
garphil | 0:a7fb03c9ea9d | 131 | while(!endMove || executingFifo) { |
garphil | 0:a7fb03c9ea9d | 132 | wait(0.1); |
garphil | 0:a7fb03c9ea9d | 133 | v++; |
garphil | 0:a7fb03c9ea9d | 134 | if((v*10000)>delay_us) endMove = true; |
garphil | 0:a7fb03c9ea9d | 135 | } |
garphil | 0:a7fb03c9ea9d | 136 | } // watchdog |
garphil | 0:a7fb03c9ea9d | 137 | |
sepp_nepp | 6:4d8938b686a6 | 138 | void Creabot::setCallBack(void (*Acallback)(int status)) |
garphil | 0:a7fb03c9ea9d | 139 | { |
sepp_nepp | 6:4d8938b686a6 | 140 | extCallBack = Acallback; |
garphil | 0:a7fb03c9ea9d | 141 | } |
garphil | 0:a7fb03c9ea9d | 142 | |
sepp_nepp | 6:4d8938b686a6 | 143 | void Creabot::fifo(BotCmdVerb moveType, float angle_or_cm) |
garphil | 0:a7fb03c9ea9d | 144 | { |
sepp_nepp | 6:4d8938b686a6 | 145 | BotCommand *cmd = fifoBot.put(); |
sepp_nepp | 5:efe80c5db389 | 146 | if(cmd != NULL) { |
sepp_nepp | 6:4d8938b686a6 | 147 | cmd->set(moveType, angle_or_cm, 0); |
sepp_nepp | 5:efe80c5db389 | 148 | } |
garphil | 0:a7fb03c9ea9d | 149 | executeFifo(); |
garphil | 0:a7fb03c9ea9d | 150 | } |
garphil | 0:a7fb03c9ea9d | 151 | |
sepp_nepp | 6:4d8938b686a6 | 152 | void Creabot::fifo(BotCmdVerb moveType, float angle_deg, float dist_cm) |
sepp_nepp | 5:efe80c5db389 | 153 | { |
sepp_nepp | 6:4d8938b686a6 | 154 | BotCommand *cmd = fifoBot.put(); |
sepp_nepp | 5:efe80c5db389 | 155 | if(cmd!=NULL) { |
sepp_nepp | 6:4d8938b686a6 | 156 | cmd->set(moveType, angle_deg, dist_cm); |
sepp_nepp | 5:efe80c5db389 | 157 | } |
sepp_nepp | 5:efe80c5db389 | 158 | executeFifo(); |
sepp_nepp | 5:efe80c5db389 | 159 | } |
garphil | 0:a7fb03c9ea9d | 160 | |
sepp_nepp | 6:4d8938b686a6 | 161 | void Creabot::moveAndWait(BotCmdVerb moveType, float angle_or_cm) |
garphil | 0:a7fb03c9ea9d | 162 | { |
sepp_nepp | 5:efe80c5db389 | 163 | move(moveType,angle_or_cm); |
sepp_nepp | 5:efe80c5db389 | 164 | waitEndMove(); |
garphil | 0:a7fb03c9ea9d | 165 | } |
garphil | 0:a7fb03c9ea9d | 166 | |
sepp_nepp | 6:4d8938b686a6 | 167 | void Creabot::moveAndWait(BotCmdVerb moveType, float angle_deg, float dist_cm) |
garphil | 0:a7fb03c9ea9d | 168 | { |
sepp_nepp | 6:4d8938b686a6 | 169 | move(moveType,angle_deg,dist_cm); |
sepp_nepp | 5:efe80c5db389 | 170 | waitEndMove(); |
garphil | 0:a7fb03c9ea9d | 171 | } |
garphil | 0:a7fb03c9ea9d | 172 | |
garphil | 0:a7fb03c9ea9d | 173 | void Creabot::flushFifo() |
garphil | 0:a7fb03c9ea9d | 174 | { |
garphil | 0:a7fb03c9ea9d | 175 | fifoBot.empty(); |
garphil | 0:a7fb03c9ea9d | 176 | if(executingFifo) botTicker.detach(); |
garphil | 0:a7fb03c9ea9d | 177 | executingFifo=false; |
garphil | 0:a7fb03c9ea9d | 178 | } |
sepp_nepp | 5:efe80c5db389 | 179 | |
garphil | 0:a7fb03c9ea9d | 180 | int Creabot::moveInFifo() |
garphil | 0:a7fb03c9ea9d | 181 | { |
sepp_nepp | 5:efe80c5db389 | 182 | return fifoBot.getCount(); |
sepp_nepp | 5:efe80c5db389 | 183 | } |
sepp_nepp | 5:efe80c5db389 | 184 | |
sepp_nepp | 5:efe80c5db389 | 185 | void Creabot::spirale(float b, float turns) { |
sepp_nepp | 6:4d8938b686a6 | 186 | float r=0.0f; |
sepp_nepp | 6:4d8938b686a6 | 187 | float angle_deg = 0.0f; |
sepp_nepp | 6:4d8938b686a6 | 188 | while(angle_deg < float( 360.0f * turns) ) { |
sepp_nepp | 5:efe80c5db389 | 189 | this->moveAndWait(RIGHT, 10, r); |
sepp_nepp | 5:efe80c5db389 | 190 | r=r+b; |
sepp_nepp | 5:efe80c5db389 | 191 | } |
sepp_nepp | 5:efe80c5db389 | 192 | } |
sepp_nepp | 5:efe80c5db389 | 193 | |
sepp_nepp | 5:efe80c5db389 | 194 | //****************************************** |
sepp_nepp | 6:4d8938b686a6 | 195 | // Using the FIFO to queue up Motor Commands |
sepp_nepp | 5:efe80c5db389 | 196 | //****************************************** |
sepp_nepp | 5:efe80c5db389 | 197 | |
sepp_nepp | 5:efe80c5db389 | 198 | // This is the own callback function of the ticker, that works throught the FIFO stack |
sepp_nepp | 5:efe80c5db389 | 199 | void Creabot::executeFifo() |
sepp_nepp | 5:efe80c5db389 | 200 | { if (fifoBot.isEmpty()) flushFifo(); |
sepp_nepp | 5:efe80c5db389 | 201 | else { |
sepp_nepp | 5:efe80c5db389 | 202 | if(endMove) { |
sepp_nepp | 6:4d8938b686a6 | 203 | BotCommand *cmd = fifoBot.get(); |
sepp_nepp | 5:efe80c5db389 | 204 | executeCommand(cmd); |
sepp_nepp | 5:efe80c5db389 | 205 | if (!executingFifo) botTicker.attach_us( callback( this, &Creabot::executeFifo), 3150); |
sepp_nepp | 5:efe80c5db389 | 206 | executingFifo=true; |
sepp_nepp | 5:efe80c5db389 | 207 | } |
sepp_nepp | 5:efe80c5db389 | 208 | } |
sepp_nepp | 5:efe80c5db389 | 209 | } |
sepp_nepp | 5:efe80c5db389 | 210 | |
sepp_nepp | 6:4d8938b686a6 | 211 | void Creabot::move(BotCmdVerb moveType, float angle_or_cm) |
sepp_nepp | 5:efe80c5db389 | 212 | { |
sepp_nepp | 6:4d8938b686a6 | 213 | current_cmd.set(moveType, angle_or_cm, 0); |
sepp_nepp | 5:efe80c5db389 | 214 | executeCommand(¤t_cmd); |
sepp_nepp | 5:efe80c5db389 | 215 | } |
sepp_nepp | 5:efe80c5db389 | 216 | |
sepp_nepp | 6:4d8938b686a6 | 217 | void Creabot::move(BotCmdVerb moveType, float angle_deg, float dist_cm) |
sepp_nepp | 5:efe80c5db389 | 218 | { |
sepp_nepp | 6:4d8938b686a6 | 219 | current_cmd.set(moveType, angle_deg, dist_cm); |
sepp_nepp | 5:efe80c5db389 | 220 | executeCommand(¤t_cmd); |
sepp_nepp | 5:efe80c5db389 | 221 | } |
sepp_nepp | 5:efe80c5db389 | 222 | |
sepp_nepp | 5:efe80c5db389 | 223 | // Direct Command Execution, called by FIFO-Handler. |
sepp_nepp | 6:4d8938b686a6 | 224 | void Creabot::executeCommand(BotCommand *cmd) { |
garphil | 0:a7fb03c9ea9d | 225 | switch (cmd->command) { |
garphil | 0:a7fb03c9ea9d | 226 | case FORWARD: |
sepp_nepp | 6:4d8938b686a6 | 227 | moveForward(cmd->dist_cm); |
garphil | 0:a7fb03c9ea9d | 228 | break; |
garphil | 0:a7fb03c9ea9d | 229 | case BACKWARD: |
sepp_nepp | 6:4d8938b686a6 | 230 | moveBackward(cmd->dist_cm); |
garphil | 0:a7fb03c9ea9d | 231 | break; |
garphil | 0:a7fb03c9ea9d | 232 | case ROTATE: |
sepp_nepp | 6:4d8938b686a6 | 233 | rotate(cmd->angle_deg); |
garphil | 0:a7fb03c9ea9d | 234 | break; |
garphil | 0:a7fb03c9ea9d | 235 | case LEFT: |
sepp_nepp | 6:4d8938b686a6 | 236 | moveLeft(cmd->angle_deg, cmd->dist_cm); |
garphil | 0:a7fb03c9ea9d | 237 | break; |
garphil | 0:a7fb03c9ea9d | 238 | case RIGHT: |
sepp_nepp | 6:4d8938b686a6 | 239 | moveRight(cmd->angle_deg, cmd->dist_cm); |
garphil | 0:a7fb03c9ea9d | 240 | break; |
garphil | 0:a7fb03c9ea9d | 241 | case IDLE: |
garphil | 1:974d020bb582 | 242 | // 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 | 243 | break; |
garphil | 0:a7fb03c9ea9d | 244 | default: |
garphil | 0:a7fb03c9ea9d | 245 | break; |
garphil | 0:a7fb03c9ea9d | 246 | }; |
sepp_nepp | 5:efe80c5db389 | 247 | }; // executeCommand |
sepp_nepp | 5:efe80c5db389 | 248 | |
sepp_nepp | 6:4d8938b686a6 | 249 | void Creabot::stopAll() |
sepp_nepp | 6:4d8938b686a6 | 250 | { |
sepp_nepp | 6:4d8938b686a6 | 251 | flushFifo(); |
sepp_nepp | 6:4d8938b686a6 | 252 | stopMotors(); |
sepp_nepp | 6:4d8938b686a6 | 253 | } |
sepp_nepp | 6:4d8938b686a6 | 254 | |
garphil | 0:a7fb03c9ea9d | 255 | |
sepp_nepp | 5:efe80c5db389 | 256 | //*********************************************** |
sepp_nepp | 5:efe80c5db389 | 257 | // Execute high level motor functions directly, no FIFO |
sepp_nepp | 5:efe80c5db389 | 258 | //*********************************************** |
garphil | 0:a7fb03c9ea9d | 259 | |
sepp_nepp | 6:4d8938b686a6 | 260 | void Creabot::moveRight(float angle_deg) |
sepp_nepp | 5:efe80c5db389 | 261 | { |
sepp_nepp | 6:4d8938b686a6 | 262 | moveRight(angle_deg,distance_wheel); |
garphil | 0:a7fb03c9ea9d | 263 | } |
garphil | 0:a7fb03c9ea9d | 264 | |
sepp_nepp | 6:4d8938b686a6 | 265 | void Creabot::moveRight(float angle_deg, float center_cm) |
sepp_nepp | 5:efe80c5db389 | 266 | { |
sepp_nepp | 5:efe80c5db389 | 267 | if(center_cm<0) center_cm=0; /* TO remove? */ |
sepp_nepp | 6:4d8938b686a6 | 268 | float perimeter_outer = 2.0f*angle_deg*(center_cm+distance_wheel)*PI/360.0f; |
sepp_nepp | 6:4d8938b686a6 | 269 | float perimeter_inner = 2.0f*angle_deg*(center_cm)*PI/360.0f; |
sepp_nepp | 6:4d8938b686a6 | 270 | float angleLeft = perimeter_outer*degree_wheel_per_cm; |
sepp_nepp | 6:4d8938b686a6 | 271 | float angleRight = perimeter_inner*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 272 | float ratio = angleRight/angleLeft; |
sepp_nepp | 5:efe80c5db389 | 273 | float speedRight = last_speed * ratio; |
sepp_nepp | 5:efe80c5db389 | 274 | setSpeedMot(motor_left,last_speed); |
sepp_nepp | 5:efe80c5db389 | 275 | setSpeedMot(motor_right,speedRight); |
sepp_nepp | 5:efe80c5db389 | 276 | moveMotorLeft(COUNTERCLOCKWISE, angleLeft); |
sepp_nepp | 5:efe80c5db389 | 277 | moveMotorRight(CLOCKWISE, angleRight); |
sepp_nepp | 5:efe80c5db389 | 278 | } |
sepp_nepp | 5:efe80c5db389 | 279 | |
sepp_nepp | 6:4d8938b686a6 | 280 | void Creabot::moveLeft(float angle_deg) |
sepp_nepp | 5:efe80c5db389 | 281 | { |
sepp_nepp | 6:4d8938b686a6 | 282 | moveLeft(angle_deg,0); |
garphil | 4:531b1120d3ec | 283 | } |
garphil | 4:531b1120d3ec | 284 | |
sepp_nepp | 6:4d8938b686a6 | 285 | void Creabot::moveLeft(float angle_deg, float center_cm) |
garphil | 0:a7fb03c9ea9d | 286 | { |
sepp_nepp | 5:efe80c5db389 | 287 | if(center_cm<0) center_cm=0; /* TO remove? */ |
sepp_nepp | 6:4d8938b686a6 | 288 | float perimeter_outer = 2.0f*angle_deg*(center_cm+distance_wheel)*PI/360.0f; |
sepp_nepp | 6:4d8938b686a6 | 289 | float perimeter_inner = 2.0f*angle_deg*(center_cm)*PI/360.0f; |
sepp_nepp | 5:efe80c5db389 | 290 | float angleLeft = perimeter_inner*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 291 | float angleRight = perimeter_outer*degree_wheel_per_cm; |
sepp_nepp | 5:efe80c5db389 | 292 | float ratio = angleLeft/angleRight; |
sepp_nepp | 5:efe80c5db389 | 293 | float speedRLeft = last_speed * ratio; |
sepp_nepp | 5:efe80c5db389 | 294 | setSpeedMot(motor_left,speedRLeft); |
sepp_nepp | 5:efe80c5db389 | 295 | setSpeedMot(motor_right,last_speed); |
sepp_nepp | 5:efe80c5db389 | 296 | moveMotorLeft(COUNTERCLOCKWISE, angleLeft); |
sepp_nepp | 5:efe80c5db389 | 297 | moveMotorRight(CLOCKWISE, angleRight); |
garphil | 0:a7fb03c9ea9d | 298 | } |
garphil | 0:a7fb03c9ea9d | 299 | |
sepp_nepp | 5:efe80c5db389 | 300 | //****************************************************************************** |
sepp_nepp | 6:4d8938b686a6 | 301 | // low level motor functions, filters for angle_deg>0, remembers that a motor moves |
sepp_nepp | 5:efe80c5db389 | 302 | //****************************************************************************** |
garphil | 0:a7fb03c9ea9d | 303 | |
sepp_nepp | 6:4d8938b686a6 | 304 | void Creabot::moveMotorLeft(motorDir dir, float angle_deg) |
garphil | 0:a7fb03c9ea9d | 305 | { |
sepp_nepp | 6:4d8938b686a6 | 306 | if(angle_deg>0) { |
sepp_nepp | 6:4d8938b686a6 | 307 | motor_left->RunDegrees(dir, angle_deg); |
sepp_nepp | 6:4d8938b686a6 | 308 | if (MotState==RMOT_RUNS) MotState=MOTORS_RUN; |
sepp_nepp | 6:4d8938b686a6 | 309 | else MotState=LMOT_RUNS; |
garphil | 0:a7fb03c9ea9d | 310 | } |
garphil | 0:a7fb03c9ea9d | 311 | } |
sepp_nepp | 5:efe80c5db389 | 312 | |
sepp_nepp | 6:4d8938b686a6 | 313 | void Creabot::moveMotorRight(motorDir dir, float angle_deg) |
sepp_nepp | 6:4d8938b686a6 | 314 | { |
sepp_nepp | 6:4d8938b686a6 | 315 | if(angle_deg>0) { |
sepp_nepp | 6:4d8938b686a6 | 316 | motor_right->RunDegrees(dir, angle_deg); |
sepp_nepp | 6:4d8938b686a6 | 317 | if (MotState==LMOT_RUNS) MotState=MOTORS_RUN; |
sepp_nepp | 6:4d8938b686a6 | 318 | else MotState=RMOT_RUNS; |
sepp_nepp | 6:4d8938b686a6 | 319 | } |
sepp_nepp | 5:efe80c5db389 | 320 | } |
sepp_nepp | 5:efe80c5db389 | 321 | |
sepp_nepp | 6:4d8938b686a6 | 322 | void Creabot::cbLeftMotStopped() |
sepp_nepp | 5:efe80c5db389 | 323 | { |
sepp_nepp | 6:4d8938b686a6 | 324 | if (MotState==MOTORS_RUN) MotState = RMOT_RUNS; |
sepp_nepp | 6:4d8938b686a6 | 325 | else AllMotorsStopped(); |
sepp_nepp | 5:efe80c5db389 | 326 | } |
sepp_nepp | 5:efe80c5db389 | 327 | |
sepp_nepp | 6:4d8938b686a6 | 328 | void Creabot::cbRightMotStopped() |
sepp_nepp | 6:4d8938b686a6 | 329 | { |
sepp_nepp | 6:4d8938b686a6 | 330 | if (MotState==MOTORS_RUN) MotState = LMOT_RUNS; |
sepp_nepp | 6:4d8938b686a6 | 331 | else AllMotorsStopped(); |
sepp_nepp | 6:4d8938b686a6 | 332 | } |
sepp_nepp | 6:4d8938b686a6 | 333 | |
sepp_nepp | 6:4d8938b686a6 | 334 | void Creabot::AllMotorsStopped() |
sepp_nepp | 6:4d8938b686a6 | 335 | { |
sepp_nepp | 6:4d8938b686a6 | 336 | if (MotState!=ALLSTOP) |
sepp_nepp | 6:4d8938b686a6 | 337 | { // Only do all this here if motor state is not already in ALLSTOP! |
sepp_nepp | 6:4d8938b686a6 | 338 | MotState = AlLSTOP; |
sepp_nepp | 6:4d8938b686a6 | 339 | if(extCallBack!=NULL) extCallBack( MotState ); |
sepp_nepp | 5:efe80c5db389 | 340 | } |
sepp_nepp | 5:efe80c5db389 | 341 | } |
sepp_nepp | 5:efe80c5db389 | 342 | |
sepp_nepp | 6:4d8938b686a6 | 343 | |
sepp_nepp | 6:4d8938b686a6 | 344 | void Creabot::stopMotors() |
sepp_nepp | 6:4d8938b686a6 | 345 | { |
sepp_nepp | 6:4d8938b686a6 | 346 | motor_left->MotorOFF(); |
sepp_nepp | 6:4d8938b686a6 | 347 | motor_right->MotorOFF(); |
sepp_nepp | 6:4d8938b686a6 | 348 | AllMotorsStopped() |
sepp_nepp | 6:4d8938b686a6 | 349 | } |
sepp_nepp | 6:4d8938b686a6 | 350 | |
sepp_nepp | 6:4d8938b686a6 | 351 | void Creabot::setSpeed(float speed_cm_sec) |
sepp_nepp | 6:4d8938b686a6 | 352 | { |
sepp_nepp | 6:4d8938b686a6 | 353 | if (MAX_SPEED_CM_P_SEC) |
sepp_nepp | 6:4d8938b686a6 | 354 | setSpeedMot(motor_left,speed_cm_sec); |
sepp_nepp | 6:4d8938b686a6 | 355 | setSpeedMot(motor_right,speed_cm_sec); |
sepp_nepp | 6:4d8938b686a6 | 356 | last_speed = speed_cm_sec; |
sepp_nepp | 6:4d8938b686a6 | 357 | } |
sepp_nepp | 6:4d8938b686a6 | 358 | |
sepp_nepp | 6:4d8938b686a6 | 359 | void Creabot::setSpeedMot(Motor *motor, float speed_cm_sec) |
sepp_nepp | 6:4d8938b686a6 | 360 | { if (speed_cm_sec <0.0001f) |
sepp_nepp | 6:4d8938b686a6 | 361 | motor->setStepTime_us( 1000000 ); |
sepp_nepp | 6:4d8938b686a6 | 362 | else { uint32_t tick = motor->getStepsFullTurn(); |
sepp_nepp | 6:4d8938b686a6 | 363 | motor->setStepTime_us( perimeter_wheel * 1000000 / speed_cm_sec / tick ) ; |
sepp_nepp | 6:4d8938b686a6 | 364 | } |
sepp_nepp | 6:4d8938b686a6 | 365 | } |
sepp_nepp | 6:4d8938b686a6 | 366 |