
Team Design project 3 main file
Dependencies: LocalPositionSystem MMA8451Q Motor_Driver Sensors mbed
Fork of TDP_main by
main.cpp
- Committer:
- Reckstyle
- Date:
- 2015-03-26
- Revision:
- 37:3d14df6dec34
- Parent:
- 36:a48d57d63630
File content as of revision 37:3d14df6dec34:
/* ****** MAIN PROGRAM ****** Please consider that although it is an embedded envrionment we are NOT creating a HARD-TIME real time system - delays can be dealt with Sensors are mapped on the global variable sensorsCheckSum, which multiplies the sensor number by itself to then decode, which sensors are off and which are on ie. if sensor rightright - sensorChecksum = 1*1 = 1 if rightright and rightcentre - sensorChecksum = 1*1 + 2*2 = 5 ... */ #include "mbed.h" #include "sensor_measure.h" #include "Motor_Driver.h" #include "shooter.h" #define PWM_PERIOD_US 10000 typedef enum mode {REGULAR,SQUARE} mode; //enumeration for different states DigitalOut led(LED_RED); DigitalOut ledMode(LED_GREEN); Serial HC06(PTE0,PTE1); void turnLeft (); void turnRight (); void measureSensors (); void printBluetooth(); void shootFind (); Timer measureTimer; //Timer used for measurement Motor_Driver motors(PTA5, PTC9, PTC8,PTD4, PTA12, PTA4, PWM_PERIOD_US); //motors object mode driveMode; //declaring the variable for the states int sensorsCheckSum; //varibale used for sensors mapping access int passedTime1,passedTime2; int oldValues[5] = {0}; int cursor = 0, k = 0; static float normalSpeed = 0.15f; int countRightTurns = 0; int countLeftTurns = 0; int main() { //setup_counter(1000, 0); // float frequency = measure_frequency(CHANNEL_1); led = 1;//start LED with beginning of main program measureTimer.start(); driveMode = REGULAR; //initialise drivemoder sensor_initialise(); // initialise sensor values wait(1); //give time to set up the system sensorTimer.start(); // start timer for sensors squareOut.period(0.01f); // 0.01 second period squareOut.write(0.5); // 50% duty cycle // for (int b = 1; b <7;b++) { // shoot(0.4); // } shoot (0); // motors.setSteeringMode (NORMAL); // motors.disableHardBraking(); // motors.forward (); // // motors.start (); // // motors.setSpeed (normalSpeed); //motors.enableSlew(); // HC06.printf("heello"); int testOtherCases = 0; //used for control while(1){ // printBluetooth(); // while (HC06.getc() != 'r') { // measureSensors(); // printBluetooth(); // wait(1); // } measureSensors(); printBluetooth(); switch (sensorsCheckSum) { case 94: motors.setSpeed (normalSpeed); wait(0.15); break; case 104: if ( countRightTurns == 1) turnRight(); else { motors.setSpeed (normalSpeed); wait(0.15); measureSensors(); if (sensorsCheckSum == 104) { //confirm the turn wait(0.15); measureSensors(); if (sensorsCheckSum == 104) turnRight (); } } break; case 158: motors.setSpeed (normalSpeed); wait(0.15); measureSensors(); if (sensorsCheckSum == 194 || sensorsCheckSum == 158) { //confirm the turn turnLeft(); } break; case 168: if ( countRightTurns == 1) turnRight(); else { motors.setSpeed (normalSpeed); wait(0.15); measureSensors(); if (sensorsCheckSum == 168) { //confirm the turn wait(0.15); measureSensors(); if (sensorsCheckSum == 168) turnRight (); } } break; case 194: motors.setSpeed (normalSpeed); wait(0.15); measureSensors(); if (sensorsCheckSum == 194) { //confirm the turn turnLeft(); } break; default: testOtherCases =1; break; } if (testOtherCases == 1) { if (sensorsCheckSum < 96) { motors.setSpeed (0.0); motors.setLeftSpeed(normalSpeed); wait(0.075); } else if (sensorsCheckSum > 96) { motors.setSpeed (0.0); motors.setRightSpeed(normalSpeed); wait(0.1); } } motors.setSpeed(0.0); wait(0.2); } } //int main void printBluetooth() { //for debugging HC06.printf("LLU%i LRU%i rlu%i rru%i\n",sensorArray[7]->state,sensorArray[6]->state,sensorArray[1]->state,sensorArray[0]->state); HC06.printf("LLD%i LRD%i rld%i rrd%i\n\n",sensorArray[5]->state,sensorArray[4]->state,sensorArray[3]->state,sensorArray[2]->state); //HC06.printf("%i %i %i \n",sensorArray[8]->state,sensorArray[9]->state,sensorArray[3]->state,sensorArray[10]->state); //HC06.printf("%i %i/n%i %i,sensorArray[NUMBER_SENSORS_REGULAR]->state,sensorArray[NUMBER_SENSORS_REGULAR+1]->state,sensorArray[NUMBER_SENSORS_REGULAR+2]->state,sensorArray[NUMBER_SENSORS_REGULAR+3]->state); //HC06.printf("%f %f",motor.getLeftSpeed(),motor.getRightSpeed()); HC06.printf("sensorCheckSum%i\n\n",sensorsCheckSum); //HC06.printf("passedTime1 %i passedTime2 \n\n",passedTime1,passedTime2); } void turnRight () { ledMode = 0; // put on LED to know we're in this state if (countRightTurns == 0 ) { motors.setSpeed (normalSpeed); //go a bit to the front to compensate for sensors arms wait(1); motors.setSteeringMode(PIVOT_CCW); motors.setSpeed (normalSpeed); //turn only the relevant wheel wait (1); } else { motors.setSpeed (normalSpeed); //go a bit to the front to compensate for sensors arms wait(1); motors.setSteeringMode(PIVOT_CCW); motors.setSpeed (normalSpeed); //turn only the relevant wheel wait (0.8); } int exit = 0; //used for exiting the function motors.setSpeed(0.0); wait(0.5); motors.setSteeringMode (NORMAL); wait(0.3); while (1) { motors.setSpeed(0.0); //stop and check if the line is reached exit = 0; wait (0.4); for (int i = 4; i < NUMBER_SENSORS_REGULAR; i++) { if (measure(sensorArray[i]) == 0) {//if sensor is black exit ++; } if (exit > 2){ // two sensors are considered on line motors.setSteeringMode(PIVOT_CCW); motors.setSpeed(normalSpeed); wait (0.3); motors.setSpeed(0.0); motors.setSteeringMode(NORMAL); while (1) { int checkSumLocal =0; for (int i = 4; i < NUMBER_SENSORS_REGULAR; i++) { if (measure(sensorArray[i]) == 0) checkSumLocal += i*i; } printBluetooth(); if (checkSumLocal == 74) { led = 0; ledMode = 1; // turn off the LED countRightTurns ++; wait(1); return; } if (checkSumLocal == 64 || checkSumLocal ==36 || checkSumLocal ==100 || checkSumLocal == 125 || checkSumLocal == 149) { motors.setSteeringMode(PIVOT_CCW); motors.setSpeed(normalSpeed); wait (0.6); motors.setSpeed(0.0); motors.setSteeringMode(NORMAL); } else if (checkSumLocal < 74) { motors.setSpeed (0.0); motors.setRightSpeed(normalSpeed); wait(0.2); } else if (checkSumLocal > 74) { motors.setSpeed (0.0); motors.setLeftSpeed(normalSpeed); wait(0.2); } motors.setSpeed(0.0); wait(0.4); } } } // motors.setSpeed(normalSpeed); motors.setRightSpeed (normalSpeed*1.7); motors.setLeftSpeed (normalSpeed); wait(0.2); } } void turnLeft () { ledMode = 0; // put on LED to know we're in this state motors.setSpeed (normalSpeed); //go a bit to the front to compensate for sensors arms wait(1.1); motors.setSteeringMode(PIVOT_CW); motors.setSpeed (normalSpeed); //turn only the relevant wheel wait (1); int exit = 0; //used for exiting the function motors.setSpeed(0.0); wait(0.5); motors.setSteeringMode (NORMAL); wait(0.3); while (1) { motors.setSpeed(0.0); //stop and check if the line is reached exit = 0; wait (0.4); for (int i = 0; i < 4; i++) { if (measure(sensorArray[i]) == 0) {//if sensor is black exit ++; } if (exit > 2){ // two sensors are considered on line motors.setSteeringMode(PIVOT_CW); motors.setSpeed(normalSpeed); wait (0.3); motors.setSpeed(0.0); motors.setSteeringMode(NORMAL); while (1) { int checkSumLocal =0; for (int i = 0; i < 4; i++) { if (measure(sensorArray[i]) == 1) checkSumLocal += (i+1)*(i+1); } HC06.printf ("checkSumLocal is %i \n", checkSumLocal); if (checkSumLocal == 20) { led = 0; ledMode = 1; // turn off the LED countLeftTurns ++; wait(1); if (countLeftTurns == 1) { //shootFind (); } return; } if (checkSumLocal == 64 || checkSumLocal ==36 || checkSumLocal ==100 || checkSumLocal == 125 || checkSumLocal == 149) { motors.setSteeringMode(PIVOT_CCW); motors.setSpeed(normalSpeed); wait (0.6); motors.setSpeed(0.0); motors.setSteeringMode(NORMAL); } else if (checkSumLocal > 20) { motors.setSpeed (0.0); motors.setRightSpeed(normalSpeed); wait(0.2); } else if (checkSumLocal < 20) { motors.setSpeed (0.0); motors.setLeftSpeed(normalSpeed); wait(0.2); } motors.setSpeed(0.0); wait(0.4); } } } // motors.setSpeed(normalSpeed); motors.setRightSpeed (normalSpeed); motors.setLeftSpeed (normalSpeed*1.5); wait(0.2); } } void shootFind () { motors.setSpeed(normalSpeed); wait (1); motors.setSteeringMode (PIVOT_CW); wait (0.8); motors.setSteeringMode (NORMAL); while (1) { motors.setSpeed(0.0); wait (0.3); for (int i = 8; i < 11 ; i++) { if (measure(sensorArray[i]) == 2){ motors.setSteeringMode (PIVOT_CW); motors.setSpeed(normalSpeed); wait (1.6); motors.setSpeed(normalSpeed); for (int b = 1; b <7;b++) { shoot(0.1*(float)b); } shoot (0); motors.setSteeringMode(NORMAL); // while (1) { // motors.setSpeed(0.0); // wait (0.4); // for (int c =4 ;c <8;c++) { // if( measure(sensorArray[i]) == 0){ // return; // } // } // motors.setSpeed(normalSpeed); // motors.setLeftSpeed(normalSpeed*1.3); // wait(0.2); // } return; } } motors.setSpeed (normalSpeed); wait (0.5); } } void measureSensors () { sensorsCheckSum = 0; //zero it when first going into the routine int iterationNumber = NUMBER_SENSORS_REGULAR; if (driveMode == SQUARE) { iterationNumber += NUMBER_SENSORS_SQUARE; } for (int i = 0; i < iterationNumber;i++){ //pc.printf("%i iteration%i ",i,iterationNumber); if (measure(sensorArray[i]) == 1) {//if sensor is white sensorsCheckSum += (i+1)*(i+1); } } if (oldValues[cursor] != sensorsCheckSum) { //why only if different ?? oldValues[cursor] = sensorsCheckSum; cursor = (cursor+1)%5; } //pc.printf("sensorsCheckSum is %i",sensorsCheckSum); }