/* We use the Joystick library from: */ #include #define DELAY 5 /* Whether to use the Y axis as two buttons. This is useful for playing SuperTuxKart. Set this to 2 if you want to enable this feature and to 0 otherwise. */ #define USE_Y_AS_BUTTONS 2 const int sw_pin = 2; const int vrx_pin = A0; const int vry_pin = A1; // UP, RIGHT, DOWN, LEFT, additional left, additional right const int btn_count = 6; const int btn_pins[] = { 3,4,5,6,7,8 }; const int base_x = 512; const int base_y = 519; const int max_x = 1023; const int max_y = 1023; /* joystick info will be read from -rng to +rng */ const int rng = 500; /* If USE_Y_AS_BUTTONS is set up: joystick data above this will count as a click */ const int threshold = 50; int prev_readings[btn_count]; Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, btn_count + USE_Y_AS_BUTTONS, // buttons 0, // joystick hat switches true, // X axis #if USE_Y_AS_BUTTONS == 0 true, // Y axis #else false, // Y axis #endif false, // Z axis false, false, false, false, false, false, false, false); void setup() { pinMode(sw_pin, INPUT); for (int i = 0; i < btn_count; i++) { pinMode(btn_pins[i], INPUT); prev_readings[i] = 0; } Joystick.begin(); Joystick.setXAxisRange(-rng, rng); if (!USE_Y_AS_BUTTONS) Joystick.setYAxisRange(-rng, rng); } int prev_clicked = 0; int get_clicked() { int signal = !digitalRead(sw_pin); int ret = (signal && signal != prev_clicked) ? 1 : 0; prev_clicked = signal; return ret; } int read_direction(int analog_pin, int base, int max, int rng) { int signal = analogRead(analog_pin); if (signal > base) { return map (signal, base, max, 0, rng); } else if (signal < base) { return - map (signal, base, 0, 1, rng); } else { return 0; } } void loop() { for (int i = 0; i < btn_count; i++) { int pin = btn_pins[i]; int signal = digitalRead(pin); if (signal != prev_readings[i]) { Joystick.setButton(i, signal); } prev_readings[i] = signal; } // Analogue input int dirx = -read_direction(vrx_pin, base_x, max_x, rng); int diry = read_direction(vry_pin, base_y, max_y, rng); Joystick.setXAxis (dirx); if (USE_Y_AS_BUTTONS) { // first button if (diry >= threshold) { Joystick.setButton(btn_count, HIGH); } else { Joystick.setButton(btn_count, LOW); } // second button if (diry <= -threshold) { Joystick.setButton(btn_count+1, HIGH); } else { Joystick.setButton(btn_count+1, LOW); } } else { Joystick.setYAxis (diry); } delay(DELAY); }