The servo version of SCRIBE
Dependencies: BLE_nRF8001 BNO055 HC_SR04_Ultrasonic_Library mbed-rtos mbed
Fork of SCRIBE_stepper by
main.cpp@14:82248fb06e53, 2016-05-12 (annotated)
- Committer:
- manz
- Date:
- Thu May 12 06:17:49 2016 +0000
- Revision:
- 14:82248fb06e53
- Parent:
- 13:d49cb8b52a1e
latest version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manz | 9:946d400b2f13 | 1 | // main of SCRIBE servo |
manz | 0:83acd45a2405 | 2 | |
manz | 0:83acd45a2405 | 3 | // Import libraries |
manz | 0:83acd45a2405 | 4 | #include "Arduino.h" |
manz | 0:83acd45a2405 | 5 | #include "BLEPeripheral.h" |
manz | 0:83acd45a2405 | 6 | #include "mbed.h" |
manz | 5:1da4d4050306 | 7 | #include "rtos.h" |
manz | 5:1da4d4050306 | 8 | #include "localization.h" |
manz | 7:1bb3b5b66fe8 | 9 | #include "servo.h" |
manz | 0:83acd45a2405 | 10 | |
manz | 0:83acd45a2405 | 11 | Serial serial(USBTX, USBRX); |
manz | 7:1bb3b5b66fe8 | 12 | |
manz | 9:946d400b2f13 | 13 | //Analog In for ADC A0 -> p15 |
manz | 9:946d400b2f13 | 14 | AnalogIn ain1(A0); |
manz | 9:946d400b2f13 | 15 | AnalogIn ain2(A1); |
manz | 7:1bb3b5b66fe8 | 16 | |
manz | 7:1bb3b5b66fe8 | 17 | //Digital LED |
manz | 7:1bb3b5b66fe8 | 18 | DigitalOut led1(LED1); |
manz | 7:1bb3b5b66fe8 | 19 | DigitalOut led2(LED2); |
manz | 7:1bb3b5b66fe8 | 20 | DigitalOut led3(LED3); |
manz | 7:1bb3b5b66fe8 | 21 | DigitalOut led4(LED4); |
manz | 7:1bb3b5b66fe8 | 22 | |
manz | 7:1bb3b5b66fe8 | 23 | |
manz | 0:83acd45a2405 | 24 | SPI spi(p11, p12, p13); |
manz | 0:83acd45a2405 | 25 | DigitalInOut BLE_RDY(p21); |
manz | 0:83acd45a2405 | 26 | DigitalInOut BLE_REQ(p22); |
manz | 0:83acd45a2405 | 27 | DigitalInOut BLE_RESET(p23); |
manz | 14:82248fb06e53 | 28 | |
manz | 14:82248fb06e53 | 29 | |
manz | 14:82248fb06e53 | 30 | // pins for IR localization |
manz | 14:82248fb06e53 | 31 | I2C i2c(p9, p10); // sda, scl |
manz | 14:82248fb06e53 | 32 | const int addr = 0xB0; // define the I2C Address of camera |
manz | 14:82248fb06e53 | 33 | int ir_finish = 0; |
manz | 14:82248fb06e53 | 34 | |
manz | 14:82248fb06e53 | 35 | void back_to_zero(); |
manz | 0:83acd45a2405 | 36 | |
manz | 0:83acd45a2405 | 37 | unsigned char txbuf[16] = {0}; |
manz | 0:83acd45a2405 | 38 | unsigned char txlen = 0; |
manz | 0:83acd45a2405 | 39 | |
manz | 0:83acd45a2405 | 40 | // create peripheral |
manz | 0:83acd45a2405 | 41 | BLEPeripheral blePeripheral = BLEPeripheral(&BLE_REQ, &BLE_RDY, &BLE_RESET); |
manz | 0:83acd45a2405 | 42 | |
manz | 0:83acd45a2405 | 43 | // create service w/ uuid |
manz | 0:83acd45a2405 | 44 | BLEService uartService = BLEService("713d0000503e4c75ba943148f18d941e"); |
manz | 0:83acd45a2405 | 45 | |
manz | 0:83acd45a2405 | 46 | // create characteristics |
manz | 0:83acd45a2405 | 47 | BLECharacteristic txCharacteristic = BLECharacteristic("713d0002503e4c75ba943148f18d941e", BLENotify, 20); |
manz | 0:83acd45a2405 | 48 | BLECharacteristic rxCharacteristic = BLECharacteristic("713d0003503e4c75ba943148f18d941e", BLEWriteWithoutResponse, 20); |
manz | 0:83acd45a2405 | 49 | |
manz | 0:83acd45a2405 | 50 | unsigned int interval = 0; |
manz | 0:83acd45a2405 | 51 | unsigned char count_on = 0; |
manz | 0:83acd45a2405 | 52 | |
manz | 5:1da4d4050306 | 53 | int which_thread = 0; |
manz | 5:1da4d4050306 | 54 | |
manz | 0:83acd45a2405 | 55 | // array to save the values of the user |
manz | 7:1bb3b5b66fe8 | 56 | const int size = 500; |
manz | 0:83acd45a2405 | 57 | int path_x [size]; |
manz | 0:83acd45a2405 | 58 | int path_y [size]; |
manz | 5:1da4d4050306 | 59 | int path_p [size]; |
manz | 0:83acd45a2405 | 60 | int counter = 0; |
manz | 0:83acd45a2405 | 61 | int start = 0; |
manz | 0:83acd45a2405 | 62 | |
manz | 7:1bb3b5b66fe8 | 63 | |
manz | 3:63aef644e6d2 | 64 | const int shape_size = 10; |
manz | 7:1bb3b5b66fe8 | 65 | double shape_x [shape_size]; |
manz | 7:1bb3b5b66fe8 | 66 | double shape_y [shape_size]; |
manz | 3:63aef644e6d2 | 67 | |
manz | 5:1da4d4050306 | 68 | int mode = -1; //default mode is idle |
manz | 5:1da4d4050306 | 69 | int pmode = 1; //default pen is down |
manz | 3:63aef644e6d2 | 70 | |
manz | 0:83acd45a2405 | 71 | //coordinates of the pen and the centre of SCRIBE at beginning |
manz | 0:83acd45a2405 | 72 | double x_pen = 0; |
manz | 0:83acd45a2405 | 73 | double y_pen = 0; |
manz | 0:83acd45a2405 | 74 | double x_cent = 0; |
manz | 0:83acd45a2405 | 75 | double y_cent = -1; |
manz | 14:82248fb06e53 | 76 | double x_taro = 0; |
manz | 14:82248fb06e53 | 77 | double y_taro = 0; |
manz | 0:83acd45a2405 | 78 | |
manz | 0:83acd45a2405 | 79 | //speed of SCRIBE |
manz | 0:83acd45a2405 | 80 | float speed = 0.3; |
manz | 0:83acd45a2405 | 81 | float t_factor = 0.15; |
manz | 0:83acd45a2405 | 82 | |
manz | 0:83acd45a2405 | 83 | |
manz | 0:83acd45a2405 | 84 | Semaphore one_slot(1); |
manz | 0:83acd45a2405 | 85 | |
manz | 3:63aef644e6d2 | 86 | localization L; |
manz | 0:83acd45a2405 | 87 | |
manz | 14:82248fb06e53 | 88 | osThreadId bluetooth_id, mover_id,ir_id; |
manz | 5:1da4d4050306 | 89 | |
manz | 0:83acd45a2405 | 90 | void bluetooth_thread(void const *args){ |
manz | 5:1da4d4050306 | 91 | bluetooth_id = Thread::gettid(); |
manz | 5:1da4d4050306 | 92 | |
manz | 0:83acd45a2405 | 93 | serial.printf("Serial begin!\r\n"); |
manz | 5:1da4d4050306 | 94 | |
manz | 5:1da4d4050306 | 95 | FILE *fp = fopen("/local/trial.m", "w"); |
manz | 5:1da4d4050306 | 96 | if (fp == NULL) { |
manz | 5:1da4d4050306 | 97 | serial.printf("ERROR: File open!\r\n"); |
manz | 5:1da4d4050306 | 98 | } |
manz | 5:1da4d4050306 | 99 | |
manz | 0:83acd45a2405 | 100 | int x,y,x_dir,y_dir; |
manz | 7:1bb3b5b66fe8 | 101 | int stroke = 0; |
manz | 0:83acd45a2405 | 102 | |
manz | 0:83acd45a2405 | 103 | /*----- BLE Utility ---------------------------------------------*/ |
manz | 0:83acd45a2405 | 104 | // set advertised local name and service UUID |
manz | 0:83acd45a2405 | 105 | blePeripheral.setLocalName("BLE Shield"); |
manz | 0:83acd45a2405 | 106 | |
manz | 0:83acd45a2405 | 107 | blePeripheral.setAdvertisedServiceUuid(uartService.uuid()); |
manz | 0:83acd45a2405 | 108 | |
manz | 0:83acd45a2405 | 109 | // add service and characteristic |
manz | 0:83acd45a2405 | 110 | blePeripheral.addAttribute(uartService); |
manz | 0:83acd45a2405 | 111 | blePeripheral.addAttribute(rxCharacteristic); |
manz | 0:83acd45a2405 | 112 | blePeripheral.addAttribute(txCharacteristic); |
manz | 0:83acd45a2405 | 113 | |
manz | 0:83acd45a2405 | 114 | // begin initialization |
manz | 0:83acd45a2405 | 115 | blePeripheral.begin(); |
manz | 0:83acd45a2405 | 116 | /*---------------------------------------------------------------*/ |
manz | 0:83acd45a2405 | 117 | |
manz | 0:83acd45a2405 | 118 | serial.printf("BLE UART Peripheral begin!\r\n"); |
manz | 0:83acd45a2405 | 119 | |
manz | 0:83acd45a2405 | 120 | while(1) |
manz | 0:83acd45a2405 | 121 | { |
manz | 0:83acd45a2405 | 122 | BLECentral central = blePeripheral.central(); |
manz | 7:1bb3b5b66fe8 | 123 | |
manz | 0:83acd45a2405 | 124 | if (central) |
manz | 0:83acd45a2405 | 125 | { |
manz | 0:83acd45a2405 | 126 | // central connected to peripheral |
manz | 0:83acd45a2405 | 127 | serial.printf("Connected to central\r\n"); |
manz | 0:83acd45a2405 | 128 | while (central.connected()) |
manz | 5:1da4d4050306 | 129 | { |
manz | 7:1bb3b5b66fe8 | 130 | //serial.printf("*** Connected to bluetooth \r\n"); |
manz | 7:1bb3b5b66fe8 | 131 | Thread::wait(1); |
manz | 0:83acd45a2405 | 132 | // central still connected to peripheral |
manz | 0:83acd45a2405 | 133 | if (rxCharacteristic.written()) |
manz | 0:83acd45a2405 | 134 | { |
manz | 0:83acd45a2405 | 135 | unsigned char rxlen = rxCharacteristic.valueLength(); |
manz | 0:83acd45a2405 | 136 | const unsigned char *val = rxCharacteristic.value(); |
manz | 5:1da4d4050306 | 137 | /*serial.printf("didCharacteristicWritten, Length: %d\r\n", rxlen); |
manz | 3:63aef644e6d2 | 138 | |
manz | 0:83acd45a2405 | 139 | unsigned char i = 0; |
manz | 0:83acd45a2405 | 140 | while(i<rxlen) |
manz | 0:83acd45a2405 | 141 | { |
manz | 0:83acd45a2405 | 142 | serial.printf("%d, ",val[i++]); |
manz | 0:83acd45a2405 | 143 | } |
manz | 3:63aef644e6d2 | 144 | |
manz | 5:1da4d4050306 | 145 | serial.printf("\r\n");*/ |
manz | 3:63aef644e6d2 | 146 | //determine mode of signal |
manz | 3:63aef644e6d2 | 147 | if(rxlen == 1){ |
manz | 5:1da4d4050306 | 148 | // inputs blocked until shape finished |
manz | 3:63aef644e6d2 | 149 | if (mode != 13){ |
manz | 3:63aef644e6d2 | 150 | mode = (int) val[0]; |
manz | 14:82248fb06e53 | 151 | serial.printf("Mode 1-val: %i\r\n",mode); |
manz | 5:1da4d4050306 | 152 | if(mode != 4 && mode !=6){ |
manz | 7:1bb3b5b66fe8 | 153 | osSignalClear(bluetooth_id,0x1); |
manz | 5:1da4d4050306 | 154 | which_thread = 1; |
manz | 5:1da4d4050306 | 155 | } |
manz | 5:1da4d4050306 | 156 | } |
manz | 0:83acd45a2405 | 157 | } |
manz | 5:1da4d4050306 | 158 | if (mode == 6){ |
manz | 7:1bb3b5b66fe8 | 159 | stroke = 0; |
manz | 5:1da4d4050306 | 160 | serial.printf("Storing drawn coordinates\r\n"); |
manz | 5:1da4d4050306 | 161 | serial.printf("x_coord = ["); |
manz | 5:1da4d4050306 | 162 | for (int i = 0; i < size; i++) { |
manz | 5:1da4d4050306 | 163 | serial.printf("%i ", path_x[i]); |
manz | 5:1da4d4050306 | 164 | } |
manz | 5:1da4d4050306 | 165 | serial.printf("];\n"); |
manz | 5:1da4d4050306 | 166 | serial.printf("y_coord = ["); |
manz | 5:1da4d4050306 | 167 | for (int i = 0; i < size; i++) { |
manz | 5:1da4d4050306 | 168 | serial.printf("%i ", path_y[i]); |
manz | 5:1da4d4050306 | 169 | } |
manz | 5:1da4d4050306 | 170 | serial.printf("];\n"); |
manz | 5:1da4d4050306 | 171 | } |
manz | 5:1da4d4050306 | 172 | // stroke of pen finished |
manz | 5:1da4d4050306 | 173 | if (mode == 7){ |
manz | 7:1bb3b5b66fe8 | 174 | stroke = 1; |
manz | 5:1da4d4050306 | 175 | serial.printf("Other threads can proceed \r\n"); |
manz | 5:1da4d4050306 | 176 | osSignalClear(bluetooth_id,0x1); |
manz | 5:1da4d4050306 | 177 | which_thread = 1; |
manz | 5:1da4d4050306 | 178 | } |
manz | 5:1da4d4050306 | 179 | if(rxlen == 5){ |
manz | 5:1da4d4050306 | 180 | // in coordinates mode - accept negative coordinates |
manz | 7:1bb3b5b66fe8 | 181 | if(mode != 4 && stroke == 0){ |
manz | 3:63aef644e6d2 | 182 | mode = 9; |
manz | 5:1da4d4050306 | 183 | } |
manz | 5:1da4d4050306 | 184 | // in draw mode - convert coordinates |
manz | 5:1da4d4050306 | 185 | x = (int) val[0]*256 + val[1]; |
manz | 5:1da4d4050306 | 186 | y = (int) val[2]*256 + val[3]; |
manz | 3:63aef644e6d2 | 187 | |
manz | 3:63aef644e6d2 | 188 | // putting values into array |
manz | 5:1da4d4050306 | 189 | //serial.printf("try to put coordinates \r\n"); |
manz | 3:63aef644e6d2 | 190 | one_slot.wait(); |
manz | 3:63aef644e6d2 | 191 | if (counter == size){ |
manz | 5:1da4d4050306 | 192 | serial.printf("Overwriting values \r\n"); |
manz | 3:63aef644e6d2 | 193 | counter = 0; |
manz | 3:63aef644e6d2 | 194 | } |
manz | 3:63aef644e6d2 | 195 | path_x[counter] = x; |
manz | 3:63aef644e6d2 | 196 | path_y[counter] = y; |
manz | 5:1da4d4050306 | 197 | |
manz | 5:1da4d4050306 | 198 | //check if pen needs to be up or down |
manz | 7:1bb3b5b66fe8 | 199 | path_p[counter] = (int) val[4]; |
manz | 7:1bb3b5b66fe8 | 200 | serial.printf("Pen mode: %i \r\n",path_p[counter]); |
manz | 5:1da4d4050306 | 201 | |
manz | 3:63aef644e6d2 | 202 | counter++; |
manz | 3:63aef644e6d2 | 203 | one_slot.release(); |
manz | 5:1da4d4050306 | 204 | if(mode == 9){ |
manz | 7:1bb3b5b66fe8 | 205 | serial.printf("coordinate mode"); |
manz | 7:1bb3b5b66fe8 | 206 | osSignalClear(bluetooth_id,0x1); |
manz | 5:1da4d4050306 | 207 | which_thread = 1; |
manz | 5:1da4d4050306 | 208 | } |
manz | 5:1da4d4050306 | 209 | //serial.printf("put coordinates \r\n"); |
manz | 0:83acd45a2405 | 210 | } |
manz | 0:83acd45a2405 | 211 | } |
manz | 0:83acd45a2405 | 212 | |
manz | 0:83acd45a2405 | 213 | if(serial.readable()) |
manz | 0:83acd45a2405 | 214 | { |
manz | 0:83acd45a2405 | 215 | if(!count_on) |
manz | 0:83acd45a2405 | 216 | { |
manz | 0:83acd45a2405 | 217 | count_on = 1; |
manz | 0:83acd45a2405 | 218 | } |
manz | 0:83acd45a2405 | 219 | interval = 0; |
manz | 0:83acd45a2405 | 220 | txbuf[txlen] = serial.getc(); |
manz | 0:83acd45a2405 | 221 | txlen++; |
manz | 0:83acd45a2405 | 222 | } |
manz | 0:83acd45a2405 | 223 | |
manz | 0:83acd45a2405 | 224 | if(count_on) // Count the interval after receiving a new char from terminate |
manz | 0:83acd45a2405 | 225 | { |
manz | 0:83acd45a2405 | 226 | interval++; |
manz | 0:83acd45a2405 | 227 | } |
manz | 0:83acd45a2405 | 228 | |
manz | 0:83acd45a2405 | 229 | if(interval == 10) // If there is no char available last the interval, send the received chars to central. |
manz | 0:83acd45a2405 | 230 | { |
manz | 0:83acd45a2405 | 231 | interval = 0; |
manz | 0:83acd45a2405 | 232 | count_on = 0; |
manz | 5:1da4d4050306 | 233 | //serial.printf("Received from terminal: %d bytes\r\n", txlen); |
manz | 0:83acd45a2405 | 234 | txCharacteristic.setValue((const unsigned char *)txbuf, txlen); |
manz | 0:83acd45a2405 | 235 | txlen = 0; |
manz | 0:83acd45a2405 | 236 | } |
manz | 0:83acd45a2405 | 237 | } |
manz | 5:1da4d4050306 | 238 | |
manz | 0:83acd45a2405 | 239 | // central disconnected |
manz | 0:83acd45a2405 | 240 | serial.printf("Disconnected from central\r\n"); |
manz | 0:83acd45a2405 | 241 | } |
manz | 0:83acd45a2405 | 242 | } |
manz | 0:83acd45a2405 | 243 | } |
manz | 0:83acd45a2405 | 244 | |
manz | 14:82248fb06e53 | 245 | void i2c_write2(int addr, char a, char b) |
manz | 14:82248fb06e53 | 246 | { |
manz | 14:82248fb06e53 | 247 | char cmd[2]; |
manz | 14:82248fb06e53 | 248 | |
manz | 14:82248fb06e53 | 249 | cmd[0] = a; |
manz | 14:82248fb06e53 | 250 | cmd[1] = b; |
manz | 14:82248fb06e53 | 251 | i2c.write(addr, cmd, 2); |
manz | 14:82248fb06e53 | 252 | wait(0.07); // delay 70ms |
manz | 14:82248fb06e53 | 253 | } |
manz | 14:82248fb06e53 | 254 | |
manz | 14:82248fb06e53 | 255 | void clock_init() |
manz | 14:82248fb06e53 | 256 | { |
manz | 14:82248fb06e53 | 257 | // set up ~20-25MHz clock on p21 |
manz | 14:82248fb06e53 | 258 | LPC_PWM1->TCR = (1 << 1); // Reset counter, disable PWM |
manz | 14:82248fb06e53 | 259 | LPC_SC->PCLKSEL0 &= ~(0x3 << 12); |
manz | 14:82248fb06e53 | 260 | LPC_SC->PCLKSEL0 |= (1 << 12); // Set peripheral clock divider to /1, i.e. system clock |
manz | 14:82248fb06e53 | 261 | LPC_PWM1->MR0 = 4; // Match Register 0 is shared period counter for all PWM1 |
manz | 14:82248fb06e53 | 262 | LPC_PWM1->MR6 = 2; // Pin 21 is PWM output 6, so Match Register 6 |
manz | 14:82248fb06e53 | 263 | LPC_PWM1->LER |= 1; // Start updating at next period start |
manz | 14:82248fb06e53 | 264 | LPC_PWM1->TCR = (1 << 0) || (1 << 3); // Enable counter and PWM |
manz | 14:82248fb06e53 | 265 | } |
manz | 14:82248fb06e53 | 266 | |
manz | 14:82248fb06e53 | 267 | void cam_init() |
manz | 14:82248fb06e53 | 268 | { |
manz | 14:82248fb06e53 | 269 | // Init IR Camera sensor |
manz | 14:82248fb06e53 | 270 | i2c_write2(addr, 0x30, 0x01); |
manz | 14:82248fb06e53 | 271 | i2c_write2(addr, 0x30, 0x08); |
manz | 14:82248fb06e53 | 272 | i2c_write2(addr, 0x06, 0x90); |
manz | 14:82248fb06e53 | 273 | i2c_write2(addr, 0x08, 0xC0); |
manz | 14:82248fb06e53 | 274 | i2c_write2(addr, 0x1A, 0x40); |
manz | 14:82248fb06e53 | 275 | i2c_write2(addr, 0x33, 0x33); |
manz | 14:82248fb06e53 | 276 | wait(0.1); |
manz | 14:82248fb06e53 | 277 | } |
manz | 14:82248fb06e53 | 278 | |
manz | 14:82248fb06e53 | 279 | void ir_localization(void const *args) { |
manz | 14:82248fb06e53 | 280 | ir_id = Thread::gettid(); |
manz | 14:82248fb06e53 | 281 | char cmd[8]; |
manz | 14:82248fb06e53 | 282 | char buf[16]; |
manz | 14:82248fb06e53 | 283 | int Ix1,Iy1,Ix2,Iy2; |
manz | 14:82248fb06e53 | 284 | int Ix3,Iy3,Ix4,Iy4; |
manz | 14:82248fb06e53 | 285 | double angle1,angle2,angle3,angle4; |
manz | 14:82248fb06e53 | 286 | double angle_init, sum_x; |
manz | 14:82248fb06e53 | 287 | int s; |
manz | 14:82248fb06e53 | 288 | |
manz | 14:82248fb06e53 | 289 | // variables for localization |
manz | 14:82248fb06e53 | 290 | int m_count = 0; |
manz | 14:82248fb06e53 | 291 | double alpha1,alpha2,phi1,phi2,phiIMU1,phiIMU2,beta; |
manz | 14:82248fb06e53 | 292 | double x,y,z; |
manz | 14:82248fb06e53 | 293 | |
manz | 14:82248fb06e53 | 294 | // height is given |
manz | 14:82248fb06e53 | 295 | double h = 97; |
manz | 14:82248fb06e53 | 296 | |
manz | 14:82248fb06e53 | 297 | //clock_init(); |
manz | 14:82248fb06e53 | 298 | |
manz | 14:82248fb06e53 | 299 | // PC serial output |
manz | 14:82248fb06e53 | 300 | serial.printf("Initializing camera..."); |
manz | 14:82248fb06e53 | 301 | |
manz | 14:82248fb06e53 | 302 | cam_init(); |
manz | 14:82248fb06e53 | 303 | |
manz | 14:82248fb06e53 | 304 | serial.printf("complete\n"); |
manz | 14:82248fb06e53 | 305 | |
manz | 14:82248fb06e53 | 306 | float testAngle = L.getAngle(); |
manz | 14:82248fb06e53 | 307 | angle_init = L.getAngle(); |
manz | 14:82248fb06e53 | 308 | |
manz | 14:82248fb06e53 | 309 | serial.printf("Initial IMU-Angle is: %f\r\n",angle_init); |
manz | 14:82248fb06e53 | 310 | servo_slowleft(); |
manz | 14:82248fb06e53 | 311 | // read I2C stuff |
manz | 14:82248fb06e53 | 312 | while(m_count !=2){ |
manz | 14:82248fb06e53 | 313 | // IR Sensor read |
manz | 14:82248fb06e53 | 314 | cmd[0] = 0x36; |
manz | 14:82248fb06e53 | 315 | i2c.write(addr, cmd, 1); |
manz | 14:82248fb06e53 | 316 | i2c.read(addr, buf, 16); // read the 16-byte result |
manz | 14:82248fb06e53 | 317 | |
manz | 14:82248fb06e53 | 318 | Ix1 = buf[1]; |
manz | 14:82248fb06e53 | 319 | Iy1 = buf[2]; |
manz | 14:82248fb06e53 | 320 | s = buf[3]; |
manz | 14:82248fb06e53 | 321 | Ix1 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 322 | Iy1 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 323 | |
manz | 14:82248fb06e53 | 324 | Ix2 = buf[4]; |
manz | 14:82248fb06e53 | 325 | Iy2 = buf[5]; |
manz | 14:82248fb06e53 | 326 | s = buf[6]; |
manz | 14:82248fb06e53 | 327 | Ix2 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 328 | Iy2 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 329 | |
manz | 14:82248fb06e53 | 330 | Ix3 = buf[7]; |
manz | 14:82248fb06e53 | 331 | Iy3 = buf[8]; |
manz | 14:82248fb06e53 | 332 | s = buf[9]; |
manz | 14:82248fb06e53 | 333 | Ix3 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 334 | Iy3 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 335 | |
manz | 14:82248fb06e53 | 336 | Ix4 = buf[10]; |
manz | 14:82248fb06e53 | 337 | Iy4 = buf[11]; |
manz | 14:82248fb06e53 | 338 | s = buf[12]; |
manz | 14:82248fb06e53 | 339 | Ix4 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 340 | Iy4 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 341 | |
manz | 14:82248fb06e53 | 342 | angle1 = 45*((double)Ix1 / 1023 - 0.5); |
manz | 14:82248fb06e53 | 343 | angle2 = 45*((double)Ix2 / 1023 - 0.5); |
manz | 14:82248fb06e53 | 344 | angle3 = 45*(double)Ix3 / 1023; |
manz | 14:82248fb06e53 | 345 | angle4 = 45*(double)Ix4 / 1023; |
manz | 14:82248fb06e53 | 346 | |
manz | 14:82248fb06e53 | 347 | // print the coordinate data |
manz | 14:82248fb06e53 | 348 | serial.printf("Ix1: %4d, Iy1: %4d\n", Ix1, Iy1 ); |
manz | 14:82248fb06e53 | 349 | //serial.printf("Ix2: %4d, Iy2: %4d\n", Ix2, Iy2 ); |
manz | 14:82248fb06e53 | 350 | //serial.printf("Current IMU-Angle is: %f\r\n",L.getAngle()); |
manz | 14:82248fb06e53 | 351 | //print when more than one LED present |
manz | 14:82248fb06e53 | 352 | |
manz | 14:82248fb06e53 | 353 | if(Ix1 < 1023){ |
manz | 14:82248fb06e53 | 354 | //serial.printf("%d, %d: %f; %d, %d : %f\r\n", Ix1, Iy1, angle1, Ix2, Iy2, angle2); |
manz | 14:82248fb06e53 | 355 | /* if(angle1 <= -2){ |
manz | 14:82248fb06e53 | 356 | //serial.printf("Turn left! \r\n"); |
manz | 14:82248fb06e53 | 357 | } |
manz | 14:82248fb06e53 | 358 | else if (angle1 >= 2 && (abs(360 - L.getAngle()) > 90)){ |
manz | 14:82248fb06e53 | 359 | serial.printf("Turn right! \r\n"); |
manz | 14:82248fb06e53 | 360 | }*/ |
manz | 14:82248fb06e53 | 361 | if(abs(angle1) < 2) { |
manz | 14:82248fb06e53 | 362 | if(m_count == 0 && abs(360 - L.getAngle()) < 90){ |
manz | 14:82248fb06e53 | 363 | sum_x = 0; |
manz | 14:82248fb06e53 | 364 | // get ten pictures |
manz | 14:82248fb06e53 | 365 | for(int i = 0; i < 10; i++){ |
manz | 14:82248fb06e53 | 366 | cmd[0] = 0x36; |
manz | 14:82248fb06e53 | 367 | i2c.write(addr, cmd, 1); |
manz | 14:82248fb06e53 | 368 | i2c.read(addr, buf, 16); |
manz | 14:82248fb06e53 | 369 | |
manz | 14:82248fb06e53 | 370 | Ix1 = buf[1]; |
manz | 14:82248fb06e53 | 371 | Iy1 = buf[2]; |
manz | 14:82248fb06e53 | 372 | s = buf[3]; |
manz | 14:82248fb06e53 | 373 | Ix1 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 374 | Iy1 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 375 | angle1 = 45*((double)Ix1 / 1023 - 0.5); |
manz | 14:82248fb06e53 | 376 | sum_x = sum_x + angle1; |
manz | 14:82248fb06e53 | 377 | } |
manz | 14:82248fb06e53 | 378 | serial.printf("*** Got average angle1: %f\r\n",sum_x/10); |
manz | 14:82248fb06e53 | 379 | phiIMU1 = L.getAngle(); |
manz | 14:82248fb06e53 | 380 | phi1 = 360 - (phiIMU1 + sum_x/10); |
manz | 14:82248fb06e53 | 381 | serial.printf("*** Got phi1: %f, got phi_IMU1: %f\r\n", phi1,phiIMU1); |
manz | 14:82248fb06e53 | 382 | m_count = 1; |
manz | 14:82248fb06e53 | 383 | } |
manz | 14:82248fb06e53 | 384 | else if (m_count == 1 && abs(360 - L.getAngle()) > 90){ |
manz | 14:82248fb06e53 | 385 | servo_stop(); |
manz | 14:82248fb06e53 | 386 | phiIMU2 = L.getAngle(); |
manz | 14:82248fb06e53 | 387 | |
manz | 14:82248fb06e53 | 388 | sum_x = 0; |
manz | 14:82248fb06e53 | 389 | // get ten pictures |
manz | 14:82248fb06e53 | 390 | for(int i = 0; i < 10; i++){ |
manz | 14:82248fb06e53 | 391 | cmd[0] = 0x36; |
manz | 14:82248fb06e53 | 392 | i2c.write(addr, cmd, 1); |
manz | 14:82248fb06e53 | 393 | i2c.read(addr, buf, 16); |
manz | 14:82248fb06e53 | 394 | |
manz | 14:82248fb06e53 | 395 | Ix1 = buf[1]; |
manz | 14:82248fb06e53 | 396 | Iy1 = buf[2]; |
manz | 14:82248fb06e53 | 397 | s = buf[3]; |
manz | 14:82248fb06e53 | 398 | Ix1 += (s & 0x30) <<4; |
manz | 14:82248fb06e53 | 399 | Iy1 += (s & 0xC0) <<2; |
manz | 14:82248fb06e53 | 400 | angle2 = 45*((double)Ix1 / 1023 - 0.5); |
manz | 14:82248fb06e53 | 401 | |
manz | 14:82248fb06e53 | 402 | sum_x = sum_x + angle2; |
manz | 14:82248fb06e53 | 403 | } |
manz | 14:82248fb06e53 | 404 | serial.printf("*** Got average angle2: %f\r\n",sum_x/10); |
manz | 14:82248fb06e53 | 405 | |
manz | 14:82248fb06e53 | 406 | phi2 = 360 - (phiIMU2 + sum_x/10); |
manz | 14:82248fb06e53 | 407 | serial.printf("*** Got phi2: %f, got phi_IMU2: %f\r\n", phi2,phiIMU2); |
manz | 14:82248fb06e53 | 408 | alpha1 = 90 - phi1; |
manz | 14:82248fb06e53 | 409 | alpha2 = 90 - alpha1; |
manz | 14:82248fb06e53 | 410 | beta = 180 - (phi2 - phi1) - alpha2; |
manz | 14:82248fb06e53 | 411 | z = h*sin(beta/180*3.1415)/sin((phi2 - phi1)/180*3.1415); |
manz | 14:82248fb06e53 | 412 | x = z*sin(phi1/180*3.1415); |
manz | 14:82248fb06e53 | 413 | y = z*sin(alpha1/180*3.1415); |
manz | 14:82248fb06e53 | 414 | |
manz | 14:82248fb06e53 | 415 | serial.printf("Angles are: phi1 = %f, phi2 = %f:\r\n",phi1, phi2); |
manz | 14:82248fb06e53 | 416 | serial.printf("Angles are: alpha1 = %f, alpha2 = %f:\r\n",alpha1, alpha2); |
manz | 14:82248fb06e53 | 417 | |
manz | 14:82248fb06e53 | 418 | //reset after print out and set coordinates |
manz | 14:82248fb06e53 | 419 | m_count = 2; |
manz | 14:82248fb06e53 | 420 | x_pen = rint(x/4.5); |
manz | 14:82248fb06e53 | 421 | y_pen = rint((h-y)/4.5); |
manz | 14:82248fb06e53 | 422 | |
manz | 14:82248fb06e53 | 423 | //correction for translation |
manz | 14:82248fb06e53 | 424 | x_pen = x_pen + 2; |
manz | 14:82248fb06e53 | 425 | y_pen = y_pen - 2; |
manz | 14:82248fb06e53 | 426 | x_cent = x_pen; |
manz | 14:82248fb06e53 | 427 | y_cent = y_pen - 1; |
manz | 14:82248fb06e53 | 428 | x_taro = x_pen; |
manz | 14:82248fb06e53 | 429 | y_taro = y_pen; |
manz | 14:82248fb06e53 | 430 | serial.printf("Current location: x = %f, y = %f \r\n",x,h-y); |
manz | 14:82248fb06e53 | 431 | serial.printf("Current coordinates Pen: x = %f, y = %f \r\n",x_pen,y_pen); |
manz | 14:82248fb06e53 | 432 | serial.printf("Current coordinates Center: x = %f, y = %f \r\n",x_cent,y_cent); |
manz | 14:82248fb06e53 | 433 | } |
manz | 14:82248fb06e53 | 434 | } |
manz | 14:82248fb06e53 | 435 | |
manz | 14:82248fb06e53 | 436 | } |
manz | 14:82248fb06e53 | 437 | wait(0.2); |
manz | 3:63aef644e6d2 | 438 | } |
manz | 14:82248fb06e53 | 439 | |
manz | 14:82248fb06e53 | 440 | //turn upside again |
manz | 14:82248fb06e53 | 441 | back_to_zero(); |
manz | 14:82248fb06e53 | 442 | ir_finish = 1; |
manz | 3:63aef644e6d2 | 443 | } |
manz | 3:63aef644e6d2 | 444 | |
manz | 14:82248fb06e53 | 445 | void back_to_zero(){ |
manz | 14:82248fb06e53 | 446 | float testAngle = L.getAngle(); |
manz | 14:82248fb06e53 | 447 | serial.printf("Current Angle BTZ: %f",L.getAngle()); |
manz | 14:82248fb06e53 | 448 | while(L.getAngle()> 1){ |
manz | 14:82248fb06e53 | 449 | if(L.getAngle() > 180){ |
manz | 14:82248fb06e53 | 450 | servo_slowright(); |
manz | 14:82248fb06e53 | 451 | } |
manz | 14:82248fb06e53 | 452 | else{ |
manz | 14:82248fb06e53 | 453 | servo_slowleft(); |
manz | 14:82248fb06e53 | 454 | } |
manz | 14:82248fb06e53 | 455 | } |
manz | 14:82248fb06e53 | 456 | servo_stop(); |
manz | 14:82248fb06e53 | 457 | } |
manz | 0:83acd45a2405 | 458 | |
manz | 0:83acd45a2405 | 459 | void move_thread(void const *args){ |
manz | 5:1da4d4050306 | 460 | |
manz | 0:83acd45a2405 | 461 | int angle; |
manz | 9:946d400b2f13 | 462 | double length = 8; |
manz | 9:946d400b2f13 | 463 | double width = 8; |
manz | 3:63aef644e6d2 | 464 | int radius = 5; |
manz | 0:83acd45a2405 | 465 | |
manz | 0:83acd45a2405 | 466 | Timer t; |
manz | 0:83acd45a2405 | 467 | //initally put pen down |
manz | 0:83acd45a2405 | 468 | |
manz | 0:83acd45a2405 | 469 | float currentAngle; |
manz | 0:83acd45a2405 | 470 | float targetAngle; |
manz | 0:83acd45a2405 | 471 | float startAngle; |
manz | 0:83acd45a2405 | 472 | float diffAngle; |
manz | 0:83acd45a2405 | 473 | |
manz | 5:1da4d4050306 | 474 | int steps; |
manz | 5:1da4d4050306 | 475 | |
manz | 0:83acd45a2405 | 476 | int control; |
manz | 7:1bb3b5b66fe8 | 477 | int restore = 0; |
manz | 3:63aef644e6d2 | 478 | int shape_count = 0; |
manz | 5:1da4d4050306 | 479 | int p_mode; |
manz | 5:1da4d4050306 | 480 | int first = 0; |
manz | 3:63aef644e6d2 | 481 | |
manz | 9:946d400b2f13 | 482 | double draw_corr = 2; |
nibab | 8:4d7b2dbdb694 | 483 | double time_factor = 0.05; |
manz | 0:83acd45a2405 | 484 | |
manz | 0:83acd45a2405 | 485 | double dot,a2,b2,c2; |
manz | 0:83acd45a2405 | 486 | double x_tar,y_tar; |
manz | 7:1bb3b5b66fe8 | 487 | double x_pen_pr, y_pen_pr, x_cent_pr, y_cent_pr, x_taro_pr, y_taro_pr; |
manz | 0:83acd45a2405 | 488 | double cosg,gamma,distance,wait_t; |
manz | 0:83acd45a2405 | 489 | serial.printf("Started move thread\r\n"); |
manz | 0:83acd45a2405 | 490 | int newval = 0; |
manz | 9:946d400b2f13 | 491 | |
manz | 9:946d400b2f13 | 492 | //values for encoding |
manz | 9:946d400b2f13 | 493 | int counter_l = 0; |
manz | 9:946d400b2f13 | 494 | int on_l; |
manz | 9:946d400b2f13 | 495 | int counter_r = 0; |
manz | 9:946d400b2f13 | 496 | int on_r; |
manz | 9:946d400b2f13 | 497 | double sum_r = 0; |
manz | 9:946d400b2f13 | 498 | double sum_l = 0; |
manz | 9:946d400b2f13 | 499 | double value_r; |
manz | 9:946d400b2f13 | 500 | double value_l; |
manz | 12:01250ea24795 | 501 | float angle_init; |
manz | 12:01250ea24795 | 502 | |
manz | 12:01250ea24795 | 503 | float testAngle = L.getAngle(); |
manz | 5:1da4d4050306 | 504 | |
manz | 0:83acd45a2405 | 505 | while(1){ |
manz | 3:63aef644e6d2 | 506 | // check what mode is present |
manz | 5:1da4d4050306 | 507 | serial.printf("Cylce \r\n"); |
manz | 7:1bb3b5b66fe8 | 508 | serial.printf("mode: %i \r\n",mode); |
manz | 7:1bb3b5b66fe8 | 509 | |
manz | 5:1da4d4050306 | 510 | Thread::signal_wait(0x1); |
manz | 7:1bb3b5b66fe8 | 511 | |
manz | 5:1da4d4050306 | 512 | if(mode == -1){ |
manz | 5:1da4d4050306 | 513 | serial.printf("here ends"); |
manz | 5:1da4d4050306 | 514 | osSignalClear(mover_id,0x1); |
manz | 5:1da4d4050306 | 515 | which_thread = 0; |
manz | 5:1da4d4050306 | 516 | } |
manz | 3:63aef644e6d2 | 517 | //rectangle/square |
manz | 5:1da4d4050306 | 518 | else if(mode == 0){ |
manz | 3:63aef644e6d2 | 519 | serial.printf("Draw rectangle \r\n"); |
manz | 3:63aef644e6d2 | 520 | //save old values and set initial |
manz | 3:63aef644e6d2 | 521 | x_pen_pr = x_pen; |
manz | 3:63aef644e6d2 | 522 | y_pen_pr = y_pen; |
manz | 3:63aef644e6d2 | 523 | x_cent_pr = x_cent; |
manz | 7:1bb3b5b66fe8 | 524 | y_cent_pr = y_cent; |
manz | 7:1bb3b5b66fe8 | 525 | x_taro_pr = x_taro; |
manz | 7:1bb3b5b66fe8 | 526 | y_taro_pr = y_taro; |
manz | 3:63aef644e6d2 | 527 | x_pen = 0; |
manz | 3:63aef644e6d2 | 528 | y_pen = 0; |
manz | 3:63aef644e6d2 | 529 | x_cent = 0; |
manz | 3:63aef644e6d2 | 530 | y_cent = -1; |
manz | 5:1da4d4050306 | 531 | x_taro = 0; |
manz | 5:1da4d4050306 | 532 | y_taro = 0; |
manz | 3:63aef644e6d2 | 533 | |
manz | 3:63aef644e6d2 | 534 | //set values |
manz | 7:1bb3b5b66fe8 | 535 | shape_x[4] = 0; |
manz | 7:1bb3b5b66fe8 | 536 | shape_y[4] = length; |
manz | 7:1bb3b5b66fe8 | 537 | shape_x[3] = width; |
manz | 3:63aef644e6d2 | 538 | shape_y[3] = length; |
manz | 3:63aef644e6d2 | 539 | shape_x[2] = width; |
manz | 7:1bb3b5b66fe8 | 540 | shape_y[2] = 0; |
manz | 7:1bb3b5b66fe8 | 541 | shape_x[1] = 0; |
manz | 3:63aef644e6d2 | 542 | shape_y[1] = 0; |
manz | 3:63aef644e6d2 | 543 | shape_x[0] = 0; |
manz | 7:1bb3b5b66fe8 | 544 | shape_y[0] = 0.1; |
manz | 7:1bb3b5b66fe8 | 545 | shape_count = 5; |
manz | 3:63aef644e6d2 | 546 | |
manz | 3:63aef644e6d2 | 547 | mode = 13; |
manz | 3:63aef644e6d2 | 548 | } |
manz | 3:63aef644e6d2 | 549 | else if(mode == 1){ |
manz | 3:63aef644e6d2 | 550 | serial.printf("Draw circle \r\n"); |
manz | 3:63aef644e6d2 | 551 | //call circle function |
manz | 14:82248fb06e53 | 552 | //control = draw_circle(radius); |
manz | 3:63aef644e6d2 | 553 | |
manz | 3:63aef644e6d2 | 554 | mode = -1; |
manz | 3:63aef644e6d2 | 555 | } |
manz | 3:63aef644e6d2 | 556 | else if(mode == 2){ |
manz | 3:63aef644e6d2 | 557 | serial.printf("Draw triangle \r\n"); |
manz | 3:63aef644e6d2 | 558 | //save old values and set initial |
manz | 3:63aef644e6d2 | 559 | x_pen_pr = x_pen; |
manz | 3:63aef644e6d2 | 560 | y_pen_pr = y_pen; |
manz | 3:63aef644e6d2 | 561 | x_cent_pr = x_cent; |
manz | 7:1bb3b5b66fe8 | 562 | y_cent_pr = y_cent; |
manz | 7:1bb3b5b66fe8 | 563 | x_taro_pr = x_taro; |
manz | 7:1bb3b5b66fe8 | 564 | y_taro_pr = y_taro; |
manz | 3:63aef644e6d2 | 565 | x_pen = 0; |
manz | 3:63aef644e6d2 | 566 | y_pen = 0; |
manz | 3:63aef644e6d2 | 567 | x_cent = 0; |
manz | 3:63aef644e6d2 | 568 | y_cent = -1; |
manz | 5:1da4d4050306 | 569 | x_taro = 0; |
manz | 5:1da4d4050306 | 570 | y_taro = 0; |
manz | 3:63aef644e6d2 | 571 | |
manz | 3:63aef644e6d2 | 572 | //set values |
manz | 7:1bb3b5b66fe8 | 573 | shape_x[3] = 0; |
manz | 7:1bb3b5b66fe8 | 574 | shape_y[3] = length; |
manz | 7:1bb3b5b66fe8 | 575 | shape_x[2] = width; |
manz | 7:1bb3b5b66fe8 | 576 | shape_y[2] = 0; |
manz | 7:1bb3b5b66fe8 | 577 | shape_x[1] = 0; |
manz | 3:63aef644e6d2 | 578 | shape_y[1] = 0; |
manz | 3:63aef644e6d2 | 579 | shape_x[0] = 0; |
manz | 7:1bb3b5b66fe8 | 580 | shape_y[0] = 0.1; |
manz | 3:63aef644e6d2 | 581 | |
manz | 7:1bb3b5b66fe8 | 582 | shape_count = 4; |
manz | 3:63aef644e6d2 | 583 | mode = 13; |
manz | 3:63aef644e6d2 | 584 | } |
manz | 3:63aef644e6d2 | 585 | else if(mode == 3){ |
manz | 3:63aef644e6d2 | 586 | serial.printf("Reset \r\n"); |
manz | 3:63aef644e6d2 | 587 | //set initial |
manz | 3:63aef644e6d2 | 588 | x_pen = 0; |
manz | 3:63aef644e6d2 | 589 | y_pen = 0; |
manz | 3:63aef644e6d2 | 590 | x_cent = 0; |
manz | 3:63aef644e6d2 | 591 | y_cent = -1; |
manz | 7:1bb3b5b66fe8 | 592 | x_taro = 0; |
manz | 7:1bb3b5b66fe8 | 593 | y_taro = 0; |
manz | 7:1bb3b5b66fe8 | 594 | |
manz | 7:1bb3b5b66fe8 | 595 | one_slot.wait(); |
manz | 7:1bb3b5b66fe8 | 596 | counter = 0; |
manz | 7:1bb3b5b66fe8 | 597 | start = 0; |
manz | 7:1bb3b5b66fe8 | 598 | one_slot.release(); |
manz | 3:63aef644e6d2 | 599 | |
manz | 3:63aef644e6d2 | 600 | mode = -1; |
manz | 3:63aef644e6d2 | 601 | } |
manz | 5:1da4d4050306 | 602 | else if (mode == 7){ |
manz | 5:1da4d4050306 | 603 | if (first == 0){ |
manz | 5:1da4d4050306 | 604 | serial.printf("Draw freely \r\n"); |
manz | 14:82248fb06e53 | 605 | draw_corr = 0.08; |
manz | 5:1da4d4050306 | 606 | } |
manz | 5:1da4d4050306 | 607 | first = 1; |
manz | 3:63aef644e6d2 | 608 | } |
manz | 3:63aef644e6d2 | 609 | else if (mode == 9){ |
manz | 3:63aef644e6d2 | 610 | serial.printf("Draw coordinates \r\n"); |
manz | 12:01250ea24795 | 611 | draw_corr = 1; |
manz | 3:63aef644e6d2 | 612 | mode = -1; |
manz | 3:63aef644e6d2 | 613 | } |
manz | 3:63aef644e6d2 | 614 | |
manz | 3:63aef644e6d2 | 615 | // next coordinate is free drawing or coordinates |
manz | 3:63aef644e6d2 | 616 | if(shape_count == 0){ |
manz | 3:63aef644e6d2 | 617 | one_slot.wait(); |
manz | 3:63aef644e6d2 | 618 | if(counter != start){ |
manz | 3:63aef644e6d2 | 619 | if (start == size){ |
manz | 3:63aef644e6d2 | 620 | start = 0; |
manz | 3:63aef644e6d2 | 621 | } |
manz | 14:82248fb06e53 | 622 | x_tar = (double) path_x[start]; |
manz | 14:82248fb06e53 | 623 | y_tar = (double) path_y[start]; |
manz | 14:82248fb06e53 | 624 | serial.printf("Got data: x = %f, y = %f \r\n",x_tar,y_tar); |
manz | 14:82248fb06e53 | 625 | x_tar = x_tar*draw_corr; |
manz | 14:82248fb06e53 | 626 | y_tar = y_tar*draw_corr; |
manz | 14:82248fb06e53 | 627 | serial.printf("Scaled data: x = %f, y = %f \r\n",x_tar,y_tar); |
manz | 5:1da4d4050306 | 628 | p_mode = path_p[start]; |
manz | 3:63aef644e6d2 | 629 | start++; |
manz | 7:1bb3b5b66fe8 | 630 | if(start == counter){ |
manz | 7:1bb3b5b66fe8 | 631 | mode = -1; |
manz | 7:1bb3b5b66fe8 | 632 | } |
manz | 3:63aef644e6d2 | 633 | newval = 1; |
manz | 0:83acd45a2405 | 634 | } |
manz | 3:63aef644e6d2 | 635 | one_slot.release(); |
manz | 0:83acd45a2405 | 636 | } |
manz | 3:63aef644e6d2 | 637 | // next coordinate is shape |
manz | 3:63aef644e6d2 | 638 | else{ |
manz | 3:63aef644e6d2 | 639 | shape_count = shape_count - 1; |
manz | 7:1bb3b5b66fe8 | 640 | x_tar = shape_x[shape_count]; |
manz | 7:1bb3b5b66fe8 | 641 | y_tar = shape_y[shape_count]; |
manz | 5:1da4d4050306 | 642 | p_mode = 1; |
manz | 3:63aef644e6d2 | 643 | newval = 1; |
manz | 5:1da4d4050306 | 644 | |
manz | 5:1da4d4050306 | 645 | //last move -> unblock input |
manz | 5:1da4d4050306 | 646 | if(shape_count == 0){ |
manz | 7:1bb3b5b66fe8 | 647 | restore = 1; |
manz | 5:1da4d4050306 | 648 | mode = -1; |
manz | 5:1da4d4050306 | 649 | } |
manz | 3:63aef644e6d2 | 650 | } |
manz | 0:83acd45a2405 | 651 | if(newval == 1){ |
manz | 0:83acd45a2405 | 652 | serial.printf("x-coord: %f, y-coord: %f\r\n",x_tar,y_tar); |
manz | 0:83acd45a2405 | 653 | newval = 0; |
manz | 7:1bb3b5b66fe8 | 654 | // same position -> do nothing |
manz | 7:1bb3b5b66fe8 | 655 | if(x_tar == x_pen && y_tar == y_pen){ |
manz | 7:1bb3b5b66fe8 | 656 | |
manz | 5:1da4d4050306 | 657 | } |
manz | 7:1bb3b5b66fe8 | 658 | else{ |
manz | 7:1bb3b5b66fe8 | 659 | //compute angle and turn direction |
manz | 7:1bb3b5b66fe8 | 660 | a2 = (x_pen - x_cent)*(x_pen - x_cent) + (y_pen - y_cent)*(y_pen - y_cent); |
manz | 7:1bb3b5b66fe8 | 661 | b2 = (x_tar - x_pen)*(x_tar - x_pen) + (y_tar - y_pen)*(y_tar - y_pen); |
manz | 7:1bb3b5b66fe8 | 662 | c2 = (x_tar - x_cent)*(x_tar - x_cent) + (y_tar - y_cent)*(y_tar - y_cent); |
manz | 7:1bb3b5b66fe8 | 663 | cosg = (a2 + b2 - c2)/(2*sqrt(a2*b2)); |
manz | 7:1bb3b5b66fe8 | 664 | gamma = acos(cosg)/3.14159*180; |
manz | 7:1bb3b5b66fe8 | 665 | |
manz | 7:1bb3b5b66fe8 | 666 | dot = (x_tar - x_cent)*(y_pen - y_cent) - (y_tar - y_cent)*(x_pen - x_cent); |
manz | 7:1bb3b5b66fe8 | 667 | |
manz | 7:1bb3b5b66fe8 | 668 | //serial.printf("Angle: %f \r\n",gamma); |
manz | 7:1bb3b5b66fe8 | 669 | angle = ceil(180 - gamma); |
manz | 7:1bb3b5b66fe8 | 670 | serial.printf("Turning angle: %i \r\n",angle); |
manz | 7:1bb3b5b66fe8 | 671 | |
manz | 7:1bb3b5b66fe8 | 672 | //put pen down |
manz | 7:1bb3b5b66fe8 | 673 | if (p_mode == 1){ |
manz | 7:1bb3b5b66fe8 | 674 | serial.printf("-- Pen Down\r\n"); |
manz | 9:946d400b2f13 | 675 | L.servo(30); |
manz | 0:83acd45a2405 | 676 | } |
manz | 7:1bb3b5b66fe8 | 677 | //put pen up |
manz | 7:1bb3b5b66fe8 | 678 | else if (p_mode == 0){ |
manz | 9:946d400b2f13 | 679 | L.servo(45); |
manz | 7:1bb3b5b66fe8 | 680 | serial.printf("-- Pen Up\r\n"); |
manz | 7:1bb3b5b66fe8 | 681 | } |
manz | 7:1bb3b5b66fe8 | 682 | |
manz | 7:1bb3b5b66fe8 | 683 | currentAngle = L.getAngle(); |
manz | 7:1bb3b5b66fe8 | 684 | if(dot > 0){ |
manz | 7:1bb3b5b66fe8 | 685 | //serial.printf("Turn right \r\n"); |
manz | 7:1bb3b5b66fe8 | 686 | targetAngle = fmod(currentAngle+angle,360); |
manz | 7:1bb3b5b66fe8 | 687 | |
manz | 7:1bb3b5b66fe8 | 688 | servo_right(); |
manz | 12:01250ea24795 | 689 | while(fmod(abs(L.getAngle() - targetAngle),360)> 5); |
manz | 7:1bb3b5b66fe8 | 690 | servo_stop(); |
manz | 0:83acd45a2405 | 691 | } |
manz | 7:1bb3b5b66fe8 | 692 | else if(dot < 0){ |
manz | 7:1bb3b5b66fe8 | 693 | //serial.printf("Turn left \r\n"); |
manz | 7:1bb3b5b66fe8 | 694 | targetAngle = fmod(currentAngle-angle,360); |
manz | 7:1bb3b5b66fe8 | 695 | servo_left(); |
manz | 12:01250ea24795 | 696 | while(fmod(abs(L.getAngle() - targetAngle),360)> 5); |
manz | 7:1bb3b5b66fe8 | 697 | servo_stop(); |
manz | 7:1bb3b5b66fe8 | 698 | } |
manz | 7:1bb3b5b66fe8 | 699 | //compute length of path til target |
manz | 7:1bb3b5b66fe8 | 700 | distance = sqrt((x_tar - x_pen)*(x_tar - x_pen) + (y_tar - y_pen)*(y_tar - y_pen)); |
manz | 7:1bb3b5b66fe8 | 701 | |
manz | 14:82248fb06e53 | 702 | //forward SCRIBE til target |
manz | 9:946d400b2f13 | 703 | int counter_m = (int) rint(distance); |
manz | 9:946d400b2f13 | 704 | |
manz | 14:82248fb06e53 | 705 | // do adjustment when going down |
manz | 14:82248fb06e53 | 706 | if (L.getAngle() > 330 || L.getAngle() < 30){ |
manz | 14:82248fb06e53 | 707 | counter_m = counter_m + 2; |
manz | 14:82248fb06e53 | 708 | } |
manz | 14:82248fb06e53 | 709 | if (L.getAngle() > 130 || L.getAngle() < 230){ |
manz | 14:82248fb06e53 | 710 | counter_m = counter_m - 2; |
manz | 14:82248fb06e53 | 711 | } |
manz | 14:82248fb06e53 | 712 | serial.printf("*** Distance to be taken: %d\r\n",counter_m); |
manz | 14:82248fb06e53 | 713 | |
manz | 9:946d400b2f13 | 714 | // find position of wheels |
manz | 9:946d400b2f13 | 715 | for (int i = 0; i < 100; i++){ |
manz | 9:946d400b2f13 | 716 | sum_r += ain1.read(); |
manz | 9:946d400b2f13 | 717 | sum_l += ain2.read(); |
manz | 9:946d400b2f13 | 718 | } |
manz | 9:946d400b2f13 | 719 | value_r = sum_r/100; |
manz | 9:946d400b2f13 | 720 | value_l = sum_l/100; |
manz | 9:946d400b2f13 | 721 | |
manz | 9:946d400b2f13 | 722 | if(value_r < 0.93){ |
manz | 9:946d400b2f13 | 723 | on_r = 0; |
manz | 9:946d400b2f13 | 724 | } |
manz | 9:946d400b2f13 | 725 | else{ |
manz | 9:946d400b2f13 | 726 | on_r = 1; |
manz | 9:946d400b2f13 | 727 | } |
manz | 14:82248fb06e53 | 728 | if(value_l < 0.925){ |
manz | 9:946d400b2f13 | 729 | on_l = 0; |
manz | 9:946d400b2f13 | 730 | } |
manz | 9:946d400b2f13 | 731 | else{ |
manz | 9:946d400b2f13 | 732 | on_l = 1; |
manz | 9:946d400b2f13 | 733 | } |
manz | 9:946d400b2f13 | 734 | serial.printf("Initially: left: %d, right: %d\r\n",on_l,on_r); |
manz | 12:01250ea24795 | 735 | angle_init = L.getAngle(); |
manz | 7:1bb3b5b66fe8 | 736 | servo_f(); |
manz | 12:01250ea24795 | 737 | serial.printf("Initial Angle: %f\r\n",angle_init); |
manz | 9:946d400b2f13 | 738 | //start decrement counter |
manz | 9:946d400b2f13 | 739 | counter_r = counter_m; |
manz | 9:946d400b2f13 | 740 | counter_l = counter_m; |
manz | 9:946d400b2f13 | 741 | while (counter_m > 0){ |
manz | 9:946d400b2f13 | 742 | sum_r = 0; |
manz | 9:946d400b2f13 | 743 | sum_l = 0; |
manz | 14:82248fb06e53 | 744 | for (int i = 0; i < 5; i++){ |
manz | 9:946d400b2f13 | 745 | sum_r += ain1.read(); |
manz | 9:946d400b2f13 | 746 | sum_l += ain2.read(); |
manz | 9:946d400b2f13 | 747 | } |
manz | 14:82248fb06e53 | 748 | value_r = sum_r/5; |
manz | 14:82248fb06e53 | 749 | value_l = sum_l/5; |
manz | 14:82248fb06e53 | 750 | printf("Left Value: %f\r\n",value_l); |
manz | 14:82248fb06e53 | 751 | printf("Right Value: %f\r\n",value_r); |
manz | 14:82248fb06e53 | 752 | if(value_r < 0.84 && on_r == 1){ |
manz | 12:01250ea24795 | 753 | //printf("Value right: %f\r\n",value_r); |
manz | 9:946d400b2f13 | 754 | on_r = 0; |
manz | 9:946d400b2f13 | 755 | } |
manz | 14:82248fb06e53 | 756 | else if (value_r > 0.88 && on_r == 0){ |
manz | 12:01250ea24795 | 757 | //printf("Value right: %f\r\n",value_r); |
manz | 9:946d400b2f13 | 758 | on_r = 1; |
manz | 9:946d400b2f13 | 759 | counter_r--; |
manz | 14:82248fb06e53 | 760 | printf("*** Right Counter is: %d\r\n",counter_r); |
manz | 9:946d400b2f13 | 761 | } |
manz | 14:82248fb06e53 | 762 | if(value_l < 0.9 && on_l == 1){ |
manz | 12:01250ea24795 | 763 | //printf("Value left: %f\r\n",value_l); |
manz | 9:946d400b2f13 | 764 | on_l = 0; |
manz | 9:946d400b2f13 | 765 | } |
manz | 14:82248fb06e53 | 766 | else if (value_l > 0.92 && on_l == 0){ |
manz | 12:01250ea24795 | 767 | //printf("Value left: %f\r\n",value_l); |
manz | 9:946d400b2f13 | 768 | on_l = 1; |
manz | 9:946d400b2f13 | 769 | counter_l--; |
manz | 14:82248fb06e53 | 770 | printf("*** Left Counter is: %d\r\n",counter_l); |
manz | 9:946d400b2f13 | 771 | } |
manz | 9:946d400b2f13 | 772 | |
manz | 9:946d400b2f13 | 773 | if(counter_l >= counter_r){ |
manz | 9:946d400b2f13 | 774 | counter_m = counter_r; |
manz | 9:946d400b2f13 | 775 | } |
manz | 9:946d400b2f13 | 776 | else{ |
manz | 9:946d400b2f13 | 777 | counter_m = counter_l; |
manz | 9:946d400b2f13 | 778 | } |
manz | 12:01250ea24795 | 779 | //deviation left from path |
manz | 14:82248fb06e53 | 780 | if(angle_init > 270 || angle_init < 90){ |
manz | 14:82248fb06e53 | 781 | if((L.getAngle() - angle_init > 2 && L.getAngle() - angle_init < 10) || (angle_init > 358 && L.getAngle() < 5 && (L.getAngle() + 360 - angle_init) > 2)){ |
manz | 14:82248fb06e53 | 782 | servo_slowleft(); |
manz | 14:82248fb06e53 | 783 | serial.printf("Left: Angle Difference: %f\r\n",L.getAngle() - angle_init); |
manz | 14:82248fb06e53 | 784 | serial.printf("Left: Init: %f, Current: %f\r\n",angle_init,L.getAngle()); |
manz | 14:82248fb06e53 | 785 | while(fmod(abs(L.getAngle() - angle_init),360)> 1); |
manz | 14:82248fb06e53 | 786 | servo_f(); |
manz | 14:82248fb06e53 | 787 | } |
manz | 14:82248fb06e53 | 788 | //deviation right from path |
manz | 14:82248fb06e53 | 789 | if(angle_init - L.getAngle() > 2 || (L.getAngle() > 358 && angle_init < 5 && (angle_init + 360 - L.getAngle()) > 2)){ |
manz | 14:82248fb06e53 | 790 | servo_slowright(); |
manz | 14:82248fb06e53 | 791 | while(fmod(abs(L.getAngle() - angle_init),360)> 1); |
manz | 14:82248fb06e53 | 792 | servo_f(); |
manz | 14:82248fb06e53 | 793 | } |
manz | 12:01250ea24795 | 794 | } |
manz | 12:01250ea24795 | 795 | //printf("*** Distance to take is: %d\r\n",counter_m); |
manz | 9:946d400b2f13 | 796 | } |
manz | 9:946d400b2f13 | 797 | //servo_f(); |
manz | 9:946d400b2f13 | 798 | //wait(distance*time_factor); |
manz | 7:1bb3b5b66fe8 | 799 | servo_stop(); |
manz | 7:1bb3b5b66fe8 | 800 | //serial.printf("Reached destination \r\n"); |
manz | 7:1bb3b5b66fe8 | 801 | //update pen and center when at target |
manz | 7:1bb3b5b66fe8 | 802 | if(restore == 1){ |
manz | 7:1bb3b5b66fe8 | 803 | serial.printf("Restore previous positions \r\n"); |
manz | 7:1bb3b5b66fe8 | 804 | x_pen = x_pen_pr; |
manz | 7:1bb3b5b66fe8 | 805 | y_pen = y_pen_pr; |
manz | 7:1bb3b5b66fe8 | 806 | x_cent = x_cent_pr; |
manz | 7:1bb3b5b66fe8 | 807 | y_cent = y_cent_pr; |
manz | 7:1bb3b5b66fe8 | 808 | x_taro = x_taro_pr; |
manz | 7:1bb3b5b66fe8 | 809 | y_taro = y_taro_pr; |
manz | 7:1bb3b5b66fe8 | 810 | restore = 0; |
manz | 7:1bb3b5b66fe8 | 811 | } |
manz | 7:1bb3b5b66fe8 | 812 | else{ |
manz | 7:1bb3b5b66fe8 | 813 | x_pen = x_tar; |
manz | 7:1bb3b5b66fe8 | 814 | y_pen = y_tar; |
manz | 7:1bb3b5b66fe8 | 815 | x_cent = x_taro; |
manz | 7:1bb3b5b66fe8 | 816 | y_cent = y_taro; |
manz | 7:1bb3b5b66fe8 | 817 | x_taro = x_tar; |
manz | 7:1bb3b5b66fe8 | 818 | y_taro = y_tar; |
manz | 7:1bb3b5b66fe8 | 819 | } |
manz | 7:1bb3b5b66fe8 | 820 | } |
manz | 0:83acd45a2405 | 821 | serial.printf("Update Pen: %f, %f \r\n",x_pen,y_pen); |
manz | 7:1bb3b5b66fe8 | 822 | serial.printf("Update Center: %f, %f \r\n",x_cent,y_cent); |
manz | 5:1da4d4050306 | 823 | } |
manz | 0:83acd45a2405 | 824 | } |
manz | 0:83acd45a2405 | 825 | } |
manz | 0:83acd45a2405 | 826 | |
manz | 5:1da4d4050306 | 827 | |
manz | 5:1da4d4050306 | 828 | |
manz | 0:83acd45a2405 | 829 | int main() |
manz | 7:1bb3b5b66fe8 | 830 | { |
manz | 7:1bb3b5b66fe8 | 831 | L.reset(); |
manz | 14:82248fb06e53 | 832 | servo_reset(); |
manz | 14:82248fb06e53 | 833 | servo_stop(); |
manz | 14:82248fb06e53 | 834 | serial.printf("Starting Calibration\r\n"); |
manz | 14:82248fb06e53 | 835 | back_to_zero(); |
manz | 14:82248fb06e53 | 836 | |
manz | 14:82248fb06e53 | 837 | serial.printf("Starting IR-Localization\r\n"); |
manz | 14:82248fb06e53 | 838 | //ir_localization(); |
manz | 14:82248fb06e53 | 839 | Thread ir(ir_localization); |
manz | 14:82248fb06e53 | 840 | ir_id = ir.gettid(); |
manz | 14:82248fb06e53 | 841 | |
manz | 14:82248fb06e53 | 842 | while(ir_finish == 0){ |
manz | 14:82248fb06e53 | 843 | Thread::wait(10); |
manz | 14:82248fb06e53 | 844 | } |
manz | 7:1bb3b5b66fe8 | 845 | serial.printf("Starting the threads\r\n"); |
manz | 0:83acd45a2405 | 846 | |
manz | 0:83acd45a2405 | 847 | Thread bluetooth(bluetooth_thread); |
manz | 0:83acd45a2405 | 848 | Thread move(move_thread); |
manz | 5:1da4d4050306 | 849 | mover_id = move.gettid(); |
manz | 5:1da4d4050306 | 850 | bluetooth_id = bluetooth.gettid(); |
manz | 0:83acd45a2405 | 851 | |
manz | 5:1da4d4050306 | 852 | while(1){ |
manz | 7:1bb3b5b66fe8 | 853 | Thread::wait(3); |
manz | 5:1da4d4050306 | 854 | if(which_thread == 0) bluetooth.signal_set(0x1); |
manz | 5:1da4d4050306 | 855 | else move.signal_set(0x1); |
manz | 5:1da4d4050306 | 856 | } |
manz | 0:83acd45a2405 | 857 | } |