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
- Committer:
- csharer
- Date:
- 2016-10-20
- Revision:
- 1:c42a77267f7b
- Parent:
- 0:46523bf02e61
- Child:
- 2:893fd930d3fb
File content as of revision 1:c42a77267f7b:
//Joystick (FULL IMPLIMENTATION) //Author: Carter Sharer //Date: 10/18/16 #include "Joystick.h" #include "mbed.h" //Member function definitions including constructor Joystick::Joystick(PinName pinA, PinName pinB) : horiz(pinA), vert(pinB) { //Wait 1 second for voltage to settle wait(1); //Set Raw Center Values, this is where the joystick sits naturaly 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; //Initalize the Rax Max to some value less then then real max value. //We dont know what the max value will be until we read it. //But we can assume it will be greater then 0.8 (center + 0.3) //Now do the same for the the Raw Min float delta = 0.3; rawMinH = raw_hc - delta; rawMaxH = raw_hc + delta; rawMinV = raw_hc - delta; rawMaxV = raw_hc + delta; } //Returns the scaled vertial value of joystick float Joystick::horizontal(void) { //Get average val (5 samples) float avg = (horiz.read() + horiz.read() + horiz.read() + horiz.read() + horiz.read()) / 5.0; //Watch for Max and Min Values if we see a new max/min update Raw Max/Min if(avg > rawMaxH) rawMaxH = avg; if(avg < rawMinH) rawMinH = avg; //Here we will calculate the total range (Travel) of the joystick //using the rawMax/rawMin values we have seen thus far //Calculate the range from [center, max] and [center, min] float range_pos = rawMaxH - raw_hc; float range_neg = raw_hc - rawMinH; //Here we will calculate how much our current reading is in one //of the ranges to get a percentage //Then we can scale this by multiplying it by our scale (_max/_min) float val; if(avg >= raw_hc) val = (((avg - raw_hc) / range_pos) * _max) + DEAD_ZONE/2; // percent to max * max else val = (((raw_hc - avg) / range_neg) * _min) - DEAD_ZONE/2; //percent to min * min //Here we will apply a dead zone if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { return 0; } else if(val > DEAD_ZONE/2) {//posotive vals return val - DEAD_ZONE/2; } else { //negative vals return val + DEAD_ZONE/2; } } //Returns the scaled horizontal value of joystick float Joystick::vertical(void) { //Get average value float avg = (vert.read() + vert.read() + vert.read() + vert.read() + vert.read()) / 5.0; //Watch for Max and Min Values if(avg > rawMaxV) rawMaxV = avg; if(avg < rawMinV) rawMinV = avg; //Calculate Range (Total Travel of joystick) float range_pos = rawMaxV - raw_vc; float range_neg = raw_vc - rawMinV; float val; if(avg >= raw_vc) //find scaled pot value val = (((avg - raw_vc) / range_pos) * _max) + DEAD_ZONE/2; else val = (((raw_vc - avg) / range_neg) * _min) - DEAD_ZONE/2; //If val is in dead zone range return 0 if((val <= DEAD_ZONE/2) && (val >= -DEAD_ZONE/2)) { return 0; } //Else return val minus dead zone / 2 else if(val > DEAD_ZONE/2) {//posotive vals return val - DEAD_ZONE/2; } else { //negative vals return val + DEAD_ZONE/2; } } //Set the Min and Max Values of joystick ex: -100, +100 void Joystick::setScale(float min, float max) { _min = min-1; //Add 1 for round off error _max = max+1; //Add 1 for round off error }