Handles reading and scaling the analog inputs from a simple 2-axis joystick with a pushbutton. Can also attach rise and fall interrupts to the button.

Dependents:   joystickdeneme NOKIA_KOMBAT projekat

Purpose

Simple library for reading an analog joystick like those found on game console controllers. These joysticks usually also have a pushbutton.

Example

Joystick Library Example

// Joystick Library Example
//
// Reads the joystick x axis and fades green and red LEDs in response.
// The blue LED is turned on while the pushbutton is pressed.

#include "mbed.h"
#include <Joystick.h>

// target is the KL25Z
#define PIN_JOYX PTB0    // A0
#define PIN_JOYY PTB1    // A1
#define PIN_JOYA PTB2

PwmOut led_R(LED1);
PwmOut led_G(LED2);
PwmOut led_B(LED3);

Joystick j(PIN_JOYX, PIN_JOYY, PIN_JOYA);

// call on joystick button release
void jrise(void) {
    led_B = 1.0f;
}

// call on joystick button press
void jfall(void) {
    led_B = 0.0f;
}

int main () {
    // setup
    led_R = 1.0f;
    led_G = 1.0f;
    led_B = 1.0f;
    joypos p;    // joystick position
    // attach joystick button interrupts
    j.rise(&jrise);
    j.fall(&jfall);
    float fade = 0.0f;

    // loop
    while (1) {
        p = j.read();
        fade = p.x;
        if (fade > 0.0) {
            led_R = 1.0f;
            led_G = 1.0f - (float)fade;
        } else if (fade < 0.0) {
            led_R = 1.0f + (float)fade;
            led_G = 1.0f;
        } else {
            led_R = 1.0f;
            led_G = 1.0f;
        }
        wait(0.01);
    }
}

Committer:
rwunderl
Date:
Wed Aug 05 20:21:34 2015 +0000
Revision:
0:13d10cc6a822
Initial commit of the Joystick library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rwunderl 0:13d10cc6a822 1 /* mbed Joystick Library
rwunderl 0:13d10cc6a822 2 * Copyright (c) 2015, rwunderl, http://mbed.org
rwunderl 0:13d10cc6a822 3 *
rwunderl 0:13d10cc6a822 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
rwunderl 0:13d10cc6a822 5 * of this software and associated documentation files (the "Software"), to deal
rwunderl 0:13d10cc6a822 6 * in the Software without restriction, including without limitation the rights
rwunderl 0:13d10cc6a822 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rwunderl 0:13d10cc6a822 8 * copies of the Software, and to permit persons to whom the Software is
rwunderl 0:13d10cc6a822 9 * furnished to do so, subject to the following conditions:
rwunderl 0:13d10cc6a822 10 *
rwunderl 0:13d10cc6a822 11 * The above copyright notice and this permission notice shall be included in
rwunderl 0:13d10cc6a822 12 * all copies or substantial portions of the Software.
rwunderl 0:13d10cc6a822 13 *
rwunderl 0:13d10cc6a822 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rwunderl 0:13d10cc6a822 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rwunderl 0:13d10cc6a822 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rwunderl 0:13d10cc6a822 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rwunderl 0:13d10cc6a822 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rwunderl 0:13d10cc6a822 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rwunderl 0:13d10cc6a822 20 * THE SOFTWARE.
rwunderl 0:13d10cc6a822 21 */
rwunderl 0:13d10cc6a822 22
rwunderl 0:13d10cc6a822 23 #ifndef MBED_JOYSTICK_H
rwunderl 0:13d10cc6a822 24 #define MBED_JOYSTICK_H
rwunderl 0:13d10cc6a822 25
rwunderl 0:13d10cc6a822 26 #include "mbed.h"
rwunderl 0:13d10cc6a822 27
rwunderl 0:13d10cc6a822 28 /** Joystick position structure
rwunderl 0:13d10cc6a822 29 *
rwunderl 0:13d10cc6a822 30 * Struct to keep track of the joystick x and y positions.
rwunderl 0:13d10cc6a822 31 */
rwunderl 0:13d10cc6a822 32 struct joypos {
rwunderl 0:13d10cc6a822 33 double x;
rwunderl 0:13d10cc6a822 34 double y;
rwunderl 0:13d10cc6a822 35 };
rwunderl 0:13d10cc6a822 36
rwunderl 0:13d10cc6a822 37 /** Joystick class
rwunderl 0:13d10cc6a822 38 *
rwunderl 0:13d10cc6a822 39 * Reads a 2-axis analog joystick and keeps track of its positions.
rwunderl 0:13d10cc6a822 40 *
rwunderl 0:13d10cc6a822 41 * The joystick uses 2 AnalogIns and 1 DigitalIn
rwunderl 0:13d10cc6a822 42 * - X AnalogIn
rwunderl 0:13d10cc6a822 43 * - Y AnalogIn
rwunderl 0:13d10cc6a822 44 * - A DigitalIn (momentary pushbutton; Low is pressed)
rwunderl 0:13d10cc6a822 45 */
rwunderl 0:13d10cc6a822 46 class Joystick {
rwunderl 0:13d10cc6a822 47 public:
rwunderl 0:13d10cc6a822 48 /** Joystick interface
rwunderl 0:13d10cc6a822 49 * Create the joystick object and assign pins.
rwunderl 0:13d10cc6a822 50 *
rwunderl 0:13d10cc6a822 51 * @param x X-axis AnalogIn.
rwunderl 0:13d10cc6a822 52 * @param y Y-axis AnalogIn.
rwunderl 0:13d10cc6a822 53 * @param a Pushbutton DigitalIn.
rwunderl 0:13d10cc6a822 54 */
rwunderl 0:13d10cc6a822 55 Joystick(PinName x, PinName y, PinName a);
rwunderl 0:13d10cc6a822 56
rwunderl 0:13d10cc6a822 57 /** Read the joystick position
rwunderl 0:13d10cc6a822 58 * The position is returned as a joypos value with x and y in the range [-1.0, 1.0].
rwunderl 0:13d10cc6a822 59 *
rwunderl 0:13d10cc6a822 60 * @returns Position structure of the joystick.
rwunderl 0:13d10cc6a822 61 */
rwunderl 0:13d10cc6a822 62 joypos read();
rwunderl 0:13d10cc6a822 63
rwunderl 0:13d10cc6a822 64 /** Get the X position
rwunderl 0:13d10cc6a822 65 * Read the joystick's horizontal position, represented as a double value in the range [-1.0, 1.0].
rwunderl 0:13d10cc6a822 66 *
rwunderl 0:13d10cc6a822 67 * @returns Horizontal position of the joystick.
rwunderl 0:13d10cc6a822 68 */
rwunderl 0:13d10cc6a822 69 double getX();
rwunderl 0:13d10cc6a822 70
rwunderl 0:13d10cc6a822 71 /** Get the Y position
rwunderl 0:13d10cc6a822 72 * Read the joystick's vertical position, represented as a double value in the range [-1.0, 1.0].
rwunderl 0:13d10cc6a822 73 *
rwunderl 0:13d10cc6a822 74 * @returns Vertical position of the joystick.
rwunderl 0:13d10cc6a822 75 */
rwunderl 0:13d10cc6a822 76 double getY();
rwunderl 0:13d10cc6a822 77
rwunderl 0:13d10cc6a822 78 /** Get the raw X position
rwunderl 0:13d10cc6a822 79 * Read the joystick's raw horizontal position, represented as a double value in the range [0.0, 1.0].
rwunderl 0:13d10cc6a822 80 *
rwunderl 0:13d10cc6a822 81 * @returns Horizontal position of the joystick.
rwunderl 0:13d10cc6a822 82 */
rwunderl 0:13d10cc6a822 83 double getRawX();
rwunderl 0:13d10cc6a822 84
rwunderl 0:13d10cc6a822 85 /** Get the raw Y position
rwunderl 0:13d10cc6a822 86 * Read the joystick's raw vertical position, represented as a double value in the range [0.0, 1.0].
rwunderl 0:13d10cc6a822 87 *
rwunderl 0:13d10cc6a822 88 * @returns Vertical position of the joystick.
rwunderl 0:13d10cc6a822 89 */
rwunderl 0:13d10cc6a822 90 double getRawY();
rwunderl 0:13d10cc6a822 91
rwunderl 0:13d10cc6a822 92 /** Attach the rise interrupt
rwunderl 0:13d10cc6a822 93 * Attach a function pointer to call when a rising edge occurs on the button input.
rwunderl 0:13d10cc6a822 94 *
rwunderl 0:13d10cc6a822 95 * @param fptr Pointer to a void function. Set to NULL or 0 for none.
rwunderl 0:13d10cc6a822 96 */
rwunderl 0:13d10cc6a822 97 void rise(void (*fptr)(void));
rwunderl 0:13d10cc6a822 98
rwunderl 0:13d10cc6a822 99 /** Attach the fall interrupt
rwunderl 0:13d10cc6a822 100 * Attach a function pointer to call when a falling edge occurs on the button input.
rwunderl 0:13d10cc6a822 101 *
rwunderl 0:13d10cc6a822 102 * @param fptr Pointer to a void function. Set to NULL or 0 for none.
rwunderl 0:13d10cc6a822 103 */
rwunderl 0:13d10cc6a822 104 void fall(void (*fptr)(void));
rwunderl 0:13d10cc6a822 105
rwunderl 0:13d10cc6a822 106 protected:
rwunderl 0:13d10cc6a822 107 AnalogIn _x;
rwunderl 0:13d10cc6a822 108 AnalogIn _y;
rwunderl 0:13d10cc6a822 109 InterruptIn _a;
rwunderl 0:13d10cc6a822 110 };
rwunderl 0:13d10cc6a822 111
rwunderl 0:13d10cc6a822 112 #endif /* MBED_JOYSTICK_H */