October 5, 2025
Description
What we've got here is a model that allows you to build a wireless mouse from scratch. This is just the base of a mouse. The idea is for this to serve as a starting place for a custom mouse of your own design. I'm looking forward to seeing what sort of remixes people come up with.
Fair warning: You'll need to be fairly comfortable with soldering and wiring for this project. It also doesn't hurt to have some familiarity with the Arduino IDE and C/C++ programming.
In addition to the models here, you'll need:
Note: With a 500mAh battery, you'll likely get about a day or two off a full charge.
Print one of the “mouse” models. I found PLA to be perfectly fine. No supports required.
If you want a scroll wheel, print the axle at the finest layer height you can manage (I used 0.07mm). Once you've got the axle, print “axle-test” and check which hole it fits best in (2.0mm works best for me), then print the corresponding “wheel” model. The axle should fit in the wheel so that it slides in but tight enough that it doesn't slip.
Chances are the firmware on the Feather is not up to date. Follow the instructions on this page to update the firmware. You just need the app and to supply USB power to the Feather for this. NOTE: The Feather will remain in “DFU” mode for 5 minutes after the update, during which time it's unlikely you'd be able to program it using the Arduino IDE.
Check to make sure the lens is attached to the PMW3610 breakout board properly. You don't want the lens falling out while using the mouse. If it seems loose, you have 2 options: a) carefully melt the plastic posts with a soldering iron, or b) put a drop of glue on each post.
On the PMW3610 breakout board, solder together pads 1 and 2 on JP1 (not J1).
Solder wires to the microswitches (just the 2 pins closest to the plungers). I added crimp pins to mine so I could rewire as needed. If you're feeling brave, you can solder directly to the microcontroller.
Slip the wires through the holes on the button bracket and press each switch in place. It should be a tight fit with the unused pin hanging off the back of the bracket.
Solder 3 wires to the scroll wheel encoder. Best to use 3 different colors. With the PCB (non-metal) side facing you, the pins are A, B and C. Make a note of which wire color corresponds to which pin.
Slip the encoder into the scroll wheel bracket, with the metal side facing down and away from the center of the model. Pull the wires through the bottom of the bracket.
Insert the wheel into the scroll wheel bracket. The hub of the wheel should be facing the encoder.
Insert the axle through the holes in the bracket, encoder and wheel. This might take a bit of twisting and wiggling since the holes aren't necessarily lined up. The axle is longer than required, so you can cut off any excess. If you need to remove it at some point, you can push it out with a paperclip or jeweler's screwdriver.
The following are all “ground” and should be connected together (I used a 6-pin header for this):
The remaining connections depend on whether you're using an M0 or 32u4 Feather:
| Connection | M0 BLE | 32u4 BLE |
| PMW3610 board J1 VIN | 3V | 3V |
| PMW3610 board J1 SDIO | A0 | A0 |
| PMW3610 board J1 SCLK | A1 | A1 |
| PMW3610 board J1 nCS | A4 | A4 |
| Scroll wheel encoder A | A2 | SDA |
| Scroll wheel encoder B | A3 | SCL |
| Left button switch | 9 | 9 |
| Right button switch | 10 | 10 |
| Middle button switch | 11 | 11 |
Note: The source code for this design allows for 2 additional mouse buttons (back& forward) using pins 12 and 13.
I used fairly bulky connectors here for prototyping purposes. I've done one of these with heat-shrink tubing around the connections instead of plastic housings, and it was much more compact. Use whatever works for you.
With the lens facing down and J1 on your left, snap the PMW3610 breakout board onto the inner 4 posts. The lens should line up with the hole in the bottom of the model.
With the USB port facing towards you and the top of the board facing down, snap the Feather onto the outer 4 posts.
Insert the battery into the slot and connect it to the Feather's charging port. Note the polarity of the wires on the connector. Some batteries have the opposite polarity for some reason.
Add 3 or more skates to the bottom of the model.
You're going to need to set up the Arduino IDE for this (instructions here). Follow the instructions on this page for the M0 and this one for the 32u4. You'll also need the BLE library (M0 page / 32u4 page). At this point you can either play with some of the examples they've got, or barrel ahead with loading the mouse code.
To load the mouse code:
If all goes well, you now have a working wireless mouse. It should show up as “SD Mouse” in the list of Bluetooth devices on your computer or phone. You can always change the “SD ” on line 17 of the code to whatever you want, to help identify it in the devices list.
There are 4 debug flags starting on line 30 of the source code. If you change one or more of these to “true” and re-upload the sketch, the IDE's serial monitor will display debug messages. This may be useful if one or more of the mouse's functions isn't working as expected. Just make sure to switch them back to "false" when you're done.
Also, if the scroll wheel is scrolling the wrong way, you have 2 options: a) swap wires A and B on the mouse, or b) swap the values of SCROLL_PIN_A and SCROLL_PIN_B on lines 57-61 and re-upload the sketch.
When making a housing to fit around this, make sure there's enough clearance around the components and that the scroll wheel turns freely.
Keep in mind that the USB port on the Feather is used both for programming the mouse and for charging the battery. You'll probably want that accessible from the outside.
And here's the same mouse with most of the PLA connectors replaced with heat shrink tubing. Slightly less bulky.
I've provided as much information as I could. I might've made some mistakes or omitted a step or two. If I did, let me know and I'll update the instructions.
However…
The information provided here is for general informational purposes only. I assume no responsibility for errors or omissions in the content or for any actions taken based on the information provided. Links to external websites are provided for convenience and do not imply endorsement. I am not responsible for the accuracy, reliability, or content of third-party websites. Use of these instructions is at your own risk, and I am not liable for any damages arising from their use.
License:
Creative Commons — Attribution