LOVOT is a family robot made by the Japanese company GROOVE X. It isn't built to be useful. It's built to be loved. After meeting one, I wanted one. But it costs ¥599, 500 (about $3, 800) and is only sold in Japan.
So I'm building my own, starting from a robot car kit: the Freenove 4WD Car Kit for ESP32 (SKU: FNK0053). I call it Nova, a nod to Freenove and to the Latin nova, "new." I wanted a new kind of pet.
This write-up covers step one: getting Nova to wander around a room on its own, and looking a little alive while doing it.
What Nova does now- Wanders. It stops, looks ahead, left, and right with its head, picks a direction, then drives for a random 1 to 3 seconds. Then it stops and looks again.
- Notices. If something appears in front while it's driving, it stops at once and its eyes go wide.
- Works its way around. If the way is still blocked, it backs up a little, checks left and right, and turns toward the open side.
- Gets unstuck. If it's pushing against something it can't see, it shows a "?" in its eyes, then backs up and turns.
- Blinks, and starts and stops smoothly instead of jerking.
Hardware changes from the stock kit
1. Eyes and distance sensor together on the neck
The kit's manual doesn't cover using the LED matrix and the ultrasonic sensor at the same time, and the stock cable only lets you connect one or the other. I wanted both on the pan-tilt head: the LED matrix as eyes, the ultrasonic sensor to measure distance wherever Nova looks.
- The LED matrix keeps the kit's stock cable.
- The ultrasonic sensor gets a homemade 4-pin cable: about 150 mm, AMP MODU-compatible connectors on both ends, wired straight (VCC, Trig, Echo, GND in the same order on both ends). It plugs into the header marked for the ultrasonic sensor on the car board.
Before powering on, check the pin labels on both the sensor and the board. Swapping VCC and GND can damage the sensor. This works in my setup; it is not an officially documented configuration.
2. NiMH batteries instead of 18650 cells
The kit calls for two 18650 lithium-ion cells. I use six NiMH rechargeable AA batteries: about 7.2 V nominal, close to the 7.4 V of two 18650 cells.
- An XT30 connector pair with AWG16 leads lets the battery box snap off. The female side goes on the battery box, the male side is soldered to the battery holder's terminals on the car board. The board's power switch still works.
- Use NiMH rechargeable batteries only. Six alkaline AAs give a higher voltage.
- Check the polarity with a multimeter before the first connection.
- AWG16 wire is thick. My 15 W iron struggled; use 30 W or more.
- The leads on my battery box are thin (probably AWG24 or thinner). I haven't replaced them yet, but I recommend AWG18 or thicker.
Everything is non-blocking (no delay()), and split into three layers:
- hal/: the only place that touches hardware (motors, servos, sensors, LEDs).
- core/: sensor readings, obstacle judgment, a safety layer, and an arbiter.
- behaviors/: one file per behavior. Each behavior reports a priority, and the arbiter runs only the highest one. That's how "notice" interrupts "wander."
A few rules make it feel less like a machine: notice with the eyes first, then the neck, then the body. No sudden starts. And never trust a single distance reading: the head must be still, and several readings must agree.
All tuning values (speeds, times, distances) live in one file, config.h.
I manage a software team, and for years I hadn't written much code myself. For this project I set a rule: let Claude Code write as much of the code as possible, and spend my own time deciding what Nova should do.
What made that work was the paperwork, not the prompts:
- A rules file (
CLAUDE.md) with the goal, the hardware layout, the design principles, and the coding rules. - A behavior catalog (
docs/catalog.md): 26 behaviors, each with an ID, a difficulty, and its dependencies. Seven are built so far. - One behavior per request. Each one gets a short spec first (
docs/specs/), then the code. - A handoff note (
docs/handoff.md) that every session reads first: where we are, what's in progress, what's next. - A decision log and a measurements log, so that tuning values come from real tests on the robot, not guesses.
- Uploads to the robot only when I say so.
All of these files are in the repository. They are in Japanese, but the structure is easy to follow.
Build and uploadThe project is built with PlatformIO. Clone the repository, open it as a PlatformIO project, then:
pio run
pio run -t upload --upload-port <your port>
pio device monitor -b 115200The README has the details, including notes for the Arduino IDE (untested).
Limits, and what's next- Walls at a shallow angle. The ultrasonic sensor gets no echo from a wall at less than about 30°, so Nova can still brush against one. The "gets unstuck" behavior handles it afterward.
- Turning angle. The kit drives its motors open-loop, so Nova can't tell how far it actually turned. Next, I'm adding a gyro (LSM6DSV16X) to measure it.
- More behaviors. After that, I'll keep adding pet-like behaviors from the catalog, one at a time: looking around before choosing a path, noticing when it's picked up, getting sleepy.









Comments