Engine for processing and printing Prusa SL1 slicer files, designed for the Apollo series of control board and the Prometheus MSLA Open Source Resin 3D Printer.
⚠️ This project is a work in progress. Exercise caution when using it for the first time, and don't print unattended.
After installing Odyssey, and running the program (ideally as
a service), you can begin interacting with it via the REST API, running on port
12357 by default. HTTP requests can be made with your tool of choice (such as
cURL), or using the provided apiHelper.py
python script. In addition to a
simpler command line interface, with script also provides some easy to follow
documentation of the available endpoints. See below for further details.
Example Usage:
./apiHelper.py start Local sliced_model.sl1
Command help:
usage: apiHelper.py [-h] [-u URL] ...
This script provides an easier way to interact with the Odyssey API from a local context, such as Klipper Macros or the command line.
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL
API Endpoints:
Valid CLI Endpoints
start Start printing the specified file
cancel cancel the current print (at the end of the current layer)
pause Pause the current print (at the end of the current layer)
resume Resume a previously paused print
status Return the current status from Odyssey
manual_control Move the z axis of the printer, or toggle curing
While work on Orion continues, we have implemented a temporary integration with the well-establish Mainsail UI for Klipper. This provides an easy-to-use web interface, accessible by typing your RPi's IP address into your favorite web browser's address bar. For more information, see Mainsail's documentation.
The Odyssey integration hijacks the normal pause/resume/stop functionality of Mainsail, as well as allowing you to start prints directly from the web ui.
When you upload a .sl1
file (or other supported file type), a fake .gcode
file is generated to represent that print. When you select that file in Mainsail,
that file request is intercepted, and Odyssey is told to begin printing the
corresponding .sl
file.
With the complexity of the Mainsail integration, and all of the services and files involved, it is highly suggested that you follow the easy install process and use our prebuilt OS image.
Coming Soon!
For a fully configured Raspberry Pi Installation of Odyssey, Klipper, and Mainsail, see the PrometheusOS custom RPi image.
If you do not wish to use the custom RPi image, you can set up Klipper and Odyssey yourself.
To install Odyssey on your Raspberry Pi, simply download the latest release here and unpack it on your device. The provided tar.gz archive will contain the Odyssey binary, the default odyssey.yaml configuration file, and an API helper script. For more information on how to configure Odyssey, see Configuraion below.
For the Klipper installation, see the Prometheus Config repo's instructions on manual installation.
Odyssey relies on a .yaml configuration file, specified at runtime, to know how to interact with your printer's hardware, and run the appropriate gcode commands for a successful print. An example configuration, set up for the Prometheus-MSLA, is provided here, and further information about each of the fields is listed below:
This section holds the config fields related to the printer, such as the path to your machine's serial port, and the specifications of your display's frame buffer.
This is the path to your control board's serial port, used by Odyssey for sending Gcode commands and receiving responses.
For Klipper, this is a virtual serial port which interface with Klippy, found
at /home/pi/printer_data/comms/klippy.serial
, for a normal Prometheus-MSLA
installation, or at /tmp/printer
for a default Klipper install.
This is the baudrate of the serial port specified above. For a direct connection
to a physical control board, this value may vary, but if you're using klipper
then is should always be 250000
.
This is the path to the frame buffer device representing your machine's LCD
display. Typically, this will be either /dev/fb0
or /dev/fb1
.
This is the bit depth of your display, or how many bits go into each pixel on
the screen. This can vary depending on your specific hardware, but for many
monochrome printer screens will be 5
. See fb_chunk_size for
more information.
This field represents the size of a "group" of pixels on your display, with a common value being 16 bits, or 2 bytes.
For a normal RGB555 screen, a single "group" would only ever contain just a single pixel, and the 16 bits would be divided between the Red, Green, and Blue channels, each getting 5 and the remaining bit serving as a spacer between values.
Many Monochrome screens, however, misuse the RGB555 bit layout to represent a grouping of three separate monochrome pixels, one for each color channel.
For screens that do this sort of grouping, Odyssey needs to know how many bits each grouping is, so it can properly divide it by the configured bit depth, and use any remaining bits in the group as spacers.
This is the max z position for your machine. This value can be accessed in the
gcode configuration segments with the substitution {z_max}
.
This field specifies how far up to raise the build plate after a layer is cured, before lowering it back down to cure the next layer.
This section holds fields pertaining to the Gcode used to drive the machine's hardware and signal between the board and Odyssey.
This field will be sent to the printer when Odyssey first starts up, and can
be used for anything that only needs to be set once (such as Absolute
Positioning with G90
).
This field will be sent to the printer when Odyssey is shutting down, and
should be used to bring the printer to a safe low-power state. Common commands
for this field are M84
to power down the motors, and your
cure_end command to ensure the LED array is powered off.
This field will be used to home the printer's kinematics before the start of a
new print, or when requested via the API interface (Coming soon!). The most
common case is just G28
, but it is exposed here to allow for more complicated
scenarios.
This field is used to move the printer to a specific position, given by the
substitution {z}
.
This field will be sent to the printer at the start of each print, and can be used for things like enabling fans, or turning on chamber LEDs.
This field will be sent to the printer at the end of each print, and should be used to disable fans/lights if needed, and raise the build plate for easier removal.
This field will be used to start curing each given layer, and should contain the gcode necessary to enable your LED array (or similar hardware). It is recommended that you test this command before running an actual print.
This field will be used to stop curing each given layer, and should contain the gcode necessary to disable your LED array (or similar hardware). It is recommended that you test this command before running an actual print.
This field represents the response value that Odyssey will look for after
executing a move, to ensure that the move has been completed before printing
continues. For printer firmwares that support NanoDLP, the response message is
usually Z_move_comp
.
See the Prometheus Klipper Config for an example of how to implement this functionality on the firmware side.