💿Spincoater V1
This spincoater was designed by Rahim Malik and Jay Kunselman at the CMU Hacker Fab. It features a Maasi spincoater-inspired enclosure, with custom, hand-wired hardware and software. A second-generation version of this spincoater is in development by Rahim Malik.




BOM
10kOhm resistors
$4.49
Not tested without, though internal Raspberry Pi Pico pullups should suffice.
Perfboard + hookup wire
Can be sourced anywhere if not on hand.
Total
~$110
Build Instructions
Wiring
This build is hand-wired on perfboard, point-to-point. Follow the schematic below to correctly wire the hardware. Note the resistors can likely be omitted as the Pico sets pullups for each of the button inputs in software.

GP3
ESC_TX
ESC signal (bidirectional DShot)
GP26
I2C1 SDA (myWire)
LCD backpack SDA
GP27
I2C1 SCL (myWire)
LCD backpack SCL
GP13
START_STOP_BTN
Pushbutton to GND
GP12
INC_SPEED_BTN
Pushbutton to GND
GP11
DEC_SPEED_BTN
Pushbutton to GND
GP10
INC_TIME_BTN
Pushbutton to GND
GP9
DEC_TIME_BTN
Pushbutton to GND
Power architecture: 12V 5A wall adapter → rocker switch → 12V rail feeds the ESC/motor directly and a MP1584EN buck converter (12V→5V or 3V3) feeding the Pico's VSYS. The LCD backpack is powered from the Pico's onboard regulated 3V3 output, which keeps the I2C bus at 3.3V so no level shifter is needed against the Picos's non-5V-tolerant GPIOs.
CAD
3D print (PLA is fine) this enclosure/mechanical design (Onshape): Spincoater v1 assembly
Software
You can download the software from this GitHub repository: github.com/hacker-fab/spincoater-rahim-jay
Install Arduino IDE
Get the latest Arduino IDE
You can play with the parameters at the top of the software to remap your button pins, adjust rampup and rampdown rates, button stickiness, etc.
SOP
Spincoat a liquid (photoresist, spin-on glass, etc.) at a set RPM for a set duration, with closed-loop PID speed control (RPM measured live off the ESC's bidirectional DShot telemetry, not just estimated).
The controls and display are extremely intuitive. The best way to learn is by playing with it, but instructions are given here.
SPEED + / SPEED −
Adjust target coat RPM by ±100 RPM per press (range: 500–8000 RPM). Hold to auto-repeat.
TIME + / TIME −
Adjust coat duration by ±5s per press (range: 5s–180s). Hold to auto-repeat.
START/STOP
From idle: starts a run (ramp-up → coat → ramp-down → idle). During a run: aborts immediately and ramps down early.
Last updated
