/* We use the Joystick library from: */ #include #include #define DELAY 5 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; const int rng = 500; int mouse_mode = 0; int prev_readings[btn_count]; Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, btn_count, // buttons 1, // joystick hat switches true, // X axis true, // Y axis 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; } Mouse.begin(); Joystick.begin(); Joystick.setXAxisRange(-rng, rng); 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() { /*int click = get_clicked(); if (click) { Mouse.click();}*/ 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); if (mouse_mode) { if (diry != 0) { Mouse.move(0, diry, 0); } if (dirx != 0) { Mouse.move(dirx, 0, 0); } } else { Joystick.setXAxis (dirx); Joystick.setYAxis (diry); } delay(DELAY); }