Dependencies:   N5110 mbed

Committer:
jordaahh
Date:
Sat Apr 11 14:50:39 2015 +0000
Revision:
0:a28ad0db4228
Child:
1:3b741adc82ea
Basic commands for Joystick, still need to initialise LCD and display start screen.

Who changed what in which revision?

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