2025

Nuvi

Every part below is clickable. Open one to see what it does, how it was printed and why it is shaped that way. Nuvi was born from a request by Arduino: a robot assistant around the new UNO Q that could really do things. The first design worked but felt like a machine; the second took a Shiba Inu as its model. Keeping it under 30 cm left almost no room inside — every wire and motor had to fit — and the neck, a head that moves with no visible cables or levers, is the part that took the most work.

Published on Arduino Project HubArduino Project Hub ↗

FilesOpen source project (GPL-3.0): the 3D models and the app are published on Arduino Project Hub.

3D models and app on Arduino Project Hubprojecthub.arduino.cc ↗
6servomotors
< 30 cmtall, by design
1board for body and mind
Loading the model…

Components

Every printed part, with its function and print settings.

Body

body

The central shell everything else hangs from: it carries the leg servos, the electronics holder and the two covers. It is the largest printed piece and the one that sets every tolerance downstream.

MaterialPLA+
Layer0.2 mm
Infill25%
Print time14h 30m
Supportsno

Printed in one piece to avoid a seam across the part that takes the most load.

Front body cover

front_cover_body

Closes the chest and gives the robot its front profile. Removable without tools, because the electronics behind it have to be reached during calibration.

MaterialPLA+
Layer0.2 mm
Infill15%
Print time4h 10m
Supportsyes

The second touch sensor is behind this panel — the belly. Thin wall here too, and no infill in the sensing area, so a hand is read reliably.

Back body cover

back_cover_body

The rear half of the shell. Curved on both axes, so it is the part where layer height shows most and where a finer setting was worth the extra hours.

MaterialPLA+
Layer0.16 mm
Infill15%
Print time5h 45m
Supportsyes

Bottom cover

body_bottom_cover

Closes the underside of the body and keeps dust out of the servo bay. It is the panel that comes off first when something has to be checked.

MaterialPLA+
Layer0.2 mm
Infill15%
Print time1h 20m
Supportsno

Front face plate

front_face_plate

The flat plate the display sits behind. Thin, so it was printed on its back with a raft to keep it from warping at the corners.

MaterialPLA+
Layer0.16 mm
Infill20%
Print time1h 45m
Supportsno

Face screen

face_display

The 3.5 inch screen behind the face plate: it is where the expressions appear, and the single element that gives the robot a face at all. Not printed — it is an off-the-shelf module — but the whole front of the head is drawn around its exact size.

ModelSPI display 480×320, 3.5"

The face plate is a bezel: its window sets how much of the screen is visible, so the two were revised together.

Head shell, left

head_sx

Left half of the head. Splitting the head in two along the centre line meant no supports on the visible surfaces, at the cost of a seam that has to be sanded.

MaterialPLA+
Layer0.16 mm
Infill20%
Print time7h 05m
Supportsno

Head shell, right

head_dx

Right half of the head, mirrored from the left. The two halves close on a lip rather than a flat joint, so they stay aligned while the glue sets.

MaterialPLA+
Layer0.16 mm
Infill20%
Print time7h 05m
Supportsno

Head cover

head_cover

Closes the top of the head over the neck coupling. Comes off to reach the head servo without taking the two shells apart.

MaterialPLA+
Layer0.16 mm
Infill15%
Print time2h 35m
Supportsyes

A capacitive sensor sits against the inside of this cover: it is the spot the robot expects to be stroked, so the wall was thinned locally to let the touch through.

Muzzle

head_muzzle

The snout, printed separately so it could be revised on its own. Its shape went through three versions before the proportions read as a dog rather than a box.

MaterialPLA+
Layer0.12 mm
Infill20%
Print time4h 40m
Supportsyes

Nose

nose

A small piece printed in a contrasting material, because paint on a part this size never survives handling. Press fit, no screws.

MaterialPLA+
Layer0.12 mm
Infill30%
Print time0h 40m
Supportsno

Left ear

ear_sx

Printed hollow and thin so the ear stays light: mass this far from the neck axis is the mass the neck servo has to hold up all day.

MaterialPLA+
Layer0.16 mm
Infill10%
Print time2h 50m
Supportsyes

Right ear

ear_dx

Mirror of the left ear. Both are held by a single screw each, so a knock rotates the ear instead of breaking its base.

MaterialPLA+
Layer0.16 mm
Infill10%
Print time2h 50m
Supportsyes

Neck

neck

The link between head and body, and the part that carries the whole weight of the head through a single bearing. Printed upright with a high perimeter count instead of high infill.

MaterialPETG
Layer0.2 mm
Infill40%
Print time3h 30m
Supportsyes

Left arm

arm_sx

The upper limb, hollow to keep the mass low. Everything that moves fast costs torque at the shoulder, so weight here is worth more than stiffness.

MaterialPLA+
Layer0.2 mm
Infill15%
Print time3h 15m
Supportsyes

Right arm

arm_dx

Mirror of the left arm. The two are identical apart from the mirroring, which halved the drawing work and doubled the number of print failures worth learning from.

MaterialPLA+
Layer0.2 mm
Infill15%
Print time3h 15m
Supportsyes

Left hand

hand_sx

The end of the arm, shaped to rest flat when the robot sits. Not articulated: a moving hand would have cost two more servos for very little gain.

MaterialPLA+
Layer0.16 mm
Infill20%
Print time1h 25m
Supportsyes

Right hand

hand_dx

Mirror of the left hand. Printed with the palm on the bed so the visible side comes out of the printer already smooth.

MaterialPLA+
Layer0.16 mm
Infill20%
Print time1h 25m
Supportsyes

Foot, opposite side

foot_1

The second foot, identical to the first. Both were reprinted after the sole was widened, because the first version rocked on hard floors.

MaterialPETG
Layer0.2 mm
Infill40%
Print time1h 35m
Supportsno

Servo bracket

servo_bracket

The standard bracket that holds a servo to the structure, repeated wherever one is mounted. Small, printed many times, and the first part revised when a servo changed model.

MaterialPETG
Layer0.16 mm
Infill50%
Print time0h 55m
Supportsyes

Servo driver board

pca9685

The board that drives the four servos of ears and arms: sixteen PWM channels on one I²C bus, so the UNO Q sends positions and this one keeps the pulses steady. The two neck servos are not on it: they are serial, and have a board of their own.

ModelPCA9685

Left ear servo

servo_ear_sx

One of the four metal-gear micro servos driven by the PCA9685: this one moves the left ear. Metal gears instead of plastic, because ears and arms are the parts people grab.

ModelMetal-gear micro servo

Right ear servo

servo_ear_dx

One of the four metal-gear micro servos driven by the PCA9685: this one moves the right ear. Metal gears instead of plastic, because ears and arms are the parts people grab.

ModelMetal-gear micro servo

Left arm servo

servo_arm_sx

One of the four metal-gear micro servos driven by the PCA9685: this one moves the left arm, independently from the other, which is what makes the dance possible. Metal gears instead of plastic, because ears and arms are the parts people grab.

ModelMetal-gear micro servo

Right arm servo

servo_arm_dx

One of the four metal-gear micro servos driven by the PCA9685: this one moves the right arm, independently from the other, which is what makes the dance possible. Metal gears instead of plastic, because ears and arms are the parts people grab.

ModelMetal-gear micro servo

Camera

usb_camera

The USB camera behind the nose: it is how the robot sees who is in front of it. The muzzle is drawn around the lens so that nothing of the module shows from outside. Placeholder text: to be rewritten from the Project Hub page.

ModelUSB camera module

Distance sensor, chest

modulino_distance

A time-of-flight distance sensor in the Modulino form factor. The two of them sense presence: Nuvi wakes when you come close, and drops any voice that does not come from someone near enough — if nobody is there, it does not even listen.

ModelArduino Modulino Distance
Product pagestore.arduino.cc

Distance sensor, side

modulino_distance_1

A time-of-flight distance sensor in the Modulino form factor. The two of them sense presence: Nuvi wakes when you come close, and drops any voice that does not come from someone near enough — if nobody is there, it does not even listen.

ModelArduino Modulino Distance
Product pagestore.arduino.cc

Arduino UNO Q

arduino_uno_q

The brain, in the belly: a Linux processor and a microcontroller on one board. The microcontroller side moves the body in real time; the Linux side runs the AI that lets Nuvi hear and answer. The whole app lives here, not on a PC.

ModelArduino UNO Q 4GB
Product pagestore.arduino.cc

Neck servos

main ×2

The two serial servos that move the head: one pans, one tilts. Serial bus instead of PWM, so they sit on one cable and report their position, and the neck could be drawn around them with no visible cables or levers.

ModelFeetech STS3215

Neck servo driver

digital_servo_shield

The control board of the two STS3215: it turns the serial line of the UNO Q into the half-duplex bus the servos speak, and keeps the motor current off the main board.

ModelSerial bus servo driver board

Chest matrix

modulino_led_matrix

The small status icons on the chest: thinking, talking, sleeping. A Modulino, so it shares the same bus as the distance and temperature sensors.

ModelModulino LED Matrix

Step-down converter

step_down

Brings the 12 V of the supply down to what the electronics need. Added after the first build kept browning out when screen, audio and motors drew current at once.

ModelLM2596S

Power inlet and switch

power_plug ×2

Where the 12 V 10 A supply comes in, at the base of the body, with the power switch next to it.

Model12 V DC jack and switch

Electronics

One board runs everything.

The Arduino UNO Q is the brain: real-time body control on one side, the AI that lets Nuvi hear and answer on the other. Four metal-gear servos move the arms and the ears, driven by a PCA9685 over I²C; two Feetech STS3215 serial servos move the neck, pan and tilt, on their own control board. A 480×320 SPI display draws the eyes and a Modulino LED matrix on the chest shows the status icons. Two Modulino Distance sensors sense presence, a Modulino Thermo reads temperature and humidity, two TTP223 pads make head and belly touch-sensitive; a USB microphone and a USB speaker carry the voice. Power comes from a 12 V 10 A supply through a step-down converter, added after the first build kept browning out when screen, audio and motors drew current at once.

Software

It listens, understands and answers on its own.

A local noise filter separates your sentence from the room; the distance sensors drop anyone who is not close enough — if nobody is near, it does not even listen. What is left goes straight to the model, Gemini, called directly: it understands what it hears and produces the reply in one shot, with no separate speech-to-text step. Nuvi knows the sentence was meant for it because it recognises its own name, and it stops listening while it speaks, otherwise it would answer itself. The voice is Piper, a speech engine that runs on the robot, so the answer comes back without waiting on the cloud. Around this: presence and sleep, animated expressions, two hand gestures — an open palm for temperature and humidity, a V sign to toggle the lights — and smart-home control over MQTT. The whole app runs on the board, over SSH, so it works even when App Lab cannot see the board.

Gallery

Nuvi on display at an Arduino event, next to its plaque and a card that says “Hey Nuvi”
Nuvi on the desk, eyes on the screen and the LED matrix on the belly lit
Nuvi seen from three quarters: the ears, the face screen and the LED matrix on the chest

Need something like this built?