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: camera mbed tsi_sensor
Fork of Car2 by
Revision 26:4afa8c5c5156, committed 2017-04-20
- Comitter:
- lmstthomas
- Date:
- Thu Apr 20 19:32:16 2017 +0000
- Parent:
- 25:74c12b0acf0c
- Commit message:
- final commit????;
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Apr 18 17:50:55 2017 +0000
+++ b/main.cpp Thu Apr 20 19:32:16 2017 +0000
@@ -6,8 +6,8 @@
#define FULLLEFT 0.0005
#define MIN_TURN_RATIO 0
#define MAX_TURN_RATIO 1
-#define MIN_SPEED 0.13 //.15 seems to be optimal
-#define MAX_SPEED 0.4 //.5
+#define MIN_SPEED 0.13
+#define MAX_SPEED 0.4
#define SPEED_TRIAL_MIN 0.25
#define SPEED_TRIAL_MAX 0.55
#define TURN_TIME 0
@@ -16,6 +16,7 @@
#define DEFAULT_THRESHOLD 65
#define BLIND_LENGTH 30
#define DIFF_RATIO 0.5
+#define FINISH_RANGE 30
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
#define ELEC0 9
@@ -44,15 +45,19 @@
int leftBlind = 0;
int rightBlind = 0;
float lastSlide;
+int positionSum = 0;
int numDarks = 0;
int minLightGap = 1;
int maxLightGap = 55;
int minDarkBlock = 4;
int maxDarkBlock = 40;
+float averagePos = 0;
int positionOffThreshold = 3;
struct darkBlock *darkBlockHead;
+int noBlocks;
PwmOut led(LED_GREEN);
PwmOut redLed(LED_RED);
+bool finished = false;
/*
Function: setAccel
@@ -80,15 +85,7 @@
by the camera
*/
void turnWheels(int frame[]){
- int positionSum = 0;
- numDarks = 0;
- for(int i = 0; i < 128; i++){
- if(frame[i] < threshold){
- positionSum += i;
- numDarks++;
- }
- }
- float averagePos = 0;
+ averagePos = 0;
if (numDarks == 0) {
if(turnCounter >= (STRAIGHT_TIME)){
@@ -124,6 +121,9 @@
servo.pulsewidth(wheelPos);
}
+/*
+ deprecated
+*/
struct darkBlock{
int position;
int length;
@@ -136,31 +136,49 @@
Function: detectStartFinish
Description: detects the mark on the track that represents the start/finish line and toggles RUNNING
*/
-void detectStartFinish(int frame[]){
-
+void detectStartFinish(){
+
//idle override by touching the slider
if(tsi.readPercentage() != lastSlide){
idle = !idle;
- led = 0.0;
+ led = 1.0 - led;
turn_speed = MIN_SPEED + (SPEED_TRIAL_MIN - MIN_SPEED) * tsi.readPercentage();
straight_speed = MAX_SPEED + (SPEED_TRIAL_MAX - MAX_SPEED) * tsi.readPercentage();
wait(0.5);
-
- }
- return;
- if(numDarks <= 15) return;
- for(int i = 0; i < 128; i++){
-
}
- idle = !idle; //toggle idle
- if(!idle){
- led = 1.0 - led;
- servo.pulsewidth(STRAIGHT);
- wait(3);
+ if(numDarks > 18 && averagePos > 63 - FINISH_RANGE && averagePos < 63 + FINISH_RANGE && noBlocks <= 2 && (!finished || !idle)){
+ led = 1.0 - led;
+ idle = !idle; //toggle idle
+ if(!idle){
+ servo.pulsewidth(STRAIGHT);
+ wait(2);
+ }
+ else finished = true;
+ }
+}
+/*
+ Function: processInput
+ Description: This function processes the input gathered from the camera, and calculates variables used by other parts of the car
+
+*/
+void processInput(int frame[]){
+ positionSum = 0;
+ numDarks = 0;
+ bool flag = true;
+ noBlocks = 0;
+ for(int i = 0; i < 128; i++){
+ if(frame[i] < threshold){
+ positionSum += i;
+ numDarks++;
+ if(flag) {
+ flag = false;
+ noBlocks++;
+ }
}
- else led = 1.0;
-}
+ else flag = true;
+ }
+ }
/*
Function: display
@@ -181,7 +199,7 @@
pc.printf("%c", draw);
draw = 'x';
}
- pc.printf("\r");
+ pc.printf(" darks %d av %d blocks %d\r", numDarks, averagePos, noBlocks);
}
/*
@@ -215,9 +233,10 @@
while(1){
wait_ms(1);
cam.capture();
- //display(cam.imageData);
+ processInput(cam.imageData);
+ detectStartFinish();
turnWheels(cam.imageData);
+ //display(cam.imageData);
setAccel(wheelPos);
- detectStartFinish(cam.imageData);
}
}
\ No newline at end of file
