Anycubic Kobra 2 Max upgrade
-
I have had many little issues and things that annoyed me when using the Kobra 2 Max, with Anycubic running a proprietry closed version of Klipper removed a lot of the options for customizing the printer configuration. I decided to just remove the controller board and replace it with a Duet 3 6HC and 7" paneldue display. I did not want to use cloud accounts, phone apps or usb flash drives to transfers files to the printer. The printer did not have a local web gui.
The only thing that I could not get to work was the acceleromter on the print bed, the LIS2DW12 is supported but there is no connection to the interrupt pin on the chip, apparently klipper does not require this but the duet boards do. I replaced this with a Duet3D accelerometer. The same chip is used on the print head but there is a pad that is connected to the interrupt pin and can be used.
The psu has a 500w rating, but I measured the usage at 460w just heating up the print bed without any steppers or the extruder running, a max draw over 570w while printing. I changed the psu for a Mean Well 648w supply to give it a bit more headroom and hopefully reliability.
There is a separate pcb to power the heated bed and I ran the bed heater output from the 6hc to this board to power the bed heater.I've used conservative speeds/accelerations as the advertised rates are a little optimistic. This config works but could still use some tuning.
config.gM550 P"Kobra 2 Max" ; set persistent hostname M575 P1 S0 B57600 ; configure PanelDue support M569 P0.0 S1 D2 ; driver 0.0 goes forwards (Z axis) M569 P0.1 S1 D2 ; driver 0.1 goes forwards (Z axis) M569 P0.2 S1 D2 ; driver 0.2 goes forwards (extruder 0) M569 P0.4 S1 D2 ; driver 0.4 goes forwards (X axis) M569 P0.5 S0 D2 ; driver 0.5 goes backwards (Y axis) M906 X1960 Y2660 Z1400 E960 ; set motor driver currents M906 I60 ; set motor current idle factor M84 S30 ; set motor current idle timeout M669 K0 ; configure Cartesian kinematics M584 X0.4 Y0.5 Z0.0:0.1 ; set axis mapping M350 X16 Y16 Z16 I1 ; configure microstepping with interpolation M92 X80.3 Y80.3 Z401.5 ; configure steps per mm M208 X-5:430 Y-5:430 Z-0.4:500 ; set minimum and maximum axis limits M566 X600 Y600 Z12 ; set maximum instantaneous speed changes (mm/min) M203 X30000 Y25000 Z960 ; set maximum speeds (mm/min) M201 X2000 Y1000 Z3000 ; set accelerations (mm/s^2) M584 E0.2 ; set extruder mapping M350 E16 I1 ; configure microstepping with interpolation M92 E476 ; configure steps per mm M566 E120 ; set maximum instantaneous speed changes (mm/min) M203 E4800 ; set maximum speeds (mm/min) M201 E300 ; set accelerations (mm/s^2) M558 K0 P5 C"io6.in" H5 F1200:120 T12000 A2 ; configure analog probe via slot #0 G31 P500 X24 Y13.35 Z1.36 ; actual trigger height is 1.2mm ; set Z probe trigger value, offset and trigger height M574 X1 P"!io5.in" S1 ; configure X axis endstop M574 Y1 P"!io4.in" S1 ; configure Y axis endstop M574 Z1 S2 ; configure Z axis endstop M557 X25:405 Y25:405 S40:40 ; define grid for mesh bed compensation M308 S0 P"temp0" Y"thermistor" A"Heated Bed" T100000 B4388 C7.06e-8 ; configure sensor #0 M308 S1 P"temp1" Y"thermistor" A"Extruder" T100000 B4388 C7.06e-8 ; configure sensor #1 M950 H0 C"out0" T0 ; create heater #0 M143 H0 P0 T0 C0 S120 A0 ; configure heater monitor #0 for heater #0 M307 H0 R0.2 D5.5 E1.35 K0.56 B1 ; configure model of heater #0 M950 H1 C"out1" T1 ; create heater #1 M143 H1 P0 T1 C0 S250 A0 ; configure heater monitor #0 for heater #1 M307 H1 R2.780 K1.008:0.522 D8.26 E1.35 S1.00 B0 V24.0 M140 P0 H0 ; configure heated bed #0 M950 F0 C"out7" Q1000 ; create fan #0 M106 P0 C"Extruder Fan" S0 B0.1 H1 T45 ; configure fan #0 M950 F1 C"out8" Q250 ; create fan #1 M106 P1 C"Filament Fan" S0 H-1 ; configure fan #1 M563 P0 S"Extruder" D0 H1 F1 ; create tool #0 M568 P0 R0 S0 ; set initial tool #0 active and standby temperatures to 0C M591 D0 P2 C"io3.in" S1 ; simple filament sensor M955 P0 C"spi.cs1+spi.cs0" ; accelerometer on the print head of the Kobra2Max, note this will only register X and Z moves, the print bed has it's own accelerometer for Y M955 P0 I41 ; set correct orientation
homeall.g
; lift Z G91 ; relative positioning G1 H2 Z5 F12000 ; move Z relative to current position to avoid dragging nozzle over the bed G90 ; absolute positioning ; home XY var xTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm var yTravel = move.axes[1].max - move.axes[1].min + 5 ; calculate how far Y can travel plus 5mm G91 ; relative positioning G1 H1 X{-var.xTravel} Y{-var.yTravel} F6000 ; coarse home in the -X and -Y directions G1 H2 X5 Y5 F12000 ; move back 5mm G1 H1 X{-var.xTravel} Y{-var.yTravel} F300 ; fine home in the -X and -Y directions G90 ; absolute positioning ; home Z ; NOTE: The following XY coordinates use values from the probe grid defined in the next section var xCenter = move.compensation.probeGrid.mins[0] + (move.compensation.probeGrid.maxs[0] - move.compensation.probeGrid.mins[0]) / 2 - sensors.probes[0].offsets[0] var yCenter = move.compensation.probeGrid.mins[1] + (move.compensation.probeGrid.maxs[1] - move.compensation.probeGrid.mins[1]) / 2 - sensors.probes[0].offsets[1] G1 X{var.xCenter} Y{var.yCenter} F12000 ; go to bed centre G30 ; probe the bed
homex.g
; lift Z G91 ; relative positioning G1 H2 Z5 ; move Z relative to current position to avoid dragging nozzle over the bed G90 ; absolute positioning ; home X var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm G1 H1 X{-var.maxTravel} F6000 ; coarse home in the -X direction G1 H2 X5 F6000 ; move back 5mm G1 H1 X{-var.maxTravel} F300 ; fine home in the -X direction G1 H2 Z-5 F6000 ; lower Z again
homey.g
; lift Z G91 ; relative positioning G1 H2 Z5 ; move Z relative to current position to avoid dragging nozzle over the bed G90 ; absolute positioning ; home Y var maxTravel = move.axes[1].max - move.axes[1].min + 5 ; calculate how far Y can travel plus 5mm G1 H1 Y{-var.maxTravel} F6000 ; coarse home in the -Y direction G1 H2 Y5 F6000 ; move back 5mm G1 H1 Y{-var.maxTravel} F300 ; fine home in the -Y direction G1 H2 Z-5 F6000 ; lower Z again
homez.g
; lift Z G91 ; relative positioning G1 H2 Z5 ; move Z relative to current position to avoid dragging nozzle over the bed G90 ; absolute positioning ; home Z ; NOTE: The following XY position is determined from the probe grid defined in the next section var xCenter = move.compensation.probeGrid.mins[0] + (move.compensation.probeGrid.maxs[0] - move.compensation.probeGrid.mins[0]) / 2 - sensors.probes[0].offsets[0] var yCenter = move.compensation.probeGrid.mins[1] + (move.compensation.probeGrid.maxs[1] - move.compensation.probeGrid.mins[1]) / 2 - sensors.probes[0].offsets[1] G1 X{var.xCenter} Y{var.yCenter} F6000 ; go to bed centre G30 ; probe the bed
I was also getting false triggers of the simple filament sensor but came across this thread which gave a solution, effectively inserts a small wait for the switch to debounce and only triggers if it's still triggered.
filament-error.g
G4 P10 ; delay 10ms to debounce if sensors.filamentMonitors[0].status="ok" echo "switch bounce detected - error cancelled" M99 ; break out if sensor value is zero again (bouncing) ; if we got this far the switch is still showing no filament M25 ;pause
-
@bug2k22 Thanks a lot for this writeup!
t would be helpful for others who want to do the same switch if you could post your config.g, homeing files etc to this tread or on github
-
@T3P3Tony I've added the config files to the first post. They're still a work in progress but it's a good starting point.
-
@bug2k22 Thanks!