Working version without LEDs
Voici le dernier schéma de cablage (version du 08/02/2020)
https://os.mbed.com/media/uploads/max_ence/schemarobot_fev2020.pdf
mainCopy.txt@1:69b5d8f0ba9c, 2020-05-30 (annotated)
- Committer:
- elab
- Date:
- Sat May 30 09:31:57 2020 +0000
- Revision:
- 1:69b5d8f0ba9c
- Parent:
- 0:0e577ce96b2f
pour eLab;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| elab | 0:0e577ce96b2f | 1 | /* |
| elab | 0:0e577ce96b2f | 2 | * Crealab : version Scratch |
| elab | 0:0e577ce96b2f | 3 | */ |
| elab | 0:0e577ce96b2f | 4 | |
| elab | 0:0e577ce96b2f | 5 | #undef printf |
| elab | 0:0e577ce96b2f | 6 | #include "Crealab.h" |
| elab | 0:0e577ce96b2f | 7 | #include "LED_WS2812.h" |
| elab | 0:0e577ce96b2f | 8 | #include "VL53L0X.h" |
| elab | 0:0e577ce96b2f | 9 | |
| elab | 0:0e577ce96b2f | 10 | //#include "AsyncToF.h" |
| elab | 0:0e577ce96b2f | 11 | |
| elab | 0:0e577ce96b2f | 12 | Serial pc_uart(USBTX, USBRX); // USBTX = PA2 |
| elab | 0:0e577ce96b2f | 13 | Serial bt_uart(D5, D4); // PA9 = Tx, PA10 = Rx |
| elab | 0:0e577ce96b2f | 14 | uint32_t go; |
| elab | 0:0e577ce96b2f | 15 | bool ShowDataLog=false; |
| elab | 0:0e577ce96b2f | 16 | uint16_t TOF_UseRange_mm = 450; |
| elab | 0:0e577ce96b2f | 17 | // ---------------- PIN DEFINITIONS --------------------- |
| elab | 0:0e577ce96b2f | 18 | |
| elab | 0:0e577ce96b2f | 19 | InterruptIn buttonBox(PA_12); |
| elab | 0:0e577ce96b2f | 20 | |
| elab | 0:0e577ce96b2f | 21 | // --- Define the Four PINs & Time of movement used for Motor drive |
| elab | 0:0e577ce96b2f | 22 | //Motor motorRD(PA_4, PA_3, PA_1, PA_0); |
| elab | 0:0e577ce96b2f | 23 | //Motor motorRG(PA_8, PA_11, PB_5, PB_4); |
| elab | 0:0e577ce96b2f | 24 | Motor motorRG(D12,D11,D10,D9); |
| elab | 0:0e577ce96b2f | 25 | Motor motorRD(A3,A2,A1,A0); |
| elab | 0:0e577ce96b2f | 26 | Creabot mybot(&motorRG, &motorRD, 8.10f,8.3f); // insert the motors and indicate wheel diameter and distance between wheels |
| elab | 0:0e577ce96b2f | 27 | LED_WS2812 ledBand(A4,2); |
| elab | 0:0e577ce96b2f | 28 | /*AsyncToF myToF(D4,D5,D13,A2,0x52);*/ |
| elab | 0:0e577ce96b2f | 29 | //AsyncToF myToF(D4,D5,D13,NC,0x52); |
| elab | 0:0e577ce96b2f | 30 | DigitalIn isCmd(A5); // relier le pin A5 a la masse (GND) pour faire fonctionner le robot en mode demo autonome |
| elab | 0:0e577ce96b2f | 31 | |
| elab | 0:0e577ce96b2f | 32 | static I2C busI2C(D0,D1); |
| elab | 0:0e577ce96b2f | 33 | static DigitalOut shutDownPin(D6); |
| elab | 0:0e577ce96b2f | 34 | static VL53L0X TOF1 (&busI2C, &shutDownPin, D7); |
| elab | 0:0e577ce96b2f | 35 | |
| elab | 0:0e577ce96b2f | 36 | bool receivedCOMMAND; |
| elab | 0:0e577ce96b2f | 37 | char commandRECEIVED; |
| elab | 0:0e577ce96b2f | 38 | int parameterRECEIVED; |
| elab | 0:0e577ce96b2f | 39 | int state; |
| elab | 0:0e577ce96b2f | 40 | char commandLine[256]; |
| elab | 0:0e577ce96b2f | 41 | int commandPosition; |
| elab | 0:0e577ce96b2f | 42 | VL53L0X_Error TOFError; |
| elab | 0:0e577ce96b2f | 43 | |
| elab | 0:0e577ce96b2f | 44 | void init_TOF( void ) |
| elab | 0:0e577ce96b2f | 45 | { |
| elab | 0:0e577ce96b2f | 46 | pc_uart.printf("\n\r--- Initializing the TOF sensor ---\n\r"); |
| elab | 0:0e577ce96b2f | 47 | |
| elab | 0:0e577ce96b2f | 48 | /* Init the TOF sensor with default params */ |
| elab | 0:0e577ce96b2f | 49 | TOFError = TOF1.init_sensor(); |
| elab | 0:0e577ce96b2f | 50 | /* This configuration "Range_Config_HIGH_SPEED" sets following parameters: |
| elab | 0:0e577ce96b2f | 51 | signalLimit = (FixPoint1616_t)(0.15*65536); ==> VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE |
| elab | 0:0e577ce96b2f | 52 | sigmaLimit = (FixPoint1616_t)(32*65536); ==> VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE |
| elab | 0:0e577ce96b2f | 53 | timingBudget = 10000; Must be > c_min_timing_budget_us = 20000; |
| elab | 0:0e577ce96b2f | 54 | preRangeVcselPeriod = 14; |
| elab | 0:0e577ce96b2f | 55 | finalRangeVcselPeriod = 10; */ |
| elab | 0:0e577ce96b2f | 56 | |
| elab | 0:0e577ce96b2f | 57 | if (TOFError == VL53L0X_ERROR_NONE) { TOFError = TOF1.start_measurement(range_continuous_polling, NULL, Range_Config_DEFAULT); } |
| elab | 0:0e577ce96b2f | 58 | pc_uart.printf("TOFError = %d. ( 0 = OK ) \n\r", TOFError); |
| elab | 0:0e577ce96b2f | 59 | pc_uart.printf(" TOF1.CurrentParameters.LimitChecksValue[VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE] = %4.2f \n\r", |
| elab | 0:0e577ce96b2f | 60 | TOF1.CurrentParameters.LimitChecksValue[VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE] /65536.1); |
| elab | 0:0e577ce96b2f | 61 | pc_uart.printf(" TOF1.CurrentParameters.LimitChecksValue[VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE] = %4.2f \n\r", |
| elab | 0:0e577ce96b2f | 62 | TOF1.CurrentParameters.LimitChecksValue[VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE] /65536.1); |
| elab | 0:0e577ce96b2f | 63 | |
| elab | 0:0e577ce96b2f | 64 | if (TOFError == VL53L0X_ERROR_NONE) { TOFError = TOF1.VL53L0X_set_measurement_timing_budget_us(100000); } |
| elab | 0:0e577ce96b2f | 65 | TOF1.CurrentParameters.RangeOffset_um = 14; // seems it is wrongly configured by default to 54mm offset! |
| elab | 0:0e577ce96b2f | 66 | pc_uart.printf("TOFError = %d. ( 0 = OK ) \n\r", TOFError); |
| elab | 0:0e577ce96b2f | 67 | |
| elab | 0:0e577ce96b2f | 68 | // Report_Deep_Infos(TOF1); |
| elab | 0:0e577ce96b2f | 69 | |
| elab | 0:0e577ce96b2f | 70 | if (TOFError != VL53L0X_ERROR_NONE) |
| elab | 0:0e577ce96b2f | 71 | { pc_uart.printf("\n\r--- Error Initializing the TOF sensor ---\n\r"); |
| elab | 0:0e577ce96b2f | 72 | //while(1) { }; // consider to hang up the device here |
| elab | 0:0e577ce96b2f | 73 | // alternatively just clear the Error State: |
| elab | 0:0e577ce96b2f | 74 | // TOF1.ErrState = VL53L0X_ERROR_NONE; |
| elab | 0:0e577ce96b2f | 75 | } |
| elab | 0:0e577ce96b2f | 76 | else |
| elab | 0:0e577ce96b2f | 77 | { pc_uart.printf("\n\r--- Success Initializing the TOF sensor ---\n\r"); } |
| elab | 0:0e577ce96b2f | 78 | } |
| elab | 0:0e577ce96b2f | 79 | |
| elab | 0:0e577ce96b2f | 80 | bool TOF_OK; |
| elab | 0:0e577ce96b2f | 81 | VL53L0X_RangingMeasurementData_t RangeResults; |
| elab | 0:0e577ce96b2f | 82 | uint16_t TOF_Dist_mm; |
| elab | 0:0e577ce96b2f | 83 | double TOF_RelDist; // measured distance relative to the Used Range. Should be clamped to 0 ... 1, but can actually also be negative or >1 |
| elab | 0:0e577ce96b2f | 84 | const uint32_t out_of_range = 0xffff; |
| elab | 0:0e577ce96b2f | 85 | uint16_t TOF_MinDist_mm=5; |
| elab | 0:0e577ce96b2f | 86 | |
| elab | 0:0e577ce96b2f | 87 | bool GetNewTOF() |
| elab | 0:0e577ce96b2f | 88 | { uint32_t NewDist_mm; |
| elab | 0:0e577ce96b2f | 89 | TOFError = TOF1.get_measurement(range_continuous_polling, &RangeResults); |
| elab | 0:0e577ce96b2f | 90 | if ( (TOFError == VL53L0X_ERROR_NONE) && (RangeResults.RangeStatus == 0) ) |
| elab | 0:0e577ce96b2f | 91 | { // we have a valid range. |
| elab | 0:0e577ce96b2f | 92 | // Report_Range_Infos( RangeResults ); |
| elab | 0:0e577ce96b2f | 93 | if (ShowDataLog) pc_uart.printf("Dist=%3d, SigRate=%4.2fM/s, AmbRate=%4.2fM/s, SpadRtnCnt=%3.1f, SigmEst=%3.3f\n\r", |
| elab | 0:0e577ce96b2f | 94 | RangeResults.Range_mm, RangeResults.SignalRateRtn_MHz/65536.1, RangeResults.AmbientRateRtn_MHz/65536.1, |
| elab | 0:0e577ce96b2f | 95 | RangeResults.EffectiveSpadRtnCount/256.1, RangeResults.SigmaEstimate/65536.1); |
| elab | 0:0e577ce96b2f | 96 | //Report_Deep_Infos(TOF1); |
| elab | 0:0e577ce96b2f | 97 | NewDist_mm = RangeResults.Range_mm; |
| elab | 0:0e577ce96b2f | 98 | // pc_uart.printf("%6ld\r", NewDist_mm); // Distance is ~1700 when looking at the ceiling, so approximately 1 per mm. A really usable distance range is only up to 1270. |
| elab | 0:0e577ce96b2f | 99 | |
| elab | 0:0e577ce96b2f | 100 | if (TOF_Dist_mm == out_of_range) // previous value was useless |
| elab | 0:0e577ce96b2f | 101 | { TOF_Dist_mm = NewDist_mm; } // only take the new value |
| elab | 0:0e577ce96b2f | 102 | else // average old with new value!! |
| elab | 0:0e577ce96b2f | 103 | { TOF_Dist_mm = ( NewDist_mm * 2 + TOF_Dist_mm * 3 ) / 5 ; |
| elab | 0:0e577ce96b2f | 104 | if (TOF_Dist_mm < TOF_MinDist_mm) { TOF_MinDist_mm = TOF_Dist_mm; pc_uart.printf("DMin = %3d. \r\n", TOF_MinDist_mm);} // adapt the min dist parameter |
| elab | 0:0e577ce96b2f | 105 | |
| elab | 0:0e577ce96b2f | 106 | // The device theoretical working distance range is from 0 up to 1270mm, distance is always expressed in mm! |
| elab | 0:0e577ce96b2f | 107 | // However here we transform to a relative number, of which only the range 0 ... 1 should be used. |
| elab | 0:0e577ce96b2f | 108 | TOF_RelDist = ( (double) TOF_Dist_mm - TOF_MinDist_mm) / TOF_UseRange_mm; |
| elab | 0:0e577ce96b2f | 109 | if (TOF_RelDist <0) {TOF_RelDist = 0;} // clamping values <0 (that should actually never occur with above adaption of Min dist!, values >1 can still happen! |
| elab | 0:0e577ce96b2f | 110 | } |
| elab | 0:0e577ce96b2f | 111 | return true; // new measurement is available |
| elab | 0:0e577ce96b2f | 112 | } |
| elab | 0:0e577ce96b2f | 113 | else |
| elab | 0:0e577ce96b2f | 114 | { // pc_uart.printf(" --\r"); |
| elab | 0:0e577ce96b2f | 115 | TOF_Dist_mm = out_of_range; |
| elab | 0:0e577ce96b2f | 116 | TOF_RelDist = out_of_range; |
| elab | 0:0e577ce96b2f | 117 | return false; // no new measurement is available |
| elab | 0:0e577ce96b2f | 118 | } |
| elab | 0:0e577ce96b2f | 119 | } |
| elab | 0:0e577ce96b2f | 120 | |
| elab | 0:0e577ce96b2f | 121 | |
| elab | 0:0e577ce96b2f | 122 | |
| elab | 0:0e577ce96b2f | 123 | void help() // Display list of Commands |
| elab | 0:0e577ce96b2f | 124 | { |
| elab | 0:0e577ce96b2f | 125 | DEBUG("List of commands:\n\r"); |
| elab | 0:0e577ce96b2f | 126 | DEBUG(" h --> Help, display list of commands\n\r"); |
| elab | 0:0e577ce96b2f | 127 | } |
| elab | 0:0e577ce96b2f | 128 | |
| elab | 0:0e577ce96b2f | 129 | void callback() |
| elab | 0:0e577ce96b2f | 130 | { |
| elab | 0:0e577ce96b2f | 131 | switch(state) { |
| elab | 0:0e577ce96b2f | 132 | case 0: |
| elab | 0:0e577ce96b2f | 133 | break; |
| elab | 0:0e577ce96b2f | 134 | case 1: |
| elab | 0:0e577ce96b2f | 135 | break; |
| elab | 0:0e577ce96b2f | 136 | case 2: |
| elab | 0:0e577ce96b2f | 137 | break; |
| elab | 0:0e577ce96b2f | 138 | case 3: |
| elab | 0:0e577ce96b2f | 139 | break; |
| elab | 0:0e577ce96b2f | 140 | default: |
| elab | 0:0e577ce96b2f | 141 | } |
| elab | 0:0e577ce96b2f | 142 | state=state+1; |
| elab | 0:0e577ce96b2f | 143 | } |
| elab | 0:0e577ce96b2f | 144 | |
| elab | 0:0e577ce96b2f | 145 | /* Stop all processes */ |
| elab | 0:0e577ce96b2f | 146 | void stop_all() |
| elab | 0:0e577ce96b2f | 147 | { |
| elab | 0:0e577ce96b2f | 148 | mybot.stopMove(); |
| elab | 0:0e577ce96b2f | 149 | } |
| elab | 0:0e577ce96b2f | 150 | |
| elab | 0:0e577ce96b2f | 151 | void clicked() |
| elab | 0:0e577ce96b2f | 152 | { |
| elab | 0:0e577ce96b2f | 153 | DEBUG("Labyrinthe\n\r"); |
| elab | 0:0e577ce96b2f | 154 | commandRECEIVED = 'l'; |
| elab | 0:0e577ce96b2f | 155 | receivedCOMMAND = true; |
| elab | 0:0e577ce96b2f | 156 | } |
| elab | 0:0e577ce96b2f | 157 | |
| elab | 0:0e577ce96b2f | 158 | void labyrinthe() |
| elab | 0:0e577ce96b2f | 159 | { |
| elab | 0:0e577ce96b2f | 160 | wait(1); |
| elab | 0:0e577ce96b2f | 161 | mybot.move(FORWARD,15); |
| elab | 0:0e577ce96b2f | 162 | mybot.waitEndMove(); |
| elab | 0:0e577ce96b2f | 163 | mybot.move(ROTATE, 90); |
| elab | 0:0e577ce96b2f | 164 | mybot.waitEndMove(); |
| elab | 0:0e577ce96b2f | 165 | mybot.move(FORWARD,15); |
| elab | 0:0e577ce96b2f | 166 | mybot.waitEndMove(); |
| elab | 0:0e577ce96b2f | 167 | mybot.move(ROTATE, 90); |
| elab | 0:0e577ce96b2f | 168 | mybot.waitEndMove(); |
| elab | 0:0e577ce96b2f | 169 | } |
| elab | 0:0e577ce96b2f | 170 | |
| elab | 0:0e577ce96b2f | 171 | void executeCommand(char c, int parameter) |
| elab | 0:0e577ce96b2f | 172 | { |
| elab | 0:0e577ce96b2f | 173 | bool flaghelp = false; |
| elab | 0:0e577ce96b2f | 174 | pc_uart.printf("hffehihgiehighegieighieughei\n"); |
| elab | 0:0e577ce96b2f | 175 | switch (c) { |
| elab | 0:0e577ce96b2f | 176 | case 'h': |
| elab | 0:0e577ce96b2f | 177 | help(); |
| elab | 0:0e577ce96b2f | 178 | state=0; |
| elab | 0:0e577ce96b2f | 179 | flaghelp=true; |
| elab | 0:0e577ce96b2f | 180 | CASE('a', "Avance <cm> (a <cm>) => Avance du nombre de cm indiques", mybot.move(FORWARD,parameter); ) |
| elab | 0:0e577ce96b2f | 181 | CASE('r', "Recule <cm> (r <cm>) => Recule du nombre de cm indiques", mybot.move(BACKWARD,parameter); ) |
| elab | 0:0e577ce96b2f | 182 | CASE('d', "Droite <deg> (d <deg>) => Tourne a droite du nombre de degres indiques", mybot.move(RIGHT,parameter,0); ) |
| elab | 0:0e577ce96b2f | 183 | CASE('g', "Gauche <deg> (g <deg>) => Tourne a gauche du nombre de degres indiques", mybot.move(LEFT,parameter,0); ) |
| elab | 0:0e577ce96b2f | 184 | CASE('p', "Pivote_d <deh> (p <deg>) => pivote a droite du nombre de degres indiques", mybot.move(ROTATE,parameter); ) |
| elab | 0:0e577ce96b2f | 185 | CASE('q', "Pivote_g <deg> (q <deg>) => pivote a gauche du nombre de degres indiques", mybot.move(ROTATE,-parameter); ) |
| elab | 0:0e577ce96b2f | 186 | CASE('s', "Stop => Arrete les moteurs", mybot.stopMove(); state=0; ) |
| elab | 0:0e577ce96b2f | 187 | CASE('l', "Labyrinthe => Lance le parcours Labyrinthe", labyrinthe(); ) |
| elab | 0:0e577ce96b2f | 188 | default : |
| elab | 0:0e577ce96b2f | 189 | DEBUG("invalid command; use: 'h' for help()\n\r"); |
| elab | 0:0e577ce96b2f | 190 | state=0; |
| elab | 0:0e577ce96b2f | 191 | } |
| elab | 0:0e577ce96b2f | 192 | } |
| elab | 0:0e577ce96b2f | 193 | |
| elab | 0:0e577ce96b2f | 194 | void analyseCommand(char *command, int parameter) |
| elab | 0:0e577ce96b2f | 195 | { |
| elab | 0:0e577ce96b2f | 196 | parameterRECEIVED = parameter; |
| elab | 0:0e577ce96b2f | 197 | switch(command[0]) { |
| elab | 0:0e577ce96b2f | 198 | case 'A': |
| elab | 0:0e577ce96b2f | 199 | case 'a': |
| elab | 0:0e577ce96b2f | 200 | commandRECEIVED = 'a'; |
| elab | 0:0e577ce96b2f | 201 | break; |
| elab | 0:0e577ce96b2f | 202 | case 'R': |
| elab | 0:0e577ce96b2f | 203 | case 'r': |
| elab | 0:0e577ce96b2f | 204 | commandRECEIVED = 'r'; |
| elab | 0:0e577ce96b2f | 205 | break; |
| elab | 0:0e577ce96b2f | 206 | case 'D': |
| elab | 0:0e577ce96b2f | 207 | case 'd': |
| elab | 0:0e577ce96b2f | 208 | commandRECEIVED = 'd'; |
| elab | 0:0e577ce96b2f | 209 | break; |
| elab | 0:0e577ce96b2f | 210 | case 'G': |
| elab | 0:0e577ce96b2f | 211 | case 'g': |
| elab | 0:0e577ce96b2f | 212 | commandRECEIVED = 'g'; |
| elab | 0:0e577ce96b2f | 213 | break; |
| elab | 0:0e577ce96b2f | 214 | case 'L': |
| elab | 0:0e577ce96b2f | 215 | case 'l': |
| elab | 0:0e577ce96b2f | 216 | commandRECEIVED = 'l'; |
| elab | 0:0e577ce96b2f | 217 | break; |
| elab | 0:0e577ce96b2f | 218 | case 'P': |
| elab | 0:0e577ce96b2f | 219 | if(command[7]=='d') { |
| elab | 0:0e577ce96b2f | 220 | commandRECEIVED = 'p'; |
| elab | 0:0e577ce96b2f | 221 | } else if (command[7]=='g') { |
| elab | 0:0e577ce96b2f | 222 | commandRECEIVED = 'q'; |
| elab | 0:0e577ce96b2f | 223 | } else { |
| elab | 0:0e577ce96b2f | 224 | commandRECEIVED = 'h'; |
| elab | 0:0e577ce96b2f | 225 | } |
| elab | 0:0e577ce96b2f | 226 | break; |
| elab | 0:0e577ce96b2f | 227 | case 'p': |
| elab | 0:0e577ce96b2f | 228 | commandRECEIVED = 'p'; |
| elab | 0:0e577ce96b2f | 229 | break; |
| elab | 0:0e577ce96b2f | 230 | case 'q': |
| elab | 0:0e577ce96b2f | 231 | commandRECEIVED = 'q'; |
| elab | 0:0e577ce96b2f | 232 | break; |
| elab | 0:0e577ce96b2f | 233 | case 'S': |
| elab | 0:0e577ce96b2f | 234 | case 's': |
| elab | 0:0e577ce96b2f | 235 | commandRECEIVED = 's'; |
| elab | 0:0e577ce96b2f | 236 | mybot.stopMove(); |
| elab | 0:0e577ce96b2f | 237 | state=0; |
| elab | 0:0e577ce96b2f | 238 | break; |
| elab | 0:0e577ce96b2f | 239 | default: |
| elab | 0:0e577ce96b2f | 240 | commandRECEIVED = 'h'; |
| elab | 0:0e577ce96b2f | 241 | } |
| elab | 0:0e577ce96b2f | 242 | } |
| elab | 0:0e577ce96b2f | 243 | |
| elab | 0:0e577ce96b2f | 244 | void checkCommand(int result, char *command, int parameter) |
| elab | 0:0e577ce96b2f | 245 | { |
| elab | 0:0e577ce96b2f | 246 | if(result==2 || command[0]=='h' || command[0]=='s') { |
| elab | 0:0e577ce96b2f | 247 | if(command[0]=='c') { |
| elab | 0:0e577ce96b2f | 248 | DEBUG("CREABOT PRESENT\n\r"); |
| elab | 0:0e577ce96b2f | 249 | } else { |
| elab | 0:0e577ce96b2f | 250 | analyseCommand(command, parameter); |
| elab | 0:0e577ce96b2f | 251 | receivedCOMMAND = true; |
| elab | 0:0e577ce96b2f | 252 | } |
| elab | 0:0e577ce96b2f | 253 | } |
| elab | 0:0e577ce96b2f | 254 | } |
| elab | 0:0e577ce96b2f | 255 | |
| elab | 0:0e577ce96b2f | 256 | void split(char *line, int length) |
| elab | 0:0e577ce96b2f | 257 | { |
| elab | 0:0e577ce96b2f | 258 | char command[256]; |
| elab | 0:0e577ce96b2f | 259 | int parameter=0; |
| elab | 0:0e577ce96b2f | 260 | int result = 1; |
| elab | 0:0e577ce96b2f | 261 | int i=0; |
| elab | 0:0e577ce96b2f | 262 | int j=0; |
| elab | 0:0e577ce96b2f | 263 | while(i<length && line[i]==' ') { |
| elab | 0:0e577ce96b2f | 264 | i++; |
| elab | 0:0e577ce96b2f | 265 | } |
| elab | 0:0e577ce96b2f | 266 | while(i<length && line[i]!=' ') { |
| elab | 0:0e577ce96b2f | 267 | command[j]=line[i]; |
| elab | 0:0e577ce96b2f | 268 | i++; |
| elab | 0:0e577ce96b2f | 269 | j++; |
| elab | 0:0e577ce96b2f | 270 | } |
| elab | 0:0e577ce96b2f | 271 | command[j]=0; |
| elab | 0:0e577ce96b2f | 272 | i++; |
| elab | 0:0e577ce96b2f | 273 | j=0; |
| elab | 0:0e577ce96b2f | 274 | while(i<length && line[i]!=' ' && line[i]>='0' && line[i]<='9') { |
| elab | 0:0e577ce96b2f | 275 | i++; |
| elab | 0:0e577ce96b2f | 276 | j++; |
| elab | 0:0e577ce96b2f | 277 | } |
| elab | 0:0e577ce96b2f | 278 | if(j>0) { |
| elab | 0:0e577ce96b2f | 279 | result++; |
| elab | 0:0e577ce96b2f | 280 | i--; |
| elab | 0:0e577ce96b2f | 281 | int k=1; |
| elab | 0:0e577ce96b2f | 282 | while(j>0) { |
| elab | 0:0e577ce96b2f | 283 | parameter += (line[i]-'0')*k; |
| elab | 0:0e577ce96b2f | 284 | j--; |
| elab | 0:0e577ce96b2f | 285 | i--; |
| elab | 0:0e577ce96b2f | 286 | k=k*10; |
| elab | 0:0e577ce96b2f | 287 | } |
| elab | 0:0e577ce96b2f | 288 | } |
| elab | 0:0e577ce96b2f | 289 | checkCommand(result, command, parameter); |
| elab | 0:0e577ce96b2f | 290 | } |
| elab | 0:0e577ce96b2f | 291 | |
| elab | 0:0e577ce96b2f | 292 | void storeC(char c) |
| elab | 0:0e577ce96b2f | 293 | { |
| elab | 0:0e577ce96b2f | 294 | if(c==10 || c==13|| commandPosition >= 254) { |
| elab | 0:0e577ce96b2f | 295 | split(commandLine, commandPosition); |
| elab | 0:0e577ce96b2f | 296 | commandPosition=0; |
| elab | 0:0e577ce96b2f | 297 | } else { |
| elab | 0:0e577ce96b2f | 298 | commandLine[commandPosition++]=c; |
| elab | 0:0e577ce96b2f | 299 | commandLine[commandPosition]=0; |
| elab | 0:0e577ce96b2f | 300 | } |
| elab | 0:0e577ce96b2f | 301 | } |
| elab | 0:0e577ce96b2f | 302 | |
| elab | 0:0e577ce96b2f | 303 | void getBT() |
| elab | 0:0e577ce96b2f | 304 | { |
| elab | 0:0e577ce96b2f | 305 | char c = bt_uart.getc(); |
| elab | 0:0e577ce96b2f | 306 | storeC(c); |
| elab | 0:0e577ce96b2f | 307 | } |
| elab | 0:0e577ce96b2f | 308 | |
| elab | 0:0e577ce96b2f | 309 | void getPC() |
| elab | 0:0e577ce96b2f | 310 | { |
| elab | 0:0e577ce96b2f | 311 | char c = pc_uart.getc(); |
| elab | 0:0e577ce96b2f | 312 | storeC(c); |
| elab | 0:0e577ce96b2f | 313 | } |
| elab | 0:0e577ce96b2f | 314 | |
| elab | 0:0e577ce96b2f | 315 | void endOfMove(int status) |
| elab | 0:0e577ce96b2f | 316 | { |
| elab | 0:0e577ce96b2f | 317 | DEBUG("ENDOFMOVE\n\r"); |
| elab | 0:0e577ce96b2f | 318 | state=0; |
| elab | 0:0e577ce96b2f | 319 | } |
| elab | 0:0e577ce96b2f | 320 | void demoMode(void) |
| elab | 0:0e577ce96b2f | 321 | { |
| elab | 0:0e577ce96b2f | 322 | init_TOF(); |
| elab | 0:0e577ce96b2f | 323 | TOF_Dist_mm=200; |
| elab | 0:0e577ce96b2f | 324 | while(1){ |
| elab | 0:0e577ce96b2f | 325 | if(GetNewTOF()){ |
| elab | 0:0e577ce96b2f | 326 | // pc_uart.printf("\n\rDistance : %d mm\n\r",TOF_Dist_mm); |
| elab | 0:0e577ce96b2f | 327 | // DEBUG("\n\rDistance : %d mm\n\r",TOF_Dist_mm) |
| elab | 0:0e577ce96b2f | 328 | } |
| elab | 0:0e577ce96b2f | 329 | |
| elab | 0:0e577ce96b2f | 330 | if (TOF_Dist_mm < 60 & TOF_Dist_mm > 0){ |
| elab | 0:0e577ce96b2f | 331 | mybot.move(BACKWARD,5); |
| elab | 0:0e577ce96b2f | 332 | mybot.waitEndMove(5000000); // 5 seconds |
| elab | 0:0e577ce96b2f | 333 | mybot.move(ROTATE,-90); |
| elab | 0:0e577ce96b2f | 334 | mybot.waitEndMove(5000000); // 5 seconds |
| elab | 0:0e577ce96b2f | 335 | } |
| elab | 0:0e577ce96b2f | 336 | else{ |
| elab | 0:0e577ce96b2f | 337 | mybot.move(FORWARD,5); |
| elab | 0:0e577ce96b2f | 338 | // mybot.waitEndMove(5000000); // 5 seconds |
| elab | 0:0e577ce96b2f | 339 | } |
| elab | 0:0e577ce96b2f | 340 | } |
| elab | 0:0e577ce96b2f | 341 | } |
| elab | 0:0e577ce96b2f | 342 | /* Routine */ |
| elab | 0:0e577ce96b2f | 343 | int main() |
| elab | 0:0e577ce96b2f | 344 | { |
| elab | 0:0e577ce96b2f | 345 | /* Rename HC-C6 BT*/ |
| elab | 0:0e577ce96b2f | 346 | |
| elab | 0:0e577ce96b2f | 347 | commandPosition=0; |
| elab | 0:0e577ce96b2f | 348 | pc_uart.attach(getPC); |
| elab | 0:0e577ce96b2f | 349 | bt_uart.attach(getBT); |
| elab | 0:0e577ce96b2f | 350 | |
| elab | 0:0e577ce96b2f | 351 | mybot.setCallBack(endOfMove); |
| elab | 0:0e577ce96b2f | 352 | mybot.setSpeed(6.0); // max 6.9 cm.s, average 5 cm.s |
| elab | 0:0e577ce96b2f | 353 | state=0; |
| elab | 0:0e577ce96b2f | 354 | receivedCOMMAND = false; |
| elab | 0:0e577ce96b2f | 355 | DEBUG("CREABOT alpha version\n\r"); |
| elab | 0:0e577ce96b2f | 356 | __disable_irq(); |
| elab | 0:0e577ce96b2f | 357 | pc_uart.printf("Init Done ...\n\r"); |
| elab | 0:0e577ce96b2f | 358 | __enable_irq(); |
| elab | 0:0e577ce96b2f | 359 | pc_uart.printf("start passed ok\n"); |
| elab | 0:0e577ce96b2f | 360 | |
| elab | 0:0e577ce96b2f | 361 | |
| elab | 0:0e577ce96b2f | 362 | ledBand.SetColor(BLUE,0); |
| elab | 0:0e577ce96b2f | 363 | ledBand.SetColor(BLUE,1); |
| elab | 0:0e577ce96b2f | 364 | |
| elab | 0:0e577ce96b2f | 365 | isCmd.mode(PullUp); |
| elab | 0:0e577ce96b2f | 366 | pc_uart.printf("switchState=%d\n\r", isCmd.read()); |
| elab | 0:0e577ce96b2f | 367 | if (isCmd.read()==0){ |
| elab | 0:0e577ce96b2f | 368 | demoMode(); |
| elab | 0:0e577ce96b2f | 369 | } |
| elab | 0:0e577ce96b2f | 370 | while(1) { |
| elab | 0:0e577ce96b2f | 371 | if(state==0 && receivedCOMMAND) { |
| elab | 0:0e577ce96b2f | 372 | receivedCOMMAND = false; |
| elab | 0:0e577ce96b2f | 373 | state=1; |
| elab | 0:0e577ce96b2f | 374 | pc_uart.printf("tototo\n"); |
| elab | 0:0e577ce96b2f | 375 | executeCommand(commandRECEIVED, parameterRECEIVED); |
| elab | 0:0e577ce96b2f | 376 | } |
| elab | 0:0e577ce96b2f | 377 | wait(0.1); |
| elab | 0:0e577ce96b2f | 378 | } |
| elab | 0:0e577ce96b2f | 379 | } |