Inspiration
Clockedin
A homemade arm that draws on a whiteboard whatever you ask for, and keeps a clock on the board on time by wiping and redrawing only the hands that move.
Inspiration
The theme is time, so we made a clock. This one is condemned to draw, wipe and draw again, every minute, for as long as it runs. It's art with robot jitter, after Maarten Baas's Real Time and Sun Yuan and Peng Yu's Can't Help Myself. Then we let people ask it for anything else.
What it does
- Draws what you ask for. You type or speak a request. GPT, with Gemini as the backup, returns a line drawing, and the arm draws it in marker.
- Keeps the clock on time. It redraws the clock every minute, on the minute, wiping and redrawing only the hands that moved. This runs in the app, with no model and no credits.
- Changes only what changed. For "make the cat grumpy", ink already on the board within 1.5 mm of the new drawing stays. The arm wipes the rest and draws only what's new.
- Writes in its own pen font. It letters words in a single-stroke font drawn for this project, and keeps lists you can tick off by asking ("check milk").
- Plays noughts and crosses against a computer player that never loses.
- Draws your mood. Presage SmartSpectra reads your face through the camera. The arm draws the matching face, and when your mood changes it redraws only the brows and mouth.
How we built it
words or voice
→ a line drawing (GPT, or Gemini)
→ the shortest pen path (fit to the board, order the strokes, a point every 2 mm)
→ base, elbow and pen angles for every point (inverse kinematics)
→ a live sim through the servos' real limits
→ the arm, over USB
The arm
- A two-link arm, with a 157 mm upper arm and a 190 mm forearm (both measured).
- Three TowerPro SG92R servos: base, elbow, and a pen servo that tilts to draw, lift or erase.
- An Arduino runs
firmware/clockedinand plays timed keyframes on its own 20 ms clock, so browser and network delays never reach the line.
The software
- A Node dev server holds the API keys and the arm's USB port. The app,
curlor a script can drive the arm through/api/arm. - Stroke order: exact (Held–Karp) up to 12 strokes. Above that, nearest-first, then 2-opt and Or-opt.
- Wiping: the app times four ways of wiping and uses the fastest.
- Simulation: the planner simulates SG92R top speed, 1° steps, dead band and gear play. The arm gets exactly the commands the sim plays.
- Acceleration limits: these keep hobby servos from overshooting. On the clock, the biggest jump in joint speed between 20 ms frames falls from 161 to 20 °/s, and the draw time doubles from 9.4 to 19.3 s.
- Servo zeros: each servo turns only 180°. The app picks zeros that keep 99% of the board in reach, with the elbow on the left.
- The clock is drawn 220 mm across.
Checks
node test.mjscovers inverse kinematics, parsing, planning and the sim.tools/optimize-test.mjschecks stroke order against the true optimum.tools/verify-motors.mjsreplays the Arduino's keyframes through a copy of its interpolation and compares every frame with the sim.
Challenges we ran into
- Reach: 180° servos can't cover the whole board, so we choose each servo's zero to cover the most of it.
- Overshoot: a hobby servo told to stop dead overshoots. The pen now speeds up and slows down, and the pen tilts ease in and out.
- Wobble: the servos' dead band and gear play make lines wobble. Every command compensates for both, and each stroke starts with a 3 mm lead-in.
Built with
JavaScript, Node.js, Arduino (C++), three.js (MIT), the Web Speech API, OpenAI GPT, Google Gemini and Presage SmartSpectra.
Try it
cd app && cp .env.example .env # add the keys
node server.mjs # then open http://localhost:5178
./firmware/arm app # from the repo root: puts the firmware on the Arduino
## What it does
## How we built it
## Challenges we ran into
## Accomplishments that we're proud of
## What we learned
## What's next for Clockedin
Log in or sign up for Devpost to join the conversation.