Programmable ambidextrous joystick mouse

A flexible and accessible pointing device

Similar projects worth following
The venerable computer mouse is a fairly ubiquitous pointing device. However, the standard mouse shape and mode of function isn’t always practical in all situations, nor is it accessible to people who may have difficulty with fine motor skills. A mouse also requires a suitable surface to operate on with sufficient area to be practical. Touch pads can be overly sensitive to stray inadvertent touches and it can be difficult to perform accurate rapid positioning using one.

The joystick mouse isn’t a new concept, but it can be refined to make it a handy portable pointing device regardless of surface and also be fine tunable and programmable to fit each individual user’s needs.

An ambidextrous, programmable, grip-style joystick mouse.

The device is held in (or strapped to) the palm of either hand, with the joystick positioned beneath the thumb and the buttons and a scroll-wheel under the fingers. The device should be mirrored down the middle so that it can be held comfortably in either hand.
All the buttons, scroll-wheel and joystick axis movements should be able to be arbitrarily remapped (and remapped to be left-handed). The cursor move rate can be configured to be proportional to the axis offset from centre.

Zip Archive - 5.17 kB - 08/30/2020 at 10:59


Zip Archive - 9.46 kB - 08/30/2020 at 10:59


  • Rough design renders

    NDB08/30/2020 at 10:57 0 comments

    Here are some early render concepts of what the final device could look like. It should be quite compact and fit easily within a gripped hand. It tapers slightly as it rises in what is hopefully a comfortable shape. The joystick is angled towards the thumb to provide better reach. The holes in the sides of the casing are where straps to attach it to the hand could be threaded through to be bottom of the device. I expect there will need to be many refinements here to ensure the ergonomics are good for a variety of hand sizes.

    The bottom-most button on the back of the device is ostensibly the ‘mode’ button to cycle presets, but can be remapped, like all the others, to be anything.

  • The configuration tool

    NDB08/30/2020 at 10:54 0 comments

    To be a programmable device, it needs a tool to do the programming! I wrote the configuration tool in Python using Tkinter for the UI so that it would be largely cross platform. The device is calibrated and reprogrammed as a serial device.

    These are the available input ‘events’ the device raises:


    And these are the ‘actions’ you can arbitrarily map to them:

    "Do Nothing", "Cursor move right", "Cursor move left", "Cursor move up", "Cursor move down", "Scroll vertically down", "Scroll vertically up", "Scroll horizontally right", "Scroll horizontally left", "Single click button 1", "Single click button 2", "Single click button 3", "Double click button 1", "Double click button 2", "Double click button 3", "Toggle button 1 on/off", "Toggle button 2 on/off", "Toggle button 3 on/off", "Release button 1", "Release button 2", "Release button 3", "Hold button 1", "Hold button 2", "Hold button 3", "Swap vert/horiz scroll", "Swap single/double click", "Release all buttons", "Next preset"

    It’s nice once you get to the stage when you are able to fiddle with the event handling, tweak the acceleration values and being able to instantly try it out.

    The 'landing' tab of the tool. You can calibrate the joystick here and adjust the deadzones. Some global settings are also set here which override the presets where applicable.

    Drop downs list the available actions next to the hardware events. You can also toggle feedback events.

    Linear acceleration works well most of the time.

    But you can have more abrupt movements if you prefer, or smoothed out movements.

    These speed settings are just for demonstration, I don't recommend using them.

    Using Python and Tkinter make running the tool across platforms quite easy. Extra considerations for MacOS are required though, the default font is a bit tiny and the spacing isn't perfect.

  • Breadboard prototype

    NDB08/30/2020 at 10:41 0 comments

    This is a picture of the breadboard ‘device’ I used to write the firmware against. The heart of it is a TeensyLC with pretty much everything else just wired in to it. The rotary encoder next to it is performing the function of the scroll wheel.

    The joystick module can also be clicked in as a button, so the device got itself another button to map. I wanted the device to have event feedback mechanisms, so added a buzzer to provide programmable auditory feedback on events and made allowances for a vibrator module to be triggered for basic haptic feedback as well (not pictured).

    I decided that a visual indicator of which preset was selected would be useful. The TeensyLC only has 128 bytes of emulated EEPROM to work with, so I limited myself to 3 presets and so used 3 LEDs. The device can be configured to disable them, or blink them as part of a mouse event as a visual feedback mechanism.

    The hardware was tested on Linux, Windows 10 and MacOS.

  • Design considerations

    NDB08/30/2020 at 10:39 0 comments

    The TeensyLC is my go-to micro-controller board for building USB HID projects. The libraries that come with Teensyduino make prototyping almost too easy!
    The challenge was writing the firmware so that all the mouse events could be remapped across the various input methods. There would also be additional events, like mouse button toggling and instant double clicks. Also, I wanted the cursor move rate to be configurable across the joystick axis range, using different interpolation functions per axis.

    I wanted the device to have more than one set of programmed ‘presets’ that can be cycled through to change to the mappings best suited to the task at hand. For example, the initial preset would operate like a regular mouse, but the next preset would map the horizontal and vertical scroll wheel events to the joystick axis instead, which would be useful in the context of reading documents. This required adding an additional ‘mode’ button to the device design. I considered putting this button on the front of the device, but that position would have been ergonomically awkward. I now envision it being beneath the bottom mouse button, potentially under the ‘pinky’ finger.

View all 4 project logs

Enjoy this project?



Jon wrote 09/02/2020 at 18:27 point

Accessibility controllers were some of my favorite content from the period when Element 14 hosted The Ben Heck show. I'd love to see this working on a traditional console system (perhaps either a Microsoft or Nintendo would be the easiest to map this particular devices functionality?). Good luck!

  Are you sure? yes | no

NDB wrote 09/03/2020 at 08:10 point


I must admit I was so focused on the joystick-as-mouse aspect I didn’t even consider it functioning as a joystick proper. The biggest shortcoming will probably be the lack of a second stick and full set of buttons. A device in each hand, like a split game pad, would probably work. Something to think about!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates