Racing Cars game using N5110 LCD and thumb Joystick

Dependencies:   N5110 PowerControl beep mbed

Committer:
eencae
Date:
Sun Mar 08 16:43:02 2015 +0000
Revision:
0:026fa541af7a
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:026fa541af7a 1 /* Joystick
eencae 0:026fa541af7a 2
eencae 0:026fa541af7a 3 Example code of how to read a joystick
eencae 0:026fa541af7a 4
eencae 0:026fa541af7a 5 https://www.sparkfun.com/products/9032
eencae 0:026fa541af7a 6
eencae 0:026fa541af7a 7 Craig A. Evans
eencae 0:026fa541af7a 8 7 March 2015
eencae 0:026fa541af7a 9 */
eencae 0:026fa541af7a 10
eencae 0:026fa541af7a 11 #include "mbed.h"
eencae 0:026fa541af7a 12
eencae 0:026fa541af7a 13 // change this to alter tolerance of joystick direction
eencae 0:026fa541af7a 14 #define DIRECTION_TOLERANCE 0.05
eencae 0:026fa541af7a 15
eencae 0:026fa541af7a 16 // connections for joystick
eencae 0:026fa541af7a 17 DigitalIn button(p18);
eencae 0:026fa541af7a 18 AnalogIn xPot(p19);
eencae 0:026fa541af7a 19 AnalogIn yPot(p20);
eencae 0:026fa541af7a 20
eencae 0:026fa541af7a 21 // timer to regularly read the joystick
eencae 0:026fa541af7a 22 Ticker pollJoystick;
eencae 0:026fa541af7a 23 // Serial for debug
eencae 0:026fa541af7a 24 Serial serial(USBTX,USBRX);
eencae 0:026fa541af7a 25
eencae 0:026fa541af7a 26 // create enumerated type (0,1,2,3 etc. for direction)
eencae 0:026fa541af7a 27 // could be extended for diagonals etc.
eencae 0:026fa541af7a 28 enum DirectionName {
eencae 0:026fa541af7a 29 UP,
eencae 0:026fa541af7a 30 DOWN,
eencae 0:026fa541af7a 31 LEFT,
eencae 0:026fa541af7a 32 RIGHT,
eencae 0:026fa541af7a 33 CENTRE,
eencae 0:026fa541af7a 34 UNKNOWN
eencae 0:026fa541af7a 35 };
eencae 0:026fa541af7a 36
eencae 0:026fa541af7a 37 // struct for Joystick
eencae 0:026fa541af7a 38 typedef struct JoyStick Joystick;
eencae 0:026fa541af7a 39 struct JoyStick {
eencae 0:026fa541af7a 40 float x; // current x value
eencae 0:026fa541af7a 41 float x0; // 'centred' x value
eencae 0:026fa541af7a 42 float y; // current y value
eencae 0:026fa541af7a 43 float y0; // 'centred' y value
eencae 0:026fa541af7a 44 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
eencae 0:026fa541af7a 45 DirectionName direction; // current direction
eencae 0:026fa541af7a 46 };
eencae 0:026fa541af7a 47 // create struct variable
eencae 0:026fa541af7a 48 Joystick joystick;
eencae 0:026fa541af7a 49
eencae 0:026fa541af7a 50 int printFlag = 0;
eencae 0:026fa541af7a 51
eencae 0:026fa541af7a 52 // function prototypes
eencae 0:026fa541af7a 53 void calibrateJoystick();
eencae 0:026fa541af7a 54 void updateJoystick();
eencae 0:026fa541af7a 55
eencae 0:026fa541af7a 56 int main()
eencae 0:026fa541af7a 57 {
eencae 0:026fa541af7a 58 calibrateJoystick(); // get centred values of joystick
eencae 0:026fa541af7a 59 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second
eencae 0:026fa541af7a 60
eencae 0:026fa541af7a 61 while(1) {
eencae 0:026fa541af7a 62
eencae 0:026fa541af7a 63 if (printFlag) { // if flag set, clear flag and print joystick values to serial port
eencae 0:026fa541af7a 64 printFlag = 0;
eencae 0:026fa541af7a 65 serial.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button);
eencae 0:026fa541af7a 66
eencae 0:026fa541af7a 67 // check joystick direction
eencae 0:026fa541af7a 68 if (joystick.direction == UP)
eencae 0:026fa541af7a 69 serial.printf(" UP\n");
eencae 0:026fa541af7a 70 if (joystick.direction == DOWN)
eencae 0:026fa541af7a 71 serial.printf(" DOWN\n");
eencae 0:026fa541af7a 72 if (joystick.direction == LEFT)
eencae 0:026fa541af7a 73 serial.printf(" LEFT\n");
eencae 0:026fa541af7a 74 if (joystick.direction == RIGHT)
eencae 0:026fa541af7a 75 serial.printf(" RIGHT\n");
eencae 0:026fa541af7a 76 if (joystick.direction == CENTRE)
eencae 0:026fa541af7a 77 serial.printf(" CENTRE\n");
eencae 0:026fa541af7a 78 if (joystick.direction == UNKNOWN)
eencae 0:026fa541af7a 79 serial.printf(" Unsupported direction\n");
eencae 0:026fa541af7a 80
eencae 0:026fa541af7a 81 }
eencae 0:026fa541af7a 82
eencae 0:026fa541af7a 83 }
eencae 0:026fa541af7a 84 }
eencae 0:026fa541af7a 85
eencae 0:026fa541af7a 86 // read default positions of the joystick to calibrate later readings
eencae 0:026fa541af7a 87 void calibrateJoystick()
eencae 0:026fa541af7a 88 {
eencae 0:026fa541af7a 89 button.mode(PullDown);
eencae 0:026fa541af7a 90 // must not move during calibration
eencae 0:026fa541af7a 91 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
eencae 0:026fa541af7a 92 joystick.y0 = yPot;
eencae 0:026fa541af7a 93 }
eencae 0:026fa541af7a 94 void updateJoystick()
eencae 0:026fa541af7a 95 {
eencae 0:026fa541af7a 96 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
eencae 0:026fa541af7a 97 joystick.x = xPot - joystick.x0;
eencae 0:026fa541af7a 98 joystick.y = yPot - joystick.y0;
eencae 0:026fa541af7a 99 // read button state
eencae 0:026fa541af7a 100 joystick.button = button;
eencae 0:026fa541af7a 101
eencae 0:026fa541af7a 102 // calculate direction depending on x,y values
eencae 0:026fa541af7a 103 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
eencae 0:026fa541af7a 104 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
eencae 0:026fa541af7a 105 joystick.direction = CENTRE;
eencae 0:026fa541af7a 106 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
eencae 0:026fa541af7a 107 joystick.direction = UP;
eencae 0:026fa541af7a 108 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
eencae 0:026fa541af7a 109 joystick.direction = DOWN;
eencae 0:026fa541af7a 110 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
eencae 0:026fa541af7a 111 joystick.direction = RIGHT;
eencae 0:026fa541af7a 112 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
eencae 0:026fa541af7a 113 joystick.direction = LEFT;
eencae 0:026fa541af7a 114 } else {
eencae 0:026fa541af7a 115 joystick.direction = UNKNOWN;
eencae 0:026fa541af7a 116 }
eencae 0:026fa541af7a 117
eencae 0:026fa541af7a 118 // set flag for printing
eencae 0:026fa541af7a 119 printFlag = 1;
eencae 0:026fa541af7a 120 }