This project is the "Finger Freeflow Mouse" which is a device inspired by conversations with Vivek from the original Build2Gether competition. Back then I failed to deliver on that vision as my PCB design skills were still in infancy so I ended up with a very different end project. When I heard Build2Gether was back in a 2.0 form I opted to tackle this idea in earnest as there was a mobility section for the contest and I really wanted to build a useful device that could aid people in this way.
Mice give an unparalleled level of control when PC gaming. You can try to replace it with joysticks but it just isn't the same:
To emulate a mouse with a joystick you need to move the mouse in the direction the controller stick is moved and, most likely, increase or decrease the speed based on how heavily tilted the stick is in that direction. This makes moving the mouse harder as you need to completely pull the stick back in the opposite direction if you over shoot your intended goal. It also makes for very hard precision control relative to a mouse.
π‘ IdeaMy idea was to create a mouse that opens up possibilities for gaming by reducing the need for the user to physically move it around while still providing all of the same button and high precision control a traditional mouse provides.
The general idea is a bit like this:
The mouse sits on a baseboard centered for use by someone comfortably with limited mobility. The baseboard contains several screw eyes aligning to each side of the mouse allowing for 2.5mm elastic cords to be passed through from the mouse and tightened. The mouse as such is able to hover over the board. Kind of creating the experience of a one person "Ouija board" that defaults back to its normal position but has some resistance from every angle to allow for it to be moved in that direction. It's as accurate as a normal mouse when a user wants to control it (and positioned such that buttons are in a more optimal location) but also still stationary for limited mobility use
Additional buttons on the mouse will provide input means for the user. They need to be very sensitive to toch such that they can trigger immediately on user activation.
π¦ΈββοΈ Thank You Project Sponsors!I'd like to thank JLCPCB / JLC3DP for sponsoring the Freeflow Mouse PCB board I used for the project and providing a resin printed piece that I used for the mouse cover. The resin really makes for a nice surface to touch the mouse and it really brings things to life -- I was surprised with how well it came out given it was my first time with a resin print. The team over at JLC3DP was great in that they confirmed about support usage to get it printing perfectly so I didn't have to worry about the intricacies of resin printing. The PCB looks great and has worked great for my needs. The whole process on the JLCPCB and JLC3DP site was straightforward and the product arrived quickly. The connection to EasyEDA made use of the site simple as well as one can export directly to JLCPCB for ordering after creation.
I'd also like to thank the sponsor PCBWay for providing the contest coupon for use with their services. I utilized their services for the Mouse Buddy PCB I designed. It worked great and fit perfectly with my main board PCB. I plan on using the Mouse Buddy for all sorts of projects in the future and it really turned out so well. Their website can be referenced for information about their services but I will say every time I've used them I've been impressed with their quality and speed at which the board arrives.
In addition to the PCB manufacturers I utilized the Xiao ESP32S3 from the sponsor Seeed Studio. I've used the Xiao boards extensively in the past and knew it would make for a great microcontroller for this project as it is small, has no components on the bottom, and price effective.
π« PCBsMouse Buddy
The Mouse Buddy PCB utilizes a PMW3360 for movement. It acts as a core board for various mouse related projects. It needs 1V9 voltage for powering the device so a voltage regulator was needed. Aside from that it expects only 3V3 and anything more will likely damage the sensor. The components and layout were structured to allow the board to be reused for various projects by either plugging in via the headers or using a cable to connect.
Freeflow Mouse
The Freeflow Mouse PCB has a few elements that help it work together with the core board to act as a full mouse. Primarily it exposes headers for connecting to the Mouse Core providing it the 3V3 power and additional connections for each of its associated pins. To add to the polish of the experience some sk2812 mini LEDs were also added along with a level shifter to provide 5V for the signal. A MPR121 was utilized to provide touch control for the buttons.
The code for the project is attached. It's fairly straightforward and really is the combination of neopixel lighting, MPR121 touch button control, and the PMW3360 for movement. It utilized USB-OTG for allowing the device as a USB mouse.
First it's imperative to setup the Xiao as you would normally for Arduino. Seeed's wiki has more information on this process but the short of it is you add the board definition file for the espressif boards to your board definition list in settings and it allows the ESP32 based boards to be added to your list.
Once that's done you'll need the following libraries as well:
With those in place using the attached code you should be able to build and deploy the mouse.
Print the three STL files. They are assembled by snapping the boards onto the 3D prints. I used heatset inserts to allow m3 screws to hold the cover tightly to the base when it's sandwiched in. To install these I used my soldering iron and pushed them into the holes along the base.
For passing the connectivity I utilized conductive paint painting the buttons but this wasn't enough so I had to use double sided copper tape to further allow the connection to work. You can see it in my images below but placing some below the finger spots attached to the conductive paint and above the buttons on the PCB worked well for this purpose.
After the parts are assembled the mouse should be attached to a baseboard to allow it to move around. I used eye screws around the exterior to fix the four points around the print to the outer board. In this way it hovers above the board ever so slightly.
The mouse has various buttons including:
- Increase and decrease sensitivity (indicated via the onboard LED color as to the level)
- Back and forward mouse buttons which move you through browser history (usually on the side of gaming mice)
- Left click
- Right click
- Middle mouse button
- LED toggle for the underlying LED effects
- Thumb button for toggling movement
The mouse can be used by pressing down on the thumb button and then pushing the device. This will move the cursor until you remove your thumb from the button. Releasing this allows you to spring back to the default position and further push the mouse from there. The benefit to this approach is that by having the mouse reset each time one does not need to pick up the mouse to readjust it but can rely on it going back.
π ChallengesI had originally planned on using magnets to further hold the board up but that didn't work out well given the polarity acted odd when the magnet was turned to its side. I opted instead to rely on a lighter board and utilizing the strings more heavily.
The buttons also struggled to respond without heavy amounts of copper tape. In future iterations it would likely make sense to rely less on conductive paint as it wasn't as effective at transmitting the signal as I had hoped. It took a lot of additional tape to get the mouse to where it is today working so I think it's definitely an area it could be further improved.
The elastic bands have worked well but I feel like it's one of the elements of the project that could be replaced in a future iteration for a more effective rebound mechanism. Additional experimentation into better forms of resistance (large rubber bands perhaps) could be useful for future iterations.
One mistake I made earlier on was to use a Xiao ESP32C3. It worked well for my demo code trying out the MPR121 and PMW3360 components but it doesn't support USB-OTG so I had to desolder the microcontroller and replace it to get the final product working.
This was my first project utilizing a QFN-20 footprint component. I struggled heavily getting it in place but ended up succeeding in the end. I found using my heat gun on the footprint with the solder paste initially, dragging the component over the hot solder, and then positioning it perfectly over the solder points worked well. I think in retrospect I'd surface additional test points on the PCB if I were to use a QFN-20 part again to confirm I don't bridge any connections but things luckily worked out here.
Comments