diff --git a/examples/JoystickMouseControl/JoystickMouseControl.ino b/examples/JoystickMouseControl/JoystickMouseControl.ino new file mode 100644 index 0000000..132a5dd --- /dev/null +++ b/examples/JoystickMouseControl/JoystickMouseControl.ino @@ -0,0 +1,121 @@ +/* + JoystickMouseControl + + Controls the mouse from a joystick on a native USB board (e.g., Leonardo, + Micro, MKR, Nano 33 IoT, Zero, Due). + Uses a pushbutton to turn on and off mouse control, and a second pushbutton + to click the left mouse button. + + Hardware: + - 2-axis joystick connected to pins A0 and A1 + - pushbuttons connected to pin D2 and D3 + + The mouse movement is always relative. This sketch reads two analog inputs + that range from 0 to 1023 (or less on either end) and translates them into + ranges of -6 to 6. + The sketch assumes that the joystick resting values are around the middle of + the range, but that they vary within a threshold. + + WARNING: When you use the Mouse.move() command, the Arduino takes over your + mouse! Make sure you have control before you use the command. This sketch + includes a pushbutton to toggle the mouse control state, so you can turn on + and off mouse control. + + created 15 Sep 2011 + updated 28 Mar 2012 + by Tom Igoe + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/JoystickMouseControl +*/ + +#include "Mouse.h" + +// set pin numbers for switch, joystick axes, and LED: +const int switchPin = 2; // switch to turn on and off mouse control +const int mouseButton = 3; // input pin for the mouse pushbutton +const int xAxis = A0; // joystick X axis +const int yAxis = A1; // joystick Y axis +const int ledPin = 5; // Mouse control LED + +// parameters for reading the joystick: +int range = 12; // output range of X or Y movement +int responseDelay = 5; // response delay of the mouse, in ms +int threshold = range / 4; // resting threshold +int center = range / 2; // resting position value + +bool mouseIsActive = false; // whether or not to control the mouse +int lastSwitchState = LOW; // previous switch state + +void setup() { + pinMode(switchPin, INPUT); // the switch pin + pinMode(ledPin, OUTPUT); // the LED pin + // take control of the mouse: + Mouse.begin(); +} + +void loop() { + // read the switch: + int switchState = digitalRead(switchPin); + // if it's changed and it's high, toggle the mouse state: + if (switchState != lastSwitchState) { + if (switchState == HIGH) { + mouseIsActive = !mouseIsActive; + // turn on LED to indicate mouse state: + digitalWrite(ledPin, mouseIsActive); + } + } + // save switch state for next comparison: + lastSwitchState = switchState; + + // read and scale the two axes: + int xReading = readAxis(A0); + int yReading = readAxis(A1); + + // if the mouse control state is active, move the mouse: + if (mouseIsActive) { + Mouse.move(xReading, yReading, 0); + } + + // read the mouse button and click or not click: + // if the mouse button is pressed: + if (digitalRead(mouseButton) == HIGH) { + // if the mouse is not pressed, press it: + if (!Mouse.isPressed(MOUSE_LEFT)) { + Mouse.press(MOUSE_LEFT); + } + } + // else the mouse button is not pressed: + else { + // if the mouse is pressed, release it: + if (Mouse.isPressed(MOUSE_LEFT)) { + Mouse.release(MOUSE_LEFT); + } + } + + delay(responseDelay); +} + +/* + reads an axis (0 or 1 for x or y) and scales the analog input range to a range + from 0 to +*/ + +int readAxis(int thisAxis) { + // read the analog input: + int reading = analogRead(thisAxis); + + // map the reading from the analog input range to the output range: + reading = map(reading, 0, 1023, 0, range); + + // if the output reading is outside from the rest position threshold, use it: + int distance = reading - center; + + if (abs(distance) < threshold) { + distance = 0; + } + + // return the distance for this axis: + return distance; +} diff --git a/examples/JoystickMouseControl/layout.png b/examples/JoystickMouseControl/layout.png new file mode 100644 index 0000000..95a4e95 Binary files /dev/null and b/examples/JoystickMouseControl/layout.png differ diff --git a/examples/JoystickMouseControl/schematic.png b/examples/JoystickMouseControl/schematic.png new file mode 100644 index 0000000..ae4ecf1 Binary files /dev/null and b/examples/JoystickMouseControl/schematic.png differ