Our Maker in Residence, Toby, and our Head of Documentation, Alasdair, were both talking about the idea of a Raspberry Pi RP2040-powered watch. While they were looking around to see if anyone else had already come up with the idea and made one, they stumbled across an RP2040-based 1.28-inch TFT display and watch board on Tindie.
So, with all the engineers at Pi Towers apparently too busy to bow to their watch-needing whims, they went ahead and bought a couple to play around with.
Tindie’s version is priced at $35.50, but what looks like the same board can be found much cheaper on AliExpress if you have the skills to brave that particular shopping experience.
The watch Toby and Alasdair purchased comes in two parts: a board with the screen, and a RP2040 main board. The watch came with a strap but not a battery, so they used this inexpensive rechargeable lithium polymer battery, although since the JST battery connector on the main board was an unusual size they both opted to pull it off and solder their batteries directly the contacts on the board rather than try and source the odd connector.
While the watch does ship with pre-installed firmware, which displays a simple watch face, there was no documentation at all. So Alasdair set about reverse engineering to try and find out more about the hardware. At the same time, Toby began designing a 3D-printable case that other Raspberry Pi watch-wanters could replicate themselves. The STL files for that case are available for free on Printables.
Scouting for software
Alasdair poked around inside the firmware and found that the unidentified display was a GC9A01, which meant the display was driveable via SPI from both CircuitPython and MicroPython. He also identified the IMU on the board as a QMIC88658, and which of the I/O pins on the RP2040 the three user-facing buttons were attached to.
Things started to speed up when he discovered that the watch they’d found on Tindie looked really similar to a Waveshare board that used the same 1.28-inch display, and that with a little bit of tweaking for which pins were connected to what, the Waveshare example code worked more-or-less out of the box on their watch. Finally, he stumbled across the GitHub repo for the firmware which shipped on the watch. Which felt to him like a good place to stop.
Alasdair modified his own RP2040 watch so the display is oriented with the top towards his hand, because “that way I can see the time properly when I’m typing“, which is weird of him, but no more than we’ve come to expect.
This is the code Toby and Alasdair used on the final versions of the watches you see pictured in this post. Dive in with some suggestions if you’ve had a go at integrating the buttons and motion sensors on the watch, we love a good upgade. You can find the pins they’re connected to in Alasdair’s “Hello World” example code.
Lastly, if your preferred learning style is to scroll through a Twitter thread detailing Alasdair’s entire thought process as he worked through this whole make-the-watch-work thing, go here.