KMAK · 20.18 · The Work Bench · essay ·
Yay, It Moves
Scotty the rover: a chief engineer, a farm dog, the Saturday he first drove, and the paper clip that did not work.
Scotty is a six-wheeled rover about the size of a shoebox, with a solar panel for a roof and two ultrasonic eyes in front. He came as a kit, a SunFounder GalaxyRVR, with a rocker-bogie suspension copied from the Mars rovers, an Arduino for a body, a camera board for a head, and a phone app that let you drive him around the kitchen. Aldo and I brought him home from the Maker Faire at Mare Island in the fall of 2023, built him stock, and drove him around the kitchen. Then we decided the app had to go. This is how he came to drive: two Saturdays, a Wednesday, a paper clip that did not work, and the sentence I typed at 11:23 at night.

He is named for Montgomery Scott, the chief engineer of the Enterprise as Martin Quinn plays him in Strange New Worlds, warm and scrappy and unwilling to give up. His temperament comes from somewhere else, from Rover, my mother's dog on the farm in Grey Eagle, Minnesota, who was happy-go-lucky, a little goofy, and endlessly enthusiastic about the yard. A rover named after a dog named Rover was too much even for us, so the dog gave him his spirit and the chief engineer gave him his name. The rover is both. When his WiFi drops he turns slowly in place, pulsing red, looking for the signal. That is not a bug. That is a chief engineer refusing to quit, and a farm dog looking for the way back to the porch.
Saturday, May 31
The plan on the morning of May 31 was modest. Replace the manufacturer's app with a page in a browser, mission control style, so any phone or tablet in the house could drive him. I had never done an embedded project. I asked Claude to walk me through it step by step, and it estimated six hours.
The first thing that went wrong was the battery. Scotty's own network kept appearing and vanishing at arm's length, which looked like a crash loop and was a brownout. So he went on the charger and we designed the interface while he charged. The first mockup was amber on black, NASA style, and I looked at it and said what I actually thought, which was that it would be boring in time, and could we go more Star Trek. By nine that evening it was LCARS: black panels, an orange elbow in the corner, condensed fonts, the whole bridge. Three layouts, one for the laptop with every readout, one for the iPad, one for the phone, switching on whether you had a mouse or a thumb.

The first flash of the new firmware went in from my phone, because switching the laptop over to the rover's network would have dropped the session. AirDrop the binary, join the rover, upload. "Super easy. Scotty is rebooting now." At ten past nine the placeholder page came up at scotty.local, and at twelve past, the buttons registered and nothing moved.
The next two hours were the protocol hunt. The camera board and the Arduino talk over a serial line, and the firmware I had replaced had been speaking a language the Arduino did not answer. We tried the packet format from the manufacturer's current source, with start bytes and checksums. Nothing. I photographed the boards under the solar panel and the green lights were blinking, which in the stock firmware means idle, which meant nothing was getting through. A diagnostic endpoint proved the wire was alive. A keep-alive I had added was flooding the Arduino with a greeting every three seconds until its buffers choked. Just before eleven, the Arduino answered a probe with a line of JSON: battery 7.33 volts, obstacle at 68 centimeters. It was talking. It just was not listening to what we were saying.
The answer, at nine minutes past eleven, was that the firmware the manufacturer had shipped for the Arduino was compiled against an older version of their own library, which never used the binary format at all. It wanted plain text, fields separated by semicolons, the servo in field three, the left motor in field ten, the lamp in twelve, the right motor in sixteen. All the binary code came out. At 11:23 that night I typed the sentence this piece is named for. Yay, it moves. Motion works, the lights don't turn on and off though, but that's all for tonight, awesome.
The wall
The camera took three more weeks and most of a Wednesday. The video stream came up white in Safari, because Safari does not play that kind of stream, and we are Apple people in this house, so the page learned to ask for one still frame after another, as fast as they arrived. At 5:21 in the afternoon on June 24 I saw the ceiling, slowly, in three phases. Scotty could see.
Then updates stopped working. Every new firmware stalled partway through the upload, at 13 percent, at 50, at exactly 134 kilobytes, over and over. The cause turned out to be physics. Writing to flash on that chip stops the radio for a few hundred milliseconds at a time, and the connection would collapse somewhere random. My idea, and I am proud of it, was to flash a tiny firmware first, one that did nothing but hold the WiFi open, and then send the real one through that. It worked once. Then the real one failed from inside the tiny one too.
The fix that stuck was to have the tiny firmware receive the entire new program into memory, all of it, before touching the flash, then drop the WiFi and write with nothing left to interrupt. That is the update procedure to this day, and it takes seconds. Before we got there, though, we tried the cable.
Saturday, June 27
The Arduino under the shield has a USB port, and the port is USB-B, the big square one from printers. What in the world are they thinking. Didn't that go out in the nineties. I ordered a cable and it arrived by Saturday, and the plan was one physical flash and never again. The chip needs a pin held to ground while it powers up to accept a program, and the jumper wires would not stay on, so I bent the paper clip off that morning's receipt from Plank Coffee and bridged the pins by hand. Fifty connection attempts, zero bytes back. Then zero bytes on a normal boot, in both positions of the mode switch, which meant the port was not wired to the camera board at all, in any mode, on this hardware. The cable could never have worked. The paper clip goes in the record anyway.
That was nine thirty in the morning. Vangelis was on, the Blade Runner score, and it stayed on all day. By ten the memory-buffered update had done its trick and the LCARS interface came up on my phone for the first time, spiffy, with the camera sideways. By eleven the Arduino was running an empty sketch from the cable attempt and there was no copy of the manufacturer's program anywhere on my Mac, so we wrote our own from scratch, no library, pin numbers pulled from their repository. Scotty promptly drove in circles on his own, because nothing told the motors to stop when the commands stopped. He got a half-second timeout. Then he stuttered, so the page got a heartbeat.

At noon I asked whether he could patrol by himself, in a widening circle. Outer wheels steady, inner wheels ramping, a cyan pulse on the lights. Ten minutes later I took him outside, onto the gravel of our back yard, which is Zen-inspired by design and makeshift Mars by adoption, and he climbed the wall, and the WiFi died out there, and I went off to my chores leaving two notes: a way to handle losing the signal, and a spiral that backs up and turns when something is in the way. When I came back he had an ultrasonic threshold of 22 centimeters, infrared sensors on both flanks, a back-up-and-turn routine with amber lights, and a watchdog that told the Arduino when the WiFi was gone. His patrolling was working perfectly. I said so at 2:06.

The afternoon was the battery, and the battery won. I wanted him to notice when he was below twenty percent, check whether he was in the sun and charging, and wait until eighty before continuing his mission, which is a good idea and still is. What happened instead was a readout of 73 percent next to a Low Power warning, then a red lockout the moment the drive stick was touched, because the voltage sags under load, then a yellow charging lock at 67 percent that ignored everything. At 4:12 I cancelled the demo I had promised Aldo. We stripped the battery logic entirely. Known-good behavior first. Then the camera board went into a reboot loop, the crashes twitched the motors through the serial line, and I said the thing you say at hour ten, that he needs a lot more self-diagnostics when he boots up, because he always seems to be off in some way. He got them. At 6:30 we moved him next to the router, caught the boot window, flashed twice, and at 6:33 I wrote: Success! I'll go demo, and then we'll figure out the battery issue. The demo was for Aldo.
Aldo had come by in the middle of that afternoon and asked what runs where. The browser loads the page from the Mac once, then talks straight to the camera board. The camera board owns the WiFi and the API. The Arduino owns the wheels, the servo, the sensors, and the lights. He pointed out that the rover could serve the page itself and cut the Mac out. He is right, and that is the end state, and we have not done it, because during development reloading a page beats reflashing a board.
What he is now
Scotty drives from a phone with two on-screen sticks, orange for the wheels and teal for the camera tilt. He sees at about three frames a second, which is enough. He patrols in a spiral, backs away from walls, and looks for the WiFi when it drops. He heals his own camera when it hangs and logs every step of his boot. Updates take seconds. The battery reads zero, on purpose, until somebody puts a meter on the divider. He has a reference manual eleven hundred lines long, written two days after the marathon because I thought it was pretty cool and said so.

He does not talk yet. The voice is written. Twenty-one lines in six folders, waiting on a small speaker that fits in the three quarters of an inch above his nameplate, and on a Scottish accent we have not cloned yet. The first speakers we ordered for him arrived twice as many and twice as big as expected, and became a different project, three small sculptural speakers that will get their own transmission here. When he does speak, he will boot with "Scotty online. Let's see what's out there," and when he meets a wall he will say, "She cannae go that way, Captain."
That is the Work Bench. A kit becomes a machine when you throw out the part that tells it what to do and write that part yourself, badly, then better, on a Saturday with the right record on. Six hours were estimated. It took two Saturdays and a Wednesday. Somewhere in the middle of the second Saturday a small aluminum rover with a paper clip in its history climbed a wall in my backyard on its own initiative, and I have not stopped smiling about it.
Sources: the project record and the build log compiled on September 25, 2026 from the two build sessions (May 31 and June 24 to 29, 2026), the project's own documentation, and the rover's reference manual. Quotations are from the session transcripts, lightly punctuated.
Related: The Machine Question, the thesis that asked whether a machine could answer, and Three Times, where the accent comes from.