Finishing up support for extrusion factors per PrintFrame

Notes

Using the group output/input as an (8 bit) signed integer made everyone a lot simpler. The following (virtual) signals could be removed:

  • do_extrudeRelSpd
  • do_retract

Leaving the following signals on the IRC5:

Type (Logical) Range Notes
ao_TCPSpd system analog 0.0-3.0 Mapped to TCP run (mm/s)
ao_flowRate virtual analog 0.0-1.0 Manual tweaks during run
ao_printPtSpd virtual analog -1.0 - +1.0 Set before every move
do_forceExtrude virtual digital
do_forceRetract virtual digital
go_TCPSpeed physical group output -127 to 127 Calculated speed

Clay 3DP setup

The RAPID module has gone through two iterations since it was last commited. The task is now semi-static, meaning it runs in the background when the controller starts (semi means it restarts when the controller restarts).

The ABB IRC5's group outputs can only be set to unsigned integers. You can still cast it int8_t manually. Map positive numbers to 0-127, and calculate negative numbers by subtracting it from 255. Meaning -30 becomes 225. This can then be converted back on the microcontroller using a simple c++ cast ((int8_t)value).

Erratic TS25 control firmware (for a Controllino Micro)

As described above, a cast is enough to get the correct values.

There were however some earlier problems with using analog in as digital in, since the digital threshold needs to be set explicitly for the pin (The Controllino wiring implementation sets it to 0UL. See erratic_TS25_ctrl_firmware: de38d29).

const uint8_t AI_RESOLUTION = 23;

// Calculate threshold value for 7V in a 0-24V, 7V comes from ABB spec, I think
const uint32_t AI_DIGITAL_THRESHOLD = (7.0 / 24.0) * ((1UL << AI_RESOLUTION) - 1);

setDigitalThreshold(pin, AI_DIGITAL_THRESHOLD); // noop for digital inputs

I might need to raise this with Controllino.

Clay 3DP print

I finally bit the bullet and created my PrintFrame, a variation of compas_slicer's PrintPoint. It's just a (compas.geometry) frame with an extrusion_factor property. Thanks to the work on compas.data this neatly serialises and deserialises from json.

I might have gone too far with PrintLayer, but in my defense it's just a list with a @classmethod that creates itself out of a list of frames and a list of float values.

And does it work?

Yes! But I might need to fine tune the SPEED_COEFFICIENT set in the TX_SPEED task.