A story by Josh Main — 26/09/26
Reviving Casio's first wrist camera with a Raspberry Pi Pico, an IrDA 3 Click, and a lot of trial and error.
I love old tech. I'm a big fan of the old Sony Cyber-shots, so when I found a wrist camera from the year 2000, I had to have it.
Around the 2000s, Casio were putting everything into watches. TV remotes with calculators (yes, in one watch), TeleMemo watches to store and move your contacts, even blood pressure monitors! The WQV-1 was Casio's first wrist camera, and the world's first wristwatch with a digital camera. It takes 120 × 120 pixel photos in 16 shades of grey and stores up to 100 of them. They later released colour revisions, something I plan to expand the software to support, but I only have a WQV-1, so we are going to focus on that!
The £20 rescue
I picked mine up "broken" on Facebook Marketplace for about £20. The only real problem was the battery. It had leaked, so the job was a new battery and a clean of the corrosion and battery acid. A nice easy repair! After that it was good as new, and quickly became a highlight of my watch/vintage tech collection.
A month or two in, I wanted the photos off it. I assumed there'd be a cable... don't ask why. We know there wasn't.
Why it's hard
The WQV-1 only talks over IrDA, the infrared standard laptops and PDAs used before Bluetooth took over. It's from well before my time, and the internet is full of people calling it a nightmare. On top of that, the watch is fussy about how it's spoken to.
The official route was Casio's own IR adapter and software, which is now pricey and very hard to find. The community route was a vintage Palm OS PDA. I tried neither first, which in hindsight was a mistake.
The dead ends
I spent the next few months trying cheaper ways in:
- A paper-feed sensor from an Epson printer. It's an infrared emitter and receiver, so why not? It was free off Marketplace! But because it's a sensor that spots paper, it wasn't built to decode fast, precisely timed IrDA pulses. It didn't work.
- A medical-grade IrDA adapter plus a serial-to-USB cable. An RS-232-to-infrared adapter, an IR220, driven through a USB-to-RS-232 cable, because neither of my laptops has a serial port. I never got the watch to talk to it, no response.
- Soldering a bare Vishay TFDU4101 transceiver. This is the actual IR chip you need, and I ordered two. They were far smaller than I expected. My record was two wires soldered on, and my dad managed three, but none were secure enough to trust even if we did get all of them soldered in.
- A 3Com Palm III. The "proper" community route. It runs Palm OS 3.3 and has IR built in... get this though! I forgot that you need a cradle or cable to install the software that talks to the watch, and mine came with neither! Back to square one!
Every one of those cost money, and I went over budget more than once (importing the TFDU4101's were not cheap). As all personal projects do.
The breakthrough: let someone else do the soldering
The fix for my soldering problem was a MikroElektronika IrDA 3 Click. It's a small ready-made board with the same TFDU4101 transceiver already fitted, plus an MCP2122 chip that turns ordinary serial data into IrDA pulses and back. No fine-pitch soldering, just header pins.
I had a few boards ready to try. I wired it to an Arduino Uno while trying to get the Palm III syncing, but decided something more basic would be more suitable. My original plan was an Adafruit QT Py SAMD21, but now the 3 Click had a MCP2122 chip, I didn't really need the decoder anymore. In the end I settled on a Raspberry Pi Pico, because I've had it ages, it's easy for the community to buy and appears on a PC as a normal USB serial port.
The Pico doesn't do anything clever. Its firmware just copies bytes between USB and the Click, and all the real work happens on the PC with my open-source software!
The wire that caught me out
The Click has a reset pin, RST. If it isn't held high, the chip sits in reset and does nothing at all. No sending, no receiving, no errors. My setup looked right but stayed silent, and the culprit was RST not getting power. Now the firmware drives it high on start-up, and the wiring guide warns about it in bold.
29 photos
With RST sorted and a rough Python debug script on the PC, the watch finally answered. I downloaded all 29 photos off it. It took about five minutes, and I've rarely been happier watching a progress bar.
How the watch talks
The WQV-1 speaks a cut-down version of IrDA's link layer. Marcus Gröber documented it years ago, and his notes were the starting point for everything here.
In plain English, a download goes like this:
- Hello. The PC shouts a short "hello" every 200 ms until the watch answers.
- Introductions. The watch replies with its clock. The PC echoes that back and assigns the watch an address for the rest of the conversation.
- The header. The PC asks for every image. The watch says how big each photo record is (7,229 bytes) and how many photos it holds.
- The data. The PC asks for the photos 128 bytes at a time. Every request and reply carries a rolling sequence number, so if a packet goes missing the PC asks again for the same one and nothing gets duplicated.
Every message is wrapped in a frame with a start byte, an end byte and a simple checksum. Certain bytes inside a frame are "escaped" so they can't be mistaken for the start or end.
Each packet takes about 180 ms, which works out at roughly 0.7 KB/s. At 115,200 baud, 128 bytes only take around 12 ms to send, so most of that time is spent waiting for replies. That's where I'll look first when I try to speed it up.
Correcting the old notes
Getting bytes off the watch was only half the job. Turning them into the right pictures with the right dates meant checking the old documentation against a real watch, and two details needed fixing.
The pixel order. Each photo is 120 × 120 pixels with 16 shades of grey, so every byte holds two pixels, one in each half (nibble). Gröber's notes don't say which half is the left pixel. Guess wrong and every pair of pixels is swapped, which gives a picture that's almost right but oddly jagged. On my watch's photos the low nibble is the left pixel, and the result is clearly better.
The time. Each photo stores when it was taken as five bytes: year, month, day and two for the time. Gröber's notes list minute before hour. Testing on my photos, it's the other way round: hour, then minute.
Interestingly, both of my findings match Kees Jongenburger's notes on the later WQV-2. That's a good sign the WQV-2 will work too, although it's untested, and his notes say the WQV-2 counts months from zero, so its dates would currently show a month early in the app.
None of this takes anything away from Marcus and Kees. Their work is the backbone of this project, and I've documented each correction in the repo so the next person doesn't have to find them the hard way.
From script to app
A Python script that only I can run isn't much use to anyone else, so I turned it into Open WQV Link. A desktop app for Windows and Linux, with macOS builds that are still untested. I built it in C# on .NET 8 with Avalonia.
What it does:
- Sets up the Pico. It finds the board, flashes the firmware and walks you through a hardware test. No Arduino IDE needed.
- Downloads every photo. It handles the whole conversation with the watch, including checksums and retries, and records the raw session so problems can be diagnosed.
- Saves proper files. Every photo becomes a PNG (or BMP) with its original name and capture date stored inside. I wrote the PNG and metadata code myself instead of pulling in an imaging library.
- Shows a gallery. Browse, enlarge and export your photos.
- Comes with a command-line tool for people who'd rather script it.
Testing without a watch
This was a first for me, I was consulting Claude on how to open-source a project without issues and tests were suggested. The test suite includes a simulated WQV-1 that behaves like the real thing, including dropped replies and corrupted checksums. That means the protocol code can be tested on any machine, with no hardware attached, every time I change something.
Build your own
You need a WQV-1, a Raspberry Pi Pico, an IrDA 3 Click, five jumper wires and a USB data cable. That's about £30 in parts, with no soldering if your Pico has headers. The wiring guide, setup guide and downloads are all on GitHub, and it's MIT licensed.
What's next
- Speed. Five minutes for 29 photos is slow. Most of it is waiting on replies, so I'll measure where the time actually goes before promising anything.
- More boards. The Pico 2 and other microcontrollers, including the bare TFDU4101 route with a SAMD21, for anyone braver with a soldering iron than me.
- The WQV-2. If you own one, I'd love you to test it and tell me what happens.