Step 6: A CAN do attitude

Manta M8P plus CM4 cooling

What I really want to do is mount a fan to directly cool the stepper drivers and a second fan to directly cool the Raspberry Pi.

So I found one mod that mounts a 40mm fan on the CM4 module and a second mod that mounts a 5015 blower fan in a air duct for the steppers. However, when I put the models together, I don’t think I can use both of them at the same time.

This might be a design project. Not right away.

Systemd yak shaving intensifies

I have this vague uncomfortable feeling that the instructions in the standard CANBus guide are slightly wrong, but I gave up on worrying.

From my reading, it sounds like I would want to skip the ifupdown section because I’m definitely using a fairly modern version of linux on the Pi and it’s definitely using systemd-networkd instead of ifupdown… but for some reason I actually do have to follow both sections of the documentation and that feels a bit weird.

On the other hand, I can’t really find much documentation on using the CANBus inside of systemd anywhere and I gave up messing around and just did both sides and the whole thing works and this is really just silly and while I try not to pile onto the systemd drama situation I’m still somewhat blaming systemd.

I complained to a friend about this and she sent me a “Yak Intensifies” animated GIF.

CAN bus setup

  • I decided to not bother with setting up katapult.
  • Formbot helpfully provided a CANbus cable that had the required connectors and was heat-shrinked… and I had to cut off the heat-shrink cable and some of the insulation to stretch to make all of the connections.
  • Oddly, nowhere in the manual is the meaning of the LEDs on the BTT SB2209 board specified. One of them is the power LED, one of them is the status LED. The Esoterical guide shows you setting that to on at startup if you take the Klipper Config route… which didn’t make sense at first.
  • I accidentally put firmware to have the CANbus hanging off of PB12/PB13 instead of PD12/PD13. Oops! After I got that fixed, things seem to be working.
  • The wiring diagram doesn’t show that you need to put a jumper for the terminator resistor on the motherboard side nor does it show that you need to put a jumper for the terminator resistor on the toolboard side and two more jumpers to set the voltages.
  • There’s two cable-wrap-y thingies. One bag which is nylon-coated seems to be the “Cable Sheath 150mm” from the BOM, which means that it’s probably meant to be cut up and used to cover the other cables. The other bag is AD11.6 corrugated pipe, and that looks to be the umbilical part.
  • The PG7 gland is just perfectly slightly too small to fit a JST connector without being de-pinned. Yay.
  • Wrong cPIF part: I got three versions of the part for the umbilical bridge for the StealthBurner toolhead from my cPIF provider. I got the version for the 2 screw cable chain, the version for the 3 screw cable chain, and then the version for the EBB SB2209 CAN RP2040 board. However, what I need is the Formbot-provided umbilical bridge for the PG7 gland. If I’d thought this through, I might have gone straight to the PUG system.
  • The prind container is installing the can libraries at every startup, which is I guess how Klipper wants to work? I try not to think too much about this because I don’t want to arrive to either the regular Klipper or DangerKlipper communities with a pile of patches. There’s a fairly specific yet also battle-tested way that we tend to default to in the infrastructure engineering world and Klipper doesn’t comply and it bothers me.

X and Y endstops

  • The Y Endstop relocation mod was a bit confusing. Basically, there’s some stuff that’s intended to screw into the gantry that you don’t need. So you unscrew the XY Joint Cable Bridge part, either the 2 or 3 hole version, that you installed during the X axis section and then also the Y axis Y Endstop Bumper part you did during the Y axis section. The XY Joint Cable Bridge is where the bumper for the relocation mod goes and then you unscrew the front two screws from the motor mount and put the switch there.
  • The X endstop just triggers against the XY joint without a special bumper?

Lead up to first print.

  • Formbot ships a filament sensor for you but it won’t actually work, apparently. The pullup for GPIO22 doesn’t work, so either you need to wire up your own pull-up resistor or you need to switch it around… yeah, just leaving that out.
  • The Tap manual klipper config section sucks because it doesn’t actually tell you about the virtual z endstop and the klipper manual doesn’t really cover this very well either.
  • The way the stock wiring is designed, you are wiring a PT1000 through the 4-pin connector, so you want to be configuring the MAX31865. So the toolboard config looks something like this:
# This file contains common pin mappings for the BIGTREETECH EBBCan
# Canbus board. To use this config, the firmware should be compiled for the
# RP2040 with "USB" or "CAN bus (on gpio4/gpio5)".
# The "EBB Can" micro-controller will be used to control the components on the nozzle.

# See docs/Config_Reference.md for a description of parameters.

[mcu EBBCan]
#serial: /dev/serial/by-id/usb-Klipper_Klipper_firmware_12345-if00
canbus_uuid: xxxxxxxxxxxx
# Change the canbus_uuid to somethng

[temperature_sensor EBB_NTC]
sensor_type: Generic 3950
sensor_pin: EBBCan:gpio28

[temperature_sensor EBB_mcu_temp]
sensor_type: temperature_mcu
sensor_mcu: EBBCan
min_temp: 0
max_temp: 85

[adxl345]
cs_pin: EBBCan:gpio1
spi_software_sclk_pin: EBBCan:gpio2
spi_software_mosi_pin: EBBCan:gpio0
spi_software_miso_pin: EBBCan:gpio3
axes_map: z,-y,x

[resonance_tester]
probe_points: 100, 100, 20
accel_chip: adxl345

[extruder]
step_pin: EBBCan:gpio18
dir_pin: EBBCan:gpio19
enable_pin: !EBBCan:gpio17
microsteps: 16
rotation_distance: 22.6789511
gear_ratio: 50:10
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: EBBCan:gpio7
sensor_type: MAX31865
sensor_pin: EBBCan:gpio9
spi_software_sclk_pin: EBBCan:gpio10
spi_software_mosi_pin: EBBCan:gpio8
spi_software_miso_pin: EBBCan:gpio11
rtd_nominal_r: 100
rtd_reference_r: 430
rtd_num_of_wires: 2
control: pid
pid_Kp: 22.518
pid_Ki: 1.532
pid_Kd: 82.753
min_temp: 0
max_temp: 350

[tmc2209 extruder]
uart_pin: EBBCan:gpio20
run_current: 0.2
stealthchop_threshold: 999999

[fan]
pin: EBBCan:gpio13
max_power: 1.0
kick_start_time: 0.5 # Depending on your fan, you may need to increase this value if your fan will not start
off_below: 0.13
cycle_time: 0.010

[heater_fan hotend_fan]
pin: EBBCan:gpio14
heater: extruder
heater_temp: 50.0

[neopixel hotend_rgb]
pin: EBBCan:gpio16
chain_count: 3
initial_RED: 0.3
initial_GREEN: 0.0
initial_BLUE: 0.9
initial_WHITE: 0.0
color_order: GRBW

[probe]
pin: ^EBBCan:gpio22
x_offset: 0.0
y_offset: 0.0
z_offset: -1.600 # You need to tune this
speed: 15
lift_speed: 7.0
samples: 4
samples_result: median
sample_retract_dist: 2
samples_tolerance: 0.01
samples_tolerance_retries: 10
activate_gcode:
    {% set PROBE_TEMP = 150 %}
    {% set MAX_TEMP = PROBE_TEMP + 5 %}
    {% set ACTUAL_TEMP = printer.extruder.temperature %}
    {% set TARGET_TEMP = printer.extruder.target %}

    {% if TARGET_TEMP > PROBE_TEMP %}
        { action_respond_info('Extruder temperature target of %.1fC is too high, lowering to %.1fC' % (TARGET_TEMP, PROBE_TEMP)) }
        M109 S{ PROBE_TEMP }
    {% else %}
        # Temperature target is already low enough, but nozzle may still be too hot.
        {% if ACTUAL_TEMP > MAX_TEMP %}
            { action_respond_info('Extruder temperature %.1fC is still too high, waiting until below %.1fC' % (ACTUAL_TEMP, MAX_TEMP)) }
            TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={ MAX_TEMP }
        {% endif %}
    {% endif %}
  • I realized that the most recent time I’d wrapped the belt, I’d accidentally not gotten them around the front idler wheels, so I had to fix that and tighten everything up. The belts on the Zero were, for whatever reason, infinitely easier to deal with.
  • Finally, I can go back into the Tap and Stealthburner and EBB SB2209 manuals and finally put the thing together!
  • The Formbot PDF instructions that explain how to use their hinge system doesn’t mention that you should probably trim the piece of AD11.6 conduit they gave you. Presumably it’s meant to work on the 350mm x 350mm bed. They also fail to mention that you need to de-pin the CAN connector. I’m not overly happy with AD11.6 conduit. I’m probably going to redo the umbilical.
  • I decided to use the Lever Connector Mount using Side Fan Supports to wire up the two side-fans because I don’t think I have any cases where I would want just one of the pair of side fans running and it simplifies the wiring overall.
  • I also printed some pieces from the Modular Cable Management Clip set. It would be really cool if I could print a long version of the clip to completely hide the cables but if I scale the Z-height of the clips, I end up with a very very rigid clip.
  • I managed to put the hotend cooling fan in backwards. Oops. Generally the label faces inwards, although I’m betting there are some fans floating around that have the label on the wrong side because that’s just how things are.
  • Again, the Tap manual is not really useful here. If you go through the startup guide you can mostly follow the first part. When you get into the Bed Locating section, you can ignore the Z-endstop section (because there isn’t one). You can define the zero point as usual. You can ignore the Z Endstop Pin Location section. You do want to run the Probe Accuracy check. You want to run that a bunch because for whatever reason the accuracy gets better after it’s probed a few hundred times. You want to do the PID tune as normal. And you want to do the whole Bed Level process as normal. The Z offset adjust is silly because you want to do PROBE_CALIBRATE instead of a Z_ENDSTOP_CALIBRATE because there is no Z endstop.
  • I backed off the tap required accuracy.
  • Also there’s some Y loss from the Tap sensor. In my case, I’m losing maybe 5mm off the back of the bed.

First prints

I used the default SuperSlicer 2.4.x profile for a Voron 1 because I figured it wouldn’t stress the machine but would otherwise be mostly working. I loaded up the cube… and there was a tangle in the drybox partway through the cube. Oops!

  • I copied most of the calibration settings over from the Zero because they both have the same hotend.
  • Also I had to mess with the z side position_min setting to give it enough upward travel to avoid the “No trigger on z after full movement” error message.
  • I ended up wasting some time to get things migrated to a version of the better print_start macro.

Finally, I started making prints. I decided to print a compliant cable clip because that’s an actual useful item but also relatively good to understand if the printer’s OK. After two of those, I printed the Gridfinity bin that I was frustrated about because I wanted it but it was too big to fit on the Zero’s bed.

printing

So far the tally is that my Voron Trident has printed zero calibration cubes and zero benchies.

Labor Day sale

My long-term plan has always been to run either a Dragon Burner or XOL toolhead to replace the StealthBurner and also to replace the Tap with a Beacon probe.

Coincidentally there’s a 20% off sale on the Beacon site.

Next up to work on

  • Motion compensation measurement and adjustment, making it print faster and cleaner.
  • Bed meshing. I was kinda thinking of using the KAMP plugin but Klipper has native meshing at this point and that’s one less thing to install.
  • Mount the Pi’s heatsink
  • Mount the nozzle brush
  • Figure out the nozzle purge situation. It’s less important to use pellet-style purge with a giant bed as compared to the Zero but I’m realizing that I really like not having purge stripes all over the place. Because of the Tap sensor I can’t put the pellet bin in the usual place.
  • Mount the panels. I printed out some of the Voron 2.2/Annex clips that I’m probably going to use for most of the panels I’d want to remove. The Coroplast sheets for the back seem to be more like 3.5mm instead of 3mm.
  • One of the screws on the right side of the gantry is accidentally a M3 T-nut and so I need to dismantle that a bit to get an M5 T-nut in there. Ugh.
  • Refactor the macros
  • Nevermore air filter
  • Bed fans
  • Dragon Burner or XOL and Beacon
  • Filament sensor
  • Serial number

Conclusion

working printer

The Trident is sitting where my Ender 3v2 used to sit. It’s not finished but it’s usable. And, like my Zero, the first prints actually look pretty darn good.

It’s a bit of a relief to be solidly in the “using it” side of the fence? There’s other things going on as well that have distracted me from building the printer but at the same time, there’s a bunch of half-finished projects that I can wrap up now.


Posted:

Updated: