Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed CreaBotLib MotorLib
main_scratch.h@0:63321f7d8d0c, 2019-04-01 (annotated)
- Committer:
- alcocerg
- Date:
- Mon Apr 01 16:37:48 2019 +0000
- Revision:
- 0:63321f7d8d0c
New
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alcocerg | 0:63321f7d8d0c | 1 | /* |
alcocerg | 0:63321f7d8d0c | 2 | * Crealab : version Scratch |
alcocerg | 0:63321f7d8d0c | 3 | */ |
alcocerg | 0:63321f7d8d0c | 4 | |
alcocerg | 0:63321f7d8d0c | 5 | #undef printf |
alcocerg | 0:63321f7d8d0c | 6 | #include "Crealab.h" |
alcocerg | 0:63321f7d8d0c | 7 | |
alcocerg | 0:63321f7d8d0c | 8 | Serial pc_uart(USBTX, USBRX); // USBTX = PA2 |
alcocerg | 0:63321f7d8d0c | 9 | Serial bt_uart(PA_9, PA_10); // PA9 = Tx, PA10 = Rx |
alcocerg | 0:63321f7d8d0c | 10 | uint32_t go; |
alcocerg | 0:63321f7d8d0c | 11 | |
alcocerg | 0:63321f7d8d0c | 12 | // ---------------- PIN DEFINITIONS --------------------- |
alcocerg | 0:63321f7d8d0c | 13 | |
alcocerg | 0:63321f7d8d0c | 14 | InterruptIn buttonBox(PA_12); |
alcocerg | 0:63321f7d8d0c | 15 | |
alcocerg | 0:63321f7d8d0c | 16 | // --- Define the Four PINs & Time of movement used for Motor drive |
alcocerg | 0:63321f7d8d0c | 17 | Motor motorRD(PA_4, PA_3, PA_1, PA_0); |
alcocerg | 0:63321f7d8d0c | 18 | Motor motorRG(PA_8, PA_11, PB_5, PB_4); |
alcocerg | 0:63321f7d8d0c | 19 | Creabot mybot(&motorRG, &motorRD, 8.14f,9.6f); // insert the motors and indicate wheel diameter and distance between wheels |
alcocerg | 0:63321f7d8d0c | 20 | |
alcocerg | 0:63321f7d8d0c | 21 | bool receivedCOMMAND; |
alcocerg | 0:63321f7d8d0c | 22 | char commandRECEIVED; |
alcocerg | 0:63321f7d8d0c | 23 | int parameterRECEIVED; |
alcocerg | 0:63321f7d8d0c | 24 | int state; |
alcocerg | 0:63321f7d8d0c | 25 | char commandLine[256]; |
alcocerg | 0:63321f7d8d0c | 26 | int commandPosition; |
alcocerg | 0:63321f7d8d0c | 27 | |
alcocerg | 0:63321f7d8d0c | 28 | void help() // Display list of Commands |
alcocerg | 0:63321f7d8d0c | 29 | { |
alcocerg | 0:63321f7d8d0c | 30 | DEBUG("List of commands:\n\r"); |
alcocerg | 0:63321f7d8d0c | 31 | DEBUG(" h --> Help, display list of commands\n\r"); |
alcocerg | 0:63321f7d8d0c | 32 | } |
alcocerg | 0:63321f7d8d0c | 33 | |
alcocerg | 0:63321f7d8d0c | 34 | void callback() { |
alcocerg | 0:63321f7d8d0c | 35 | switch(state){ |
alcocerg | 0:63321f7d8d0c | 36 | case 0: |
alcocerg | 0:63321f7d8d0c | 37 | break; |
alcocerg | 0:63321f7d8d0c | 38 | case 1: |
alcocerg | 0:63321f7d8d0c | 39 | break; |
alcocerg | 0:63321f7d8d0c | 40 | case 2: |
alcocerg | 0:63321f7d8d0c | 41 | break; |
alcocerg | 0:63321f7d8d0c | 42 | case 3: |
alcocerg | 0:63321f7d8d0c | 43 | break; |
alcocerg | 0:63321f7d8d0c | 44 | default: |
alcocerg | 0:63321f7d8d0c | 45 | } |
alcocerg | 0:63321f7d8d0c | 46 | state=state+1; |
alcocerg | 0:63321f7d8d0c | 47 | } |
alcocerg | 0:63321f7d8d0c | 48 | |
alcocerg | 0:63321f7d8d0c | 49 | /* Stop all processes */ |
alcocerg | 0:63321f7d8d0c | 50 | void stop_all() |
alcocerg | 0:63321f7d8d0c | 51 | { |
alcocerg | 0:63321f7d8d0c | 52 | mybot.stopMove(); |
alcocerg | 0:63321f7d8d0c | 53 | } |
alcocerg | 0:63321f7d8d0c | 54 | |
alcocerg | 0:63321f7d8d0c | 55 | void clicked() |
alcocerg | 0:63321f7d8d0c | 56 | { |
alcocerg | 0:63321f7d8d0c | 57 | DEBUG("Labyrinthe\n\r"); |
alcocerg | 0:63321f7d8d0c | 58 | commandRECEIVED = 'l'; |
alcocerg | 0:63321f7d8d0c | 59 | receivedCOMMAND = true; |
alcocerg | 0:63321f7d8d0c | 60 | } |
alcocerg | 0:63321f7d8d0c | 61 | |
alcocerg | 0:63321f7d8d0c | 62 | void labyrinthe() |
alcocerg | 0:63321f7d8d0c | 63 | { |
alcocerg | 0:63321f7d8d0c | 64 | wait(1); |
alcocerg | 0:63321f7d8d0c | 65 | mybot.move(FORWARD,35); |
alcocerg | 0:63321f7d8d0c | 66 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 67 | mybot.move(LEFT, 45); |
alcocerg | 0:63321f7d8d0c | 68 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 69 | mybot.move(FORWARD,26); |
alcocerg | 0:63321f7d8d0c | 70 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 71 | mybot.move(RIGHT, 45); |
alcocerg | 0:63321f7d8d0c | 72 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 73 | mybot.move(FORWARD,8); |
alcocerg | 0:63321f7d8d0c | 74 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 75 | mybot.move(BACKWARD, 14); |
alcocerg | 0:63321f7d8d0c | 76 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 77 | mybot.move(ROTATE, 178); |
alcocerg | 0:63321f7d8d0c | 78 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 79 | mybot.move(FORWARD, 15); |
alcocerg | 0:63321f7d8d0c | 80 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 81 | mybot.move(RIGHT, 90); |
alcocerg | 0:63321f7d8d0c | 82 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 83 | mybot.move(FORWARD,14); |
alcocerg | 0:63321f7d8d0c | 84 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 85 | mybot.move(RIGHT, 85); |
alcocerg | 0:63321f7d8d0c | 86 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 87 | mybot.move(FORWARD,55); |
alcocerg | 0:63321f7d8d0c | 88 | mybot.waitEndMove(); |
alcocerg | 0:63321f7d8d0c | 89 | } |
alcocerg | 0:63321f7d8d0c | 90 | |
alcocerg | 0:63321f7d8d0c | 91 | void executeCommand(char c, int parameter) { |
alcocerg | 0:63321f7d8d0c | 92 | bool flaghelp = false; |
alcocerg | 0:63321f7d8d0c | 93 | switch (c) { |
alcocerg | 0:63321f7d8d0c | 94 | case 'h': |
alcocerg | 0:63321f7d8d0c | 95 | help(); |
alcocerg | 0:63321f7d8d0c | 96 | state=0; |
alcocerg | 0:63321f7d8d0c | 97 | flaghelp=true; |
alcocerg | 0:63321f7d8d0c | 98 | CASE('a', "Avance <cm> (a <cm>) => Avance du nombre de cm indiques", mybot.move(FORWARD,parameter); ) |
alcocerg | 0:63321f7d8d0c | 99 | CASE('r', "Recule <cm> (r <cm>) => Recule du nombre de cm indiques", mybot.move(BACKWARD,parameter); ) |
alcocerg | 0:63321f7d8d0c | 100 | CASE('d', "Droite <deg> (d <deg>) => Tourne a droite du nombre de degres indiques", mybot.move(RIGHT,parameter,0); ) |
alcocerg | 0:63321f7d8d0c | 101 | CASE('g', "Gauche <deg> (g <deg>) => Tourne a gauche du nombre de degres indiques", mybot.move(LEFT,parameter,0); ) |
alcocerg | 0:63321f7d8d0c | 102 | CASE('p', "Pivote_d <deh> (p <deg>) => pivote a droite du nombre de degres indiques", mybot.move(ROTATE,parameter); ) |
alcocerg | 0:63321f7d8d0c | 103 | CASE('q', "Pivote_g <deg> (q <deg>) => pivote a gauche du nombre de degres indiques", mybot.move(ROTATE,-parameter); ) |
alcocerg | 0:63321f7d8d0c | 104 | CASE('s', "Stop => Arrete les moteurs", mybot.stopMove(); state=0; ) |
alcocerg | 0:63321f7d8d0c | 105 | CASE('l', "Labyrinthe => Lance le parcours Labyrinthe", labyrinthe(); ) |
alcocerg | 0:63321f7d8d0c | 106 | default : |
alcocerg | 0:63321f7d8d0c | 107 | DEBUG("invalid command; use: 'h' for help()\n\r"); |
alcocerg | 0:63321f7d8d0c | 108 | state=0; |
alcocerg | 0:63321f7d8d0c | 109 | }} |
alcocerg | 0:63321f7d8d0c | 110 | |
alcocerg | 0:63321f7d8d0c | 111 | void analyseCommand(char *command, int parameter) { |
alcocerg | 0:63321f7d8d0c | 112 | parameterRECEIVED = parameter; |
alcocerg | 0:63321f7d8d0c | 113 | switch(command[0]) { |
alcocerg | 0:63321f7d8d0c | 114 | case 'A': |
alcocerg | 0:63321f7d8d0c | 115 | case 'a': |
alcocerg | 0:63321f7d8d0c | 116 | commandRECEIVED = 'a'; |
alcocerg | 0:63321f7d8d0c | 117 | break; |
alcocerg | 0:63321f7d8d0c | 118 | case 'R': |
alcocerg | 0:63321f7d8d0c | 119 | case 'r': |
alcocerg | 0:63321f7d8d0c | 120 | commandRECEIVED = 'r'; |
alcocerg | 0:63321f7d8d0c | 121 | break; |
alcocerg | 0:63321f7d8d0c | 122 | case 'D': |
alcocerg | 0:63321f7d8d0c | 123 | case 'd': |
alcocerg | 0:63321f7d8d0c | 124 | commandRECEIVED = 'd'; |
alcocerg | 0:63321f7d8d0c | 125 | break; |
alcocerg | 0:63321f7d8d0c | 126 | case 'G': |
alcocerg | 0:63321f7d8d0c | 127 | case 'g': |
alcocerg | 0:63321f7d8d0c | 128 | commandRECEIVED = 'g'; |
alcocerg | 0:63321f7d8d0c | 129 | break; |
alcocerg | 0:63321f7d8d0c | 130 | case 'L': |
alcocerg | 0:63321f7d8d0c | 131 | case 'l': |
alcocerg | 0:63321f7d8d0c | 132 | commandRECEIVED = 'l'; |
alcocerg | 0:63321f7d8d0c | 133 | break; |
alcocerg | 0:63321f7d8d0c | 134 | case 'P': |
alcocerg | 0:63321f7d8d0c | 135 | if(command[7]=='d') { |
alcocerg | 0:63321f7d8d0c | 136 | commandRECEIVED = 'p'; |
alcocerg | 0:63321f7d8d0c | 137 | } else if (command[7]=='g') { |
alcocerg | 0:63321f7d8d0c | 138 | commandRECEIVED = 'q'; |
alcocerg | 0:63321f7d8d0c | 139 | } else { |
alcocerg | 0:63321f7d8d0c | 140 | commandRECEIVED = 'h'; |
alcocerg | 0:63321f7d8d0c | 141 | } |
alcocerg | 0:63321f7d8d0c | 142 | break; |
alcocerg | 0:63321f7d8d0c | 143 | case 'p': |
alcocerg | 0:63321f7d8d0c | 144 | commandRECEIVED = 'p'; |
alcocerg | 0:63321f7d8d0c | 145 | break; |
alcocerg | 0:63321f7d8d0c | 146 | case 'q': |
alcocerg | 0:63321f7d8d0c | 147 | commandRECEIVED = 'q'; |
alcocerg | 0:63321f7d8d0c | 148 | break; |
alcocerg | 0:63321f7d8d0c | 149 | case 'S': |
alcocerg | 0:63321f7d8d0c | 150 | case 's': |
alcocerg | 0:63321f7d8d0c | 151 | commandRECEIVED = 's'; |
alcocerg | 0:63321f7d8d0c | 152 | mybot.stopMove(); state=0; |
alcocerg | 0:63321f7d8d0c | 153 | break; |
alcocerg | 0:63321f7d8d0c | 154 | default: |
alcocerg | 0:63321f7d8d0c | 155 | commandRECEIVED = 'h'; |
alcocerg | 0:63321f7d8d0c | 156 | } } |
alcocerg | 0:63321f7d8d0c | 157 | |
alcocerg | 0:63321f7d8d0c | 158 | void checkCommand(int result, char *command, int parameter) { |
alcocerg | 0:63321f7d8d0c | 159 | if(result==2 || command[0]=='h' || command[0]=='s') { |
alcocerg | 0:63321f7d8d0c | 160 | if(command[0]=='c') { |
alcocerg | 0:63321f7d8d0c | 161 | DEBUG("CREABOT PRESENT\n\r"); |
alcocerg | 0:63321f7d8d0c | 162 | } else { |
alcocerg | 0:63321f7d8d0c | 163 | analyseCommand(command, parameter); |
alcocerg | 0:63321f7d8d0c | 164 | receivedCOMMAND = true; |
alcocerg | 0:63321f7d8d0c | 165 | } |
alcocerg | 0:63321f7d8d0c | 166 | } } |
alcocerg | 0:63321f7d8d0c | 167 | |
alcocerg | 0:63321f7d8d0c | 168 | void split(char *line, int length) { |
alcocerg | 0:63321f7d8d0c | 169 | char command[256]; |
alcocerg | 0:63321f7d8d0c | 170 | int parameter=0; |
alcocerg | 0:63321f7d8d0c | 171 | int result = 1; |
alcocerg | 0:63321f7d8d0c | 172 | int i=0; |
alcocerg | 0:63321f7d8d0c | 173 | int j=0; |
alcocerg | 0:63321f7d8d0c | 174 | while(i<length && line[i]==' ') { |
alcocerg | 0:63321f7d8d0c | 175 | i++; |
alcocerg | 0:63321f7d8d0c | 176 | } |
alcocerg | 0:63321f7d8d0c | 177 | while(i<length && line[i]!=' ') { |
alcocerg | 0:63321f7d8d0c | 178 | command[j]=line[i]; |
alcocerg | 0:63321f7d8d0c | 179 | i++; |
alcocerg | 0:63321f7d8d0c | 180 | j++; |
alcocerg | 0:63321f7d8d0c | 181 | } |
alcocerg | 0:63321f7d8d0c | 182 | command[j]=0; |
alcocerg | 0:63321f7d8d0c | 183 | i++; |
alcocerg | 0:63321f7d8d0c | 184 | j=0; |
alcocerg | 0:63321f7d8d0c | 185 | while(i<length && line[i]!=' ' && line[i]>='0' && line[i]<='9') { |
alcocerg | 0:63321f7d8d0c | 186 | i++; |
alcocerg | 0:63321f7d8d0c | 187 | j++; |
alcocerg | 0:63321f7d8d0c | 188 | } |
alcocerg | 0:63321f7d8d0c | 189 | if(j>0) { |
alcocerg | 0:63321f7d8d0c | 190 | result++; |
alcocerg | 0:63321f7d8d0c | 191 | i--; |
alcocerg | 0:63321f7d8d0c | 192 | int k=1; |
alcocerg | 0:63321f7d8d0c | 193 | while(j>0) { |
alcocerg | 0:63321f7d8d0c | 194 | parameter += (line[i]-'0')*k; |
alcocerg | 0:63321f7d8d0c | 195 | j--; |
alcocerg | 0:63321f7d8d0c | 196 | i--; |
alcocerg | 0:63321f7d8d0c | 197 | k=k*10; |
alcocerg | 0:63321f7d8d0c | 198 | } |
alcocerg | 0:63321f7d8d0c | 199 | } |
alcocerg | 0:63321f7d8d0c | 200 | checkCommand(result, command, parameter); |
alcocerg | 0:63321f7d8d0c | 201 | } |
alcocerg | 0:63321f7d8d0c | 202 | |
alcocerg | 0:63321f7d8d0c | 203 | void storeC(char c) { |
alcocerg | 0:63321f7d8d0c | 204 | if(c==10 || c==13|| commandPosition >= 254) { |
alcocerg | 0:63321f7d8d0c | 205 | split(commandLine, commandPosition); |
alcocerg | 0:63321f7d8d0c | 206 | commandPosition=0; |
alcocerg | 0:63321f7d8d0c | 207 | } else { |
alcocerg | 0:63321f7d8d0c | 208 | commandLine[commandPosition++]=c; |
alcocerg | 0:63321f7d8d0c | 209 | commandLine[commandPosition]=0; |
alcocerg | 0:63321f7d8d0c | 210 | } |
alcocerg | 0:63321f7d8d0c | 211 | } |
alcocerg | 0:63321f7d8d0c | 212 | |
alcocerg | 0:63321f7d8d0c | 213 | void getBT() { |
alcocerg | 0:63321f7d8d0c | 214 | char c = bt_uart.getc(); |
alcocerg | 0:63321f7d8d0c | 215 | storeC(c); |
alcocerg | 0:63321f7d8d0c | 216 | } |
alcocerg | 0:63321f7d8d0c | 217 | |
alcocerg | 0:63321f7d8d0c | 218 | void getPC() { |
alcocerg | 0:63321f7d8d0c | 219 | char c = pc_uart.getc(); |
alcocerg | 0:63321f7d8d0c | 220 | // DEBUG("ENTERING INSIDE GETPC '%c' - %d\n\r", c, c); |
alcocerg | 0:63321f7d8d0c | 221 | storeC(c); |
alcocerg | 0:63321f7d8d0c | 222 | } |
alcocerg | 0:63321f7d8d0c | 223 | |
alcocerg | 0:63321f7d8d0c | 224 | void endOfMove(int status) { |
alcocerg | 0:63321f7d8d0c | 225 | DEBUG("ENDOFMOVE\n\r"); |
alcocerg | 0:63321f7d8d0c | 226 | state=0; |
alcocerg | 0:63321f7d8d0c | 227 | } |
alcocerg | 0:63321f7d8d0c | 228 | |
alcocerg | 0:63321f7d8d0c | 229 | /* Main Routine */ |
alcocerg | 0:63321f7d8d0c | 230 | int main() |
alcocerg | 0:63321f7d8d0c | 231 | { |
alcocerg | 0:63321f7d8d0c | 232 | /* Connect EoC button */ |
alcocerg | 0:63321f7d8d0c | 233 | CATCH_BUTTON(buttonBox,clicked); |
alcocerg | 0:63321f7d8d0c | 234 | |
alcocerg | 0:63321f7d8d0c | 235 | commandPosition=0; |
alcocerg | 0:63321f7d8d0c | 236 | bt_uart.attach(getBT); |
alcocerg | 0:63321f7d8d0c | 237 | pc_uart.attach(getPC); |
alcocerg | 0:63321f7d8d0c | 238 | mybot.setCallBack(endOfMove); |
alcocerg | 0:63321f7d8d0c | 239 | mybot.setSpeed(6.5); // max 8 cm.s, average 5 cm.s |
alcocerg | 0:63321f7d8d0c | 240 | state=0; |
alcocerg | 0:63321f7d8d0c | 241 | receivedCOMMAND = false; |
alcocerg | 0:63321f7d8d0c | 242 | DEBUG("CREABOT alpha version\n\r"); |
alcocerg | 0:63321f7d8d0c | 243 | while(1) { |
alcocerg | 0:63321f7d8d0c | 244 | if(state==0 && receivedCOMMAND) { |
alcocerg | 0:63321f7d8d0c | 245 | receivedCOMMAND = false; |
alcocerg | 0:63321f7d8d0c | 246 | state=1; |
alcocerg | 0:63321f7d8d0c | 247 | executeCommand(commandRECEIVED, parameterRECEIVED); |
alcocerg | 0:63321f7d8d0c | 248 | } |
alcocerg | 0:63321f7d8d0c | 249 | wait(0.1); |
alcocerg | 0:63321f7d8d0c | 250 | } |
alcocerg | 0:63321f7d8d0c | 251 | } |