QQ-S Duet 2 conversion

Hardware setup

It started out with the quite neatly organized factory setup. I was actually impressed after the job Creality did on the Ender 3!

Some odd things to note:

  • The heated bed’s positive lead comes from the PSU, while the negative is attached to the board
  • The Z Probe’s lead was broken into 2 parts
  • The stepper motors got dampers on them (under the white covers) which was a pleasant surprise after hearing a lot about bent mounting profiles due to over tensioning.

The wiring should be pretty straight forward… with a couple of caveats (as always). FLSUN made a couple of interesting design choices which will be listed.
Important thing to note is that there are 3 ways of approaching this:

  • The clean way (which involves, you recrimping all the connectors)
  • The hacky way (which is the flushcutter treatment on the JST connectors)
  • The optional way (this one requires a considerable amount of dupont jumper cables)

The choice is yours!

Couple of thing to look out for:

  • The wires aren’t marked, so you’ll need to mark them first!
  • The stepper connections are good as they are!
  • The endstops are normally closed switches, so the pins have to be adjusted accordingly (3v3 and STP pins must be populated)

Take these with a grain of salt as the cable’s color coding may change depending on the unit, be sure to double check it!

And the sketchy part (FLSUN’s design choices):

  • The (-) of the bed heater was wired to the board, and the (+) to the PSU
  • The purple wire is the common GND for the probe & hot-end fan
  • The green/turquoise wire is a common (+) for the hot end & part cooling fans
  • The single black wire is the pwm controlled part of the part cooling fan

For mounting the board, you can use this: FLSUN QQ-S Duet 2 board replacement by tjc2005 - Thingiverse

What I’m going to do at this point is the PSU will be moved to the outside, and get the board up & running. This way I can print a mounting plate that uses the old stand-offs so the board can be mounted properly. After that, the PSU will get a case for life protection reasons…

FYI, at the moment, I’m thinking that just about any board replacement will get hindered by the creative ways the original wiring was done…

This is the wiring… For now at least… I’m planning to add another extruder with Y splitter on the bowden tube in the near future.

The Probe

As I was going around the forums, trouble with the probe came up multiple times, the reason my be the “creative” wiring mentioned above. BTW, the probe is a normally closed switch. Haven’t seen config option for that in the online RepRap config tool… But at least I’ve managed to get the probe react on the Duet’s dashboard!

Turns out, wiring the probe is different between firmwares, as it’s highly recommended to upgrade to the latest I’ll only cover RepRap v3 only.

You’ll need to use the Z-probe pins (as seen on the wiring image), don’t listen to the online configuration tool and there will be necessary changes as well to the generated code.

Software

Having an online configuration tool for RepRap firmware is a huge advantage over Marlin and makes things a lot easier.

Below is my working config.json file which you can feed to the configurator to base your setup on. Only one thing to note: for the Z-Probe to work, you’ll need one adjustment after uploading the resulting gcode files.

In your uploaded config.g file, the first line under Z-Probe has to have the logic inverted. To do that you’ll have to add a ! in the C attribute, like this:
M558 P8 C"!^zprobe.in" H5 F120 T6000
If you’ve done this correctly, ze Probe should show a 0 value on the dashboard, instead of a red 1000.

{
  "board": "duetwifi10",
  "expansion_boards": [],
  "firmware": 3,
  "standalone": true,
  "nvram": false,
  "auto_save": {
    "enabled": true,
    "save_threshold": 10,
    "resume_threshold": 11,
    "gcodes_to_run": "M913 X0 Y0 G91 M83 G1 Z3 E-5 F1000"
  },
  "display": {
    "type": 0,
    "encoder_steps": 4,
    "spi_frequency": 2000000,
    "menus": [{
      "name": "main",
      "value": ""
    }],
    "images": []
  },
  "panelDue": false,
  "geometry": {
    "type": "delta",
    "mins": [0, 0, 0],
    "maxes": [230, 210, 200],
    "delta_radius": 130,
    "homed_height": 320,
    "low_dive_height": false,
    "max_carriage_travel": 450,
    "print_radius": 130,
    "rod_length": 280,
    "z_min": 0
  },
  "drives": [{
    "direction": 0,
    "microstepping": 16,
    "microstepping_interpolation": true,
    "steps_per_mm": 100,
    "instant_dv": 20,
    "max_speed": 200,
    "acceleration": 1000,
    "current": 1000,
    "driver": 0,
    "driver_v3": "0.0",
    "endstop_pin": "xstop",
    "endstop_type": 1,
    "endstop_location": 2
  }, {
    "direction": 0,
    "microstepping": 16,
    "microstepping_interpolation": true,
    "steps_per_mm": 100,
    "instant_dv": 20,
    "max_speed": 200,
    "acceleration": 1000,
    "current": 1000,
    "driver": 1,
    "driver_v3": "0.1",
    "endstop_pin": "ystop",
    "endstop_type": 1,
    "endstop_location": 2
  }, {
    "direction": 0,
    "microstepping": 16,
    "microstepping_interpolation": true,
    "steps_per_mm": 100,
    "instant_dv": 20,
    "max_speed": 200,
    "acceleration": 1000,
    "current": 1000,
    "driver": 2,
    "driver_v3": "0.2",
    "endstop_pin": "zstop",
    "endstop": null,
    "endstop_type": 1,
    "endstop_location": 2
  }, {
    "direction": 1,
    "microstepping": 16,
    "microstepping_interpolation": true,
    "steps_per_mm": 417,
    "instant_dv": 20,
    "max_speed": 200,
    "acceleration": 1000,
    "current": 800,
    "driver": 3,
    "driver_v3": "0.3"
  }],
  "idle": {
    "used": true,
    "factor": 30,
    "timeout": 30
  },
  "homing_speed_fast": 30,
  "homing_speed_slow": 6,
  "travel_speed": 100,
  "z_dive_height": 5,
  "slow_homing": false,
  "probe": {
    "type": "switch",
    "recovery_time": 0.4,
    "trigger_height": 16.2,
    "trigger_value": 500,
    "x_offset": 0,
    "y_offset": 0,
    "speed": 2,
    "deploy": false,
    "points": [{
      "x": 0,
      "y": 84.9,
      "z": 0
    }, {
      "x": 73.53,
      "y": -42.45,
      "z": 0
    }, {
      "x": -73.53,
      "y": -42.45,
      "z": 0
    }, {
      "x": 0,
      "y": 42.4,
      "z": 0
    }, {
      "x": 36.72,
      "y": -21.2,
      "z": 0
    }, {
      "x": -36.72,
      "y": -21.2,
      "z": 0
    }, {
      "x": 0,
      "y": 0,
      "z": 0
    }],
    "pwm_channel": 3,
    "pwm_inverted": true,
    "pwm_pin": null,
    "input_pin": "zprobe.in",
    "modulation_pin": null
  },
  "bed_is_nozzle": false,
  "bed": {
    "present": true,
    "use_pid": false,
    "heater": 0
  },
  "chamber": {
    "present": false,
    "use_pid": false,
    "heater": 2
  },
  "heaters": [{
    "temp_limit": 120,
    "scale_factor": 100,
    "series": 4700,
    "thermistor": 100000,
    "beta": 4092,
    "c": 0,
    "channel": 0,
    "sensor": 0,
    "output_pin": "bedheat",
    "sensor_type": "thermistor",
    "sensor_pin": "bedtemp"
  }, {
    "temp_limit": 260,
    "scale_factor": 100,
    "series": 4700,
    "thermistor": 100000,
    "beta": 4092,
    "c": 0,
    "channel": 1,
    "sensor": 1,
    "output_pin": "e0heat",
    "sensor_type": "thermistor",
    "sensor_pin": "e0temp"
  }],
  "num_nozzles": 1,
  "toolchange_wait_for_temperatures": true,
  "generate_t_code": true,
  "tools": [{
    "mix_ratio": [],
    "number": 0,
    "name": "HotEnd",
    "extruders": [0],
    "heaters": [1],
    "fans": [0],
    "x_offset": 0,
    "y_offset": 0,
    "z_offset": 0
  }],
  "compensation_x_offset": 15,
  "compensation_y_offset": 15,
  "peripheral_points": 3,
  "halfway_points": 3,
  "calibration_factors": 6,
  "probe_radius": 130,
  "mesh": {
    "x_min": 15,
    "x_max": 215,
    "y_min": 15,
    "y_max": 195,
    "radius": 85,
    "spacing": 20
  },
  "home_first": false,
  "orthogonal": {
    "compensation": false,
    "height": 50,
    "deviations": [0, 0, 0]
  },
  "network": {
    "enabled": true,
    "mac_address": "",
    "name": "Legionare",
    "password": "",
    "ssid": "",
    "ssid_password": "",
    "dhcp": true,
    "ip": "192.168.1.20",
    "netmask": "255.255.255.0",
    "gateway": "192.168.1.254",
    "protocols": {
      "http": true,
      "ftp": false,
      "telnet": false
    }
  },
  "fans": [{
    "name": "Effector",
    "value": 0,
    "inverted": false,
    "frequency": 500,
    "thermostatic": false,
    "heaters": [1],
    "trigger_temperature": 45,
    "output_pin": "fan0"
  }],
  "custom_settings": "M307 H0 A109.6 C363.9 D0.2 V23.9 B0"
}