Skip to content

Installation

Install the firmware on the controller board. Install the daemon and Klipper plugin on the host, usually the Raspberry Pi running Klipper. The RIP and encoder can run on that host or another computer.

1. Firmware (controller board)

Firmware not published yet

The firmware source is not public yet. The steps below are for when it is released, or for anyone who already has a copy.

Build with the Raspberry Pi Pico SDK:

cd paintress-firmware
mkdir build && cd build
cmake .. && make -j

Flash paintress_firmware.uf2 through BOOTSEL mass storage or picotool. Run the following command from the paintress-firmware directory:

picotool load -v -x build/paintress_firmware.uf2

The board appears as a USB CDC serial device. It sends protocol frames over USB, including LOG frames that the daemon displays as text.

2. Daemon (host)

The daemon requires Python 3.8 or newer and pyserial:

cd paintress-daemon
pip install pyserial
python -m paintress_daemon --head c6n90

Set --head to the fitted printhead. The board cannot identify it, so the daemon uses this setting to reject jobs made for another head.

It listens on TCP port 9000 and opens the firmware serial port when asked.

To run it as a service, use paintress-daemon.service from the daemon repository. It expects user pi, Klipper's Python in ~/klippy-env and the paintress_daemon folder copied to /home/pi. Change User, WorkingDirectory and the Python path in ExecStart if your setup differs, and add --head <name> to ExecStart.

sudo cp paintress-daemon.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now paintress-daemon.service

3. Klipper plugin (host)

Copy all three plugin files into Klipper:

cp paintress-klipper-extras/extras/paintress.py \
   paintress-klipper-extras/extras/paintress_head.py \
   paintress-klipper-extras/extras/paintressd_client.py \
   ~/klipper/klippy/extras/

paintress_head.py registers the [paintress_head <name>] config sections. Install all three files, even if you are not using a head section yet. A missing module causes Klipper to reject those sections.

Add a [paintress] section and the trigger [output_pin] to printer.cfg, covered in Configuration, then restart Klipper.

4. RIP and encoder (anywhere)

cd paintress-rip-encoder
pip install -r requirements.txt
pip install scipy                 # optional: better blue-noise texture

The RIP and encoder run offline. Copy the resulting job files into the plugin's base_path, which defaults to /home/pi/printer_data/paintress/.

Next: Configuration, then Printing.