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.
Fork of Joystick_skeleton by
Revision 5:8b41e2fc69f9, committed 2017-04-26
- Comitter:
- britneyd
- Date:
- Wed Apr 26 21:00:09 2017 +0000
- Parent:
- 4:aaca0f94b646
- Commit message:
- Controller code;
Changed in this revision
Joystick.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r aaca0f94b646 -r 8b41e2fc69f9 Joystick.cpp --- a/Joystick.cpp Tue Oct 25 15:09:06 2016 +0000 +++ b/Joystick.cpp Wed Apr 26 21:00:09 2017 +0000 @@ -13,8 +13,8 @@ //(1)Set Raw Center Values, this is where the joystick sits naturaly //set raw horizontal center to current value (average with 5 readings) //set raw vertial center to current value (average with 5 readings) - raw_hc = 0; - raw_vc = 0; + raw_hc = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; + raw_vc = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; //(2)Initalize the Rax Max to some value less then the real max value. //We dont know what the max value will be until we read it, thats ok. @@ -22,76 +22,105 @@ //set it to that for now. We will update this later if we see a larger value //Now do the same for the the Raw Min float delta = 0.3; - rawMinH = 0; - rawMaxH = 0; - rawMinV = 0; - rawMaxV = 0; + rawMinH = raw_hc - delta; + rawMaxH = raw_hc + delta; + rawMinV = raw_vc - delta; + rawMaxV = raw_vc + delta; } //Returns the scaled vertial value of joystick float Joystick::horizontal(void) { //(3)Get average val (5 samples) - float avg = horiz.read(); + float avg = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0 ; //(4)Watch for Max and Min Values, if we see a new max/min update Raw Max/Min - rawMaxH = avg; - rawMinH = avg; + if (avg > rawMaxH) { + rawMaxH = avg; + } + if (avg < rawMinH) { + rawMinH = avg; + } //(5)Here we will calculate the total range (Travel) of the joystick //using the rawMax/rawMin values we have seen thus far //Since the joystick is not symetrical we have to calculate two ranges //Calculate the range from [center, max] and [center, min] - float range_pos = 0; - float range_neg = 0; + float range_pos = rawMaxH - raw_hc; + float range_neg = raw_hc - rawMinH; //(6)Here we will calculate how much our current reading is in one //of the ranges, this will give us a percentage of our _max value we //set in setScale. Then we can apply the scale by multiplying it by our //scale (_max/_min). float val; - if(avg >= raw_hc) //Positive Range - val = 0; - else //Negative Range - val = 0; + if(avg >= raw_hc) { //Positive Range + val = ((avg - raw_hc) / range_pos) * _max; + } + else{ //Negative Range + val = (raw_hc - avg) / range_neg * _min; + } //(7)Here we will apply a dead zone. If the |value| is <= our deadzone then //set it to 0. Otherwise we need to shift the value closer to 0 by dead zone - + if (abs(val) <= DEAD_ZONE) { + val = 0; + } + else if (val > DEAD_ZONE) { + val -= DEAD_ZONE; + } + else if (val < -DEAD_ZONE) { + val += DEAD_ZONE; + } - return horiz.read(); + return val; } //(8) Impliment vertial the same as you did for horizontal //Returns the scaled horizontal value of joystick float Joystick::vertical(void) { //Get average value (5 samples) - float avg = vert.read(); + float avg = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; //(4)Watch for Max and Min Values, if we see a new max/min update Raw Max/Min - rawMaxV = avg; - rawMinV = avg; + if (avg > rawMaxV) { + rawMaxV = avg; + } + if (avg < rawMinV) { + rawMinV = avg; + } //(5)Here we will calculate the total range (Travel) of the joystick //using the rawMax/rawMin values we have seen thus far //Since the joystick is not symetrical we have to calculate two ranges //Calculate the range from [center, max] and [center, min] - float range_pos = 0; - float range_neg = 0; + float range_pos = rawMaxV - raw_vc; + float range_neg = raw_vc - rawMinV; //(6)Here we will calculate how much our current reading is in one //of the ranges, this will give us a percentage of our _max value we //set in setScale. Then we can apply the scale by multiplying it by our //scale (_max/_min). float val; - if(avg >= raw_vc) //find scaled pot value - val = 0; - else - val = 0; + if(avg >= raw_vc) { //Positive Range + val = ((avg - raw_vc) / range_pos) * _max; + } + else{ //Negative Range + val = (raw_vc - avg) / range_neg * _min; + } //(7)Here we will apply a dead zone. If the |value| is <= our deadzone then //set it to 0. Otherwise we need to shift the value closer to 0 by dead zone - - return vert.read(); + if (abs(val) <= DEAD_ZONE) { + val = 0; + } + else if (val > DEAD_ZONE) { + val -= DEAD_ZONE; + } + else if (val < -DEAD_ZONE) { + val += DEAD_ZONE; + } + + return val; } //Set the Min and Max Values of joystick ex: -100, +100