Adaptive Controller Inspired by the QuadStick
by marieweilbacher in Circuits > Assistive Tech
42 Views, 0 Favorites, 0 Comments
Adaptive Controller Inspired by the QuadStick
Overview
(The video attached also gives a general overview on the final product and how it works)
For my assistive technology class project, I designed and built an adaptive computer controller inspired by the QuadStick. The purpose of this project was to create an accessible input device that can be operated primarily through head, neck, and mouth movements, allowing users with limited mobility or disabilities to interact with a computer more independently.
The controller combines several input methods, including a mouth-operated joystick with integrated sip-and-puff functionality, a cheek button, a chin button, and an adjustable infrared motion sensor. These controls provide mouse movement, mouse clicks, and keyboard inputs without requiring traditional keyboard or mouse use. The controller also includes a universal microphone stand mount, allowing it to be positioned in a variety of locations and adjusted to meet the needs of different users. Several built-in wire routing features were incorporated into the design to improve cable management and simplify assembly.
A major goal of this design was flexibility. The IR sensor and LED indicator can be repositioned using Velcro and wire, allowing the controller to be customized for different users and accessibility needs. The device is housed in a custom 3D-printed enclosure with an additional foam-core compartment for wire management and electronics storage.
This project demonstrates how affordable electronics, 3D printing, and simple programming can be combined to create assistive technology that improves computer accessibility.
How the Controller Works
The Arduino Leonardo acts as both a keyboard and mouse when connected to a computer.
Control Mappings
Input → Function
Mouth-Operated Joystick → Mouse cursor movement
Joystick Press (SW Button) → Left mouse click and hold
Sip-and-Puff Switch → Right mouse click
Cheek Button → Spacebar
IR Motion Sensor → Enter key
Microswitch → Escape key
LED Indicator → Lights when the IR sensor is activated
The joystick includes a software dead zone to reduce unwanted cursor drift. The provided code has already been configured so that pushing the joystick upward moves the cursor upward and pushing downward moves the cursor downward. (Some joysticks have this flipped)
Design Features
- Universal microphone stand mount for flexible positioning.
- Built-in wire routing channels for cleaner cable management.
- Dedicated routing path for chin button wiring.
- Dedicated routing path for microswitch wiring.
- Dedicated routing path for IR sensor and LED wiring.
- Repositionable IR sensor for different user setups.
- Repositionable LED indicator using Velcro.
- Rear electronics compartment for improved wire management and maintenance.
Supplies
Materials and Tools
Electronics
- Arduino Leonardo or a similar circuit board
- Joystick module
- Microswitch (cheek button)
- Simple button (Sip and Puff Input)
- Push button (chin button)
- IR sensor
- LED
- Appropriate resistor for LED
- Breadboard
- Wires
- Wire
- USB adapter
Construction Materials
Tools
- Computer with Arduino IDE
- Wire cutters/strippers
- Soldering equipment (depending on how you assemble, could be optional.)
- Hot glue or 3d printing adhesive
- Heat shrink (recommended to limit accidental circuit completion from wires touching)
- Scissors
- Exacto knife
Files
Included:
- STL files
- Arduino code (can be remapped for different buttons)
- Google Drive folder containing all project files
Downloads
3D Print the Parts
Step 1: 3D Print the Parts
Print all of the enclosure components for the controller using the provided STL files.
After printing:
- Remove any supports.
- Clean up rough edges if necessary.
- Verify that all parts printed successfully.
Before moving on, test fit the major components:
- Arduino Leonardo
- Joystick
- Buttons (Microswitches vary in size, and adjustments or melting can be done to create a better fit in the 3D printed casing)
- IR sensor
- LED ( LED areas may need to be melted to be widened to fit wires, depending on wire size)
I also added a foam-core compartment to the rear of the enclosure. This extra space helps organize wiring and electronics later in the build.
Taking a few minutes to check fitment now can save a lot of troubleshooting during final assembly.
Upload the Code
Step 2: Upload the Code
Before wiring the controller, upload the Arduino code to the Arduino Leonardo.
Open the Arduino IDE and load the provided sketch. Make any desired changes to the control mappings before uploading. For example, you may wish to change which buttons correspond to specific keyboard keys or mouse actions.
Once you are satisfied with the code:
- Connect the Arduino Leonardo to your computer.
- Select the correct board and port in the Arduino IDE.
- Upload the sketch.
- Verify that the upload completes successfully.
Uploading and testing the code before wiring the entire device can make troubleshooting much easier later in the build.
Notes
- The provided code already has the joystick directions configured correctly.
- If you modify the joystick mappings, test cursor movement afterward to ensure the axes have not become reversed.
- If you remap buttons, make sure the physical wiring still matches the pin assignments in the code.
Install the Joystick
Step 3: Install the Joystick
The joystick serves as the primary input device for controlling the mouse cursor, so it is important to ensure it is mounted securely.
Insert the joystick into its designated location in the enclosure and verify that it sits flush against the mounting surface. Secure it using your preferred mounting method. (velcro or adhesive). Personally, I chose to use just wires with female to male connectors however you could also solder your wires
Before continuing:
- Check that the joystick can move freely in all directions.
- Verify that nothing obstructs its movement.
- Ensure the joystick is positioned comfortably for mouth operation.
Once installed, route the joystick wires toward the area where the Arduino and breadboard will be located. Keeping the wires organized now will make later assembly much easier.
NOTE if you are soldering heat shrink over any open metal
Install the Remaining Inputs
Step 4: Install the Remaining Inputs
With the joystick installed, mount the remaining inputs into the enclosure.
Install:
- Cheek button
- Chin button
- Sip-and-puff microswitch
- IR sensor
- LED indicator
As you install each component, consider how it will be used by the user. The cheek button, chin button, and IR sensor should be positioned where they can be activated comfortably and consistently.
The enclosure includes built-in wire routing channels for the chin button, microswitch, IR sensor, and LED wiring. Threading the wires through these channels helps keep the build organized and reduces the chance of wires interfering with normal operation.
The IR sensor and LED can also be attached using Velcro, allowing them to be repositioned later to better fit different users and accessibility needs.
The IR sensor is mounted remotely and should be attached to a sturdy wire so it can be positioned where it is most effective for the user.
Microswitch Actuation Extension
To make the microswitch easier to activate, I attached one of the included 3D-printed parts to the switch lever. I also added an additional scrap piece of material and secured it in place using glue and heat-forming techniques.
This creates a larger activation surface, making it easier for the user to trigger the microswitch using cheek movement. Builders may modify the shape or size of this extension to better suit their own needs and preferences.
Chin Button Comfort Cap
The chin button includes a custom 3D-printed rounded button cap. This cap increases the contact area and provides a smoother surface for the user.
The rounded shape was designed to improve comfort during extended use and prevent the button from poking or irritating the user while being activated with the chin.
Before moving on:
- Verify that all components fit securely.
- Ensure buttons can be pressed without obstruction.
- Confirm the IR sensor has a clear detection path.
- Check that the LED is visible to the user.
NOTE if you are soldering heat shrink over any open metal
Connect and Organize the Wiring
Step 5: Connect and Organize the Wiring
Once all inputs have been installed, begin connecting the wires to each component.
Connect wires to:
- Joystick
- Cheek button
- Chin button
- Sip-and-puff microswitch
- IR sensor
- LED
As you work, keep the wiring organized. I grouped the wires belonging to the same component together using bread ties. This made the wiring much easier to manage and helped prevent wires from becoming tangled during assembly and troubleshooting.
The chin button includes a dedicated wire-routing path built into the enclosure. Similar routing features are included for the microswitch, IR sensor, and LED wiring to help keep cables organized and protected.
After attaching the wires to each component:
- Route the wires toward the breadboard and Arduino.
- Check that each connection is secure.
- Leave enough slack so components can still be adjusted if needed.
Good wire management now will make final assembly, troubleshooting, and future modifications much easier.
Connect the Breadboard and Arduino
Step 6: Connect the Breadboard and Arduino
With all of the components installed and wired, connect them to the breadboard and Arduino Leonardo according to the wiring diagram.
The breadboard is used to distribute power and ground connections while keeping the wiring organized. It also provides a convenient location for the LED resistor.
Before powering the controller:
- Verify that every wire is connected to the correct pin.
- Check that all buttons and switches are connected between their assigned pin and ground.
- Confirm that the joystick and IR sensor are receiving power.
- Make sure the LED includes a resistor.
Taking a few extra minutes to inspect the wiring can prevent many common troubleshooting issues later in the build.
Pin Assignments
- D2 → Cheek Button (Space)
- D3 → Sip-and-Puff Switch (Right Click)
- D4 → IR Sensor (Enter)
- D5 → Joystick Switch (Left Click)
- D6 → Microswitch (Escape)
- D7 → LED Indicator
- A0 → Joystick X-Axis
- A1 → Joystick Y-Axis
Test the Electronics
Step 7: Test the Electronics
Before completing the final assembly, connect the controller to a computer and verify that every input functions correctly. This is the website I used to test
Test the following:
- Joystick movement
- Joystick click (left click)
- Sip-and-puff switch (right click)
- Cheek button (spacebar)
- IR sensor (enter)
- Microswitch (escape)
- LED indicator
If any input does not work as expected, now is the best time to troubleshoot before the wiring is enclosed.
Install the Rear Electronics Compartment
Step 8: Install the Rear Electronics Compartment
Attach the foam-core compartment to the rear of the controller.
This compartment provides additional space for wiring, the breadboard, and other electronics. It also helps keep the build organized and protects internal connections from accidental damage.
Before permanently attaching the compartment, double-check that all wiring is secure and accessible.
OPTIONAL: now you can add a universal mic stand to the bottom by heating it up and melting it into the bottom
Organize the Wiring
Step 9: Organize the Wiring
Once all inputs are functioning correctly, organize the wiring inside the enclosure.
To keep the build neat and easier to maintain, I grouped the wires belonging to the same component together using bread ties. This helped prevent tangling and made troubleshooting easier if changes needed to be made later.
As you organize the wiring:
- Bundle related wires together.
- Avoid placing stress on connections.
- Make sure no wires interfere with moving parts.
- Leave enough slack for future adjustments.
Final Testing
Step 10: Final Testing
Before closing the electronics compartment, perform one final test of every function.
Verify:
- Cursor movement
- Left click
- Right click
- Spacebar
- Enter
- Escape
- LED operation
If something is not working correctly, make any necessary adjustments before sealing the enclosure.
This final test can save a significant amount of time compared to reopening the controller later.
Complete Assembly
Step 11: Complete Assembly
After confirming that everything is functioning correctly, close the electronics compartment and complete the final assembly.
Check that:
- Components are secure.
- Wires are not pinched.
- Adjustable components can still be repositioned if needed.
- The controller is comfortable to use.
The controller is now ready for use.
Testing, Use, and Remapping
Testing, Use, and Remapping
Using the Controller
Connect the controller to a computer using a USB cable. The Arduino Leonardo will automatically function as both a keyboard and mouse.
Control Mappings
Mouth-Operated Joystick → Mouse cursor movement
Joystick Press (SW Button) → Left mouse click and hold
Sip-and-Puff Switch → Right mouse click
Cheek Button → Spacebar
IR Motion Sensor → Enter key
Microswitch → Escape key
LED Indicator → Lights when the IR sensor is activated
Remapping Controls
One advantage of this project is that the controls can easily be customized through software. Simply change the code or ask Chat GPT to make changes, upload to Arduino IDE, and after plugging the computer into the Arduino, upload the new code.
By editing the Arduino sketch, builders can change:
- Keyboard outputs
- Mouse functions
- Button assignments
- Sensor assignments
After modifying the code:
- Verify that the wiring still matches the assigned pins.
- Test every control before use.
- Confirm that joystick movement remains correctly oriented.
The provided code already contains corrected joystick directions.
Current Pin Assignments
- D2 → Spacebar
- D3 → Right Click
- D4 → Enter
- D5 → Left Click
- D6 → Escape
- D7 → LED Indicator
- A0 → Mouse X Movement
- A1 → Mouse Y Movement
Troubleshooting
Troubleshooting
Arduino Not Recognized by the Computer
- Verify the USB cable supports data transfer.
- Confirm the correct board and port are selected in the Arduino IDE.
- Try a different USB cable or USB port.
Button Does Not Register
- Check all wiring connections.
- Verify the correct Arduino pin is being used.
- Inspect the button for damage.
Joystick Moves in the Wrong Direction
- The provided code is configured correctly.
- If you modified the code, verify that the joystick mappings have not been reversed.
Cursor Moves Without Touching the Joystick
- Increase the dead zone value in the code.
- Verify the joystick is centered and securely mounted.
IR Sensor Does Not Trigger
- Check power and ground connections.
- Verify the sensor output is connected to D4.
- Adjust sensitivity if your sensor supports it.
IR Sensor Triggers Constantly
- Reposition the sensor.
- Check for interference from nearby objects.
LED Does Not Light
- Verify LED polarity.
- Confirm the resistor is installed correctly.
- Check the D7 connection.
Wrong Key or Mouse Action Occurs
- Verify the code matches the wiring.
- Confirm that no pin assignments were changed accidentally.
Device Stops Working After Final Assembly
- Check for loose or pinched wires.
- Reopen the compartment and inspect all connections.
- Retest each component individually.