For the complete documentation index, see llms.txt. This page is also available as Markdown.

💿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

Part
Link
Cost
Notes

BLHeli_32 ESC with telemetry

$25.99

Brushless DC motor

$12.95

Not tested, though should be suitable.

Mini DC-DC 3V3 buck converter

$9.99

Adafruit I2C/SPI character LCD backpack

$9.95

12V 5A AC-DC wall adapter with barrel jack

$12.99

Raspberry Pi Pico

$5.00

16×2 character LCD panel

$9.95

Pushbuttons

$11.49

Rocker switch

$6.39

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.

Pico GPIO
Function in Code
Net

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

Since this spin coater does not support a vacuum chuck. You will want to stick a piece of double sided tape onto the chuck, so your chip does not fly away. Replace that tape as often as needed.

Software

You can download the software from this GitHub repository: github.com/hacker-fab/spincoater-rahim-jay

1

Install Arduino IDE

Get the latest Arduino IDE

2

Add the Raspberry Pi Pico in Board Manager

3

Install the following libraries in Library Manager

  • Adafruit LiquidCrystal

  • PID_v1_bc

  • PIO_DShot

4

Plug in the Pico via USB, select the correct board and port

5

Compile and upload the software to the Pico

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.

A serial override mode exists for debugging (connect at 115200 baud, send an integer 0–8000 to directly command RPM, or -1 to return to normal button control). This bypasses the button/state-machine and isn't part of normal operation.

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.

Button
Function

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.

1

Power on

Flip the rocker switch. LCD shows the idle screen with the current TIME/SPEED settings.

2

Set speed and time

Use SPEED +/− and TIME +/− to dial in the target RPM and coat duration for this run.

3

Load the substrate

Secure the substrate on the chuck and dispense resist/coating fluid.

4

Start the run

Press START/STOP. Motor ramps from 300 RPM up to the target RPM at 1500 RPM/s, then holds at target for the set duration. The display will show time remaining and live measured RPM.

5

Ramp-down and stop

When the timer elapses, the motor automatically ramps down (1500 RPM/s) to 300 RPM and stops. The display returns to idle.

Last updated