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
Joystick.cpp@1:c42a77267f7b, 2016-10-20 (annotated)
- Committer:
- csharer
- Date:
- Thu Oct 20 22:16:14 2016 +0000
- Revision:
- 1:c42a77267f7b
- Parent:
- 0:46523bf02e61
- Child:
- 2:893fd930d3fb
added comments ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
csharer | 1:c42a77267f7b | 1 | //Joystick (FULL IMPLIMENTATION) |
csharer | 1:c42a77267f7b | 2 | //Author: Carter Sharer |
csharer | 1:c42a77267f7b | 3 | //Date: 10/18/16 |
csharer | 1:c42a77267f7b | 4 | |
csharer | 0:46523bf02e61 | 5 | #include "Joystick.h" |
csharer | 0:46523bf02e61 | 6 | #include "mbed.h" |
csharer | 0:46523bf02e61 | 7 | |
csharer | 0:46523bf02e61 | 8 | //Member function definitions including constructor |
csharer | 0:46523bf02e61 | 9 | Joystick::Joystick(PinName pinA, PinName pinB) : horiz(pinA), vert(pinB) { |
csharer | 0:46523bf02e61 | 10 | //Wait 1 second for voltage to settle |
csharer | 0:46523bf02e61 | 11 | wait(1); |
csharer | 0:46523bf02e61 | 12 | |
csharer | 0:46523bf02e61 | 13 | //Set Raw Center Values, this is where the joystick sits naturaly |
csharer | 0:46523bf02e61 | 14 | raw_hc = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; |
csharer | 0:46523bf02e61 | 15 | raw_vc = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; |
csharer | 0:46523bf02e61 | 16 | |
csharer | 0:46523bf02e61 | 17 | //Initalize the Rax Max to some value less then then real max value. |
csharer | 0:46523bf02e61 | 18 | //We dont know what the max value will be until we read it. |
csharer | 0:46523bf02e61 | 19 | //But we can assume it will be greater then 0.8 (center + 0.3) |
csharer | 0:46523bf02e61 | 20 | //Now do the same for the the Raw Min |
csharer | 0:46523bf02e61 | 21 | float delta = 0.3; |
csharer | 0:46523bf02e61 | 22 | rawMinH = raw_hc - delta; rawMaxH = raw_hc + delta; |
csharer | 0:46523bf02e61 | 23 | rawMinV = raw_hc - delta; rawMaxV = raw_hc + delta; |
csharer | 0:46523bf02e61 | 24 | } |
csharer | 0:46523bf02e61 | 25 | |
csharer | 0:46523bf02e61 | 26 | //Returns the scaled vertial value of joystick |
csharer | 0:46523bf02e61 | 27 | float Joystick::horizontal(void) { |
csharer | 0:46523bf02e61 | 28 | //Get average val (5 samples) |
csharer | 0:46523bf02e61 | 29 | float avg = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; |
csharer | 0:46523bf02e61 | 30 | |
csharer | 0:46523bf02e61 | 31 | //Watch for Max and Min Values if we see a new max/min update Raw Max/Min |
csharer | 0:46523bf02e61 | 32 | if(avg > rawMaxH) |
csharer | 0:46523bf02e61 | 33 | rawMaxH = avg; |
csharer | 0:46523bf02e61 | 34 | if(avg < rawMinH) |
csharer | 0:46523bf02e61 | 35 | rawMinH = avg; |
csharer | 0:46523bf02e61 | 36 | |
csharer | 0:46523bf02e61 | 37 | //Here we will calculate the total range (Travel) of the joystick |
csharer | 0:46523bf02e61 | 38 | //using the rawMax/rawMin values we have seen thus far |
csharer | 0:46523bf02e61 | 39 | //Calculate the range from [center, max] and [center, min] |
csharer | 0:46523bf02e61 | 40 | float range_pos = rawMaxH - raw_hc; |
csharer | 0:46523bf02e61 | 41 | float range_neg = raw_hc - rawMinH; |
csharer | 0:46523bf02e61 | 42 | |
csharer | 0:46523bf02e61 | 43 | //Here we will calculate how much our current reading is in one |
csharer | 0:46523bf02e61 | 44 | //of the ranges to get a percentage |
csharer | 0:46523bf02e61 | 45 | //Then we can scale this by multiplying it by our scale (_max/_min) |
csharer | 0:46523bf02e61 | 46 | float val; |
csharer | 0:46523bf02e61 | 47 | if(avg >= raw_hc) |
csharer | 1:c42a77267f7b | 48 | val = (((avg - raw_hc) / range_pos) * _max) + DEAD_ZONE/2; // percent to max * max |
csharer | 0:46523bf02e61 | 49 | else |
csharer | 1:c42a77267f7b | 50 | val = (((raw_hc - avg) / range_neg) * _min) - DEAD_ZONE/2; //percent to min * min |
csharer | 0:46523bf02e61 | 51 | |
csharer | 0:46523bf02e61 | 52 | //Here we will apply a dead zone |
csharer | 0:46523bf02e61 | 53 | if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { |
csharer | 0:46523bf02e61 | 54 | return 0; |
csharer | 0:46523bf02e61 | 55 | } |
csharer | 0:46523bf02e61 | 56 | else if(val > DEAD_ZONE/2) {//posotive vals |
csharer | 0:46523bf02e61 | 57 | return val - DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 58 | } |
csharer | 0:46523bf02e61 | 59 | else { //negative vals |
csharer | 0:46523bf02e61 | 60 | return val + DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 61 | } |
csharer | 0:46523bf02e61 | 62 | } |
csharer | 0:46523bf02e61 | 63 | |
csharer | 0:46523bf02e61 | 64 | //Returns the scaled horizontal value of joystick |
csharer | 0:46523bf02e61 | 65 | float Joystick::vertical(void) { |
csharer | 0:46523bf02e61 | 66 | //Get average value |
csharer | 0:46523bf02e61 | 67 | float avg = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; |
csharer | 0:46523bf02e61 | 68 | |
csharer | 0:46523bf02e61 | 69 | //Watch for Max and Min Values |
csharer | 0:46523bf02e61 | 70 | if(avg > rawMaxV) |
csharer | 0:46523bf02e61 | 71 | rawMaxV = avg; |
csharer | 0:46523bf02e61 | 72 | if(avg < rawMinV) |
csharer | 0:46523bf02e61 | 73 | rawMinV = avg; |
csharer | 0:46523bf02e61 | 74 | |
csharer | 0:46523bf02e61 | 75 | //Calculate Range (Total Travel of joystick) |
csharer | 0:46523bf02e61 | 76 | float range_pos = rawMaxV - raw_vc; |
csharer | 0:46523bf02e61 | 77 | float range_neg = raw_vc - rawMinV; |
csharer | 0:46523bf02e61 | 78 | |
csharer | 0:46523bf02e61 | 79 | float val; |
csharer | 0:46523bf02e61 | 80 | if(avg >= raw_vc) //find scaled pot value |
csharer | 1:c42a77267f7b | 81 | val = (((avg - raw_vc) / range_pos) * _max) + DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 82 | else |
csharer | 1:c42a77267f7b | 83 | val = (((raw_vc - avg) / range_neg) * _min) - DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 84 | |
csharer | 0:46523bf02e61 | 85 | //If val is in dead zone range return 0 |
csharer | 0:46523bf02e61 | 86 | if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { |
csharer | 0:46523bf02e61 | 87 | return 0; |
csharer | 0:46523bf02e61 | 88 | } |
csharer | 0:46523bf02e61 | 89 | //Else return val minus dead zone / 2 |
csharer | 0:46523bf02e61 | 90 | else if(val > DEAD_ZONE/2) {//posotive vals |
csharer | 0:46523bf02e61 | 91 | return val - DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 92 | } |
csharer | 0:46523bf02e61 | 93 | else { //negative vals |
csharer | 0:46523bf02e61 | 94 | return val + DEAD_ZONE/2; |
csharer | 0:46523bf02e61 | 95 | } |
csharer | 0:46523bf02e61 | 96 | } |
csharer | 0:46523bf02e61 | 97 | |
csharer | 0:46523bf02e61 | 98 | //Set the Min and Max Values of joystick ex: -100, +100 |
csharer | 0:46523bf02e61 | 99 | void Joystick::setScale(float min, float max) { |
csharer | 1:c42a77267f7b | 100 | _min = min-1; //Add 1 for round off error |
csharer | 1:c42a77267f7b | 101 | _max = max+1; //Add 1 for round off error |
csharer | 0:46523bf02e61 | 102 | } |