3D printing

last updated: 2022-02-08

Quick links

New Felix 3 with spare parts and a Duet3d motherboard


Click for bigger picture

After my upgrade of a Felix 4.1 dual head with a new Duet 3 6HC motherboard and a higher voltage I was really happy with the result.

As I had quite a bunch of spare parts from my old Felix 3 resulting from the updates, I decided to built a second Felix.

I bought a Felix 3 DIY kit in 2013, because it had good reviews and was fully open source. Unfortunately felixprinters decided to stop publishing the .stl files after the Felix 2. But I was lucky in misfortune because the Felix 2 files can be found in downloads and don't really differ from the newer parts.

I will not document the whole building process, but only some relevant things to remember and that could help other people building their own duet3 printer.

I will also not repeat all the infos that can be found on my other duet3 page: http://weigu.lu/other_projects/3d_printing/felix4dual_duet3/index.html. That page is more complete, so perhaps first read that page.


The frame was bought at . Naturally you have to provide a sketch where to drill and where to drill the threads (Look in the assembly manual of Felix printer).

no. item order number
4x Aluminiumprofil 40x40 schwer Nut 8 I-Typ Länge:400 mm H1084040S
1x Aluminiumprofil 40x80 schwer Nut 8 I-Typ Länge:440 mm H1088040S
5x Profilabdeckkappe 40x40 Nut 8 I-Typ H208AK4040
1x Profilabdeckkappe 40x80 Nut 8 I-Typ H208AK8040
8x Zentrierplattensatz Nut 8 I-Typ H208ZPS
40x Halbrundschraube ISO 7380 Halbrundschraube: M4x8 H208HS48
20x Halbrundschraube ISO 7380 Halbrundschraube: M8x16 H208HS816
20x Halbrundschraube ISO 7380 Halbrundschraube: M8x12 H208HS812
1x Handgriff PA 145 Nut 10 B-Typ H210HG145
10x Nutenstein mit Steg Nut 8 M8 I-Typ H208NSMS8
6 Wunschbohrung in Profil für Verbindungstechnik Bohrung: Durchmesser 8 mm Bohrung-BD8
6 Wunschgewinde in Profil für Verbindungstechnik Gewinde: M8 Gewinde-GWM8

Further I needed 2 x MGN12H Mini Lineare Schienenführung that I found on Amazon, but the 135 002.0 Hiwin linear ball bearing - HGW15CC1R300Z0 had to be bought in the Felix shop.

To fix the x-axes linear guideway I didn't find nuts with M3 thread, so I enlarged the holes to 4 mm and took nuts with M4 thread. I grinded the head of M4 countersunk screws to fit the holes.

Some of the 3D printed parts where:

I drilled some holes in the Felix3 aluminium bed and glued some supermagnets to hold the Tec 4 - flexible build-plate (purchased at felixprinters).

build  bed
Click for bigger picture

To illuminate the bed I used an Neopixel stripe with 8 LEDs connected to the Neopixel header of the duet board. Connect the LED strips to the 4-pin connector labelled DS_LED. 5V and Ground and the data input line to the DS_DO pin of the Duet.

Naturally I also added a Shutdown button for the Raspberry Pi and an emergency button, especially useful while testing.

Wiring diagram and housing

Here is the link to the original Wiring Diagram. I used the following connections:

Click for bigger picture

I created a new housing with Freecad. The Raspberry Pi sits on top of the housing.

housing open  housing closed
Click for bigger picture

Configuring everything

I took the config.g file from my other dual head printer and had to change only some things. Naturally I had first to delete the data for the second extruder (extruder, stepper, fan). Than I had to get the PID data for the heated bed and the extruder. With M303 H0 P0.75 S60 and M303 H1 P0.75 S190 I got the following answers:

    Auto tuning heater 0 completed after 3 idle and 7 tuning cycles in 1652 seconds. This heater
    needs the following M307 command: M307 H0 B0 R0.416 C318.2 D17.67 S0.75 V19.0
    Auto tuning heater 1 completed after 3 idle and 5 tuning cycles in 550 seconds. This heater
    needs the following M307 command: M307 H1 B0 R4.208 C197.3 D12.40 S0.75 V19.1

After this I had to calibrate the Z probe use the following link: https://duet3d.dozuki.com/Wiki/Test_and_calibrate_the_Z_probe.

Then to calibrate the bed I used the G32 command as described in the Manual Bed Levelling Assistant (MBLA) chapter: http://weigu.lu/other_projects/3d_printing/felix4_duet/index.html#link_5. Here my adjusted bed.g file:

; bed.g
; called to perform automatic bed compensation via G32
G28                                ; home
M401                               ; deploy Z probe
M671 X148:40:40 Y101:233:-38 P0.5  ; adjusting screws bed middle, front and rear
G30 P0 X148 Y92 Z-99999            ; probe near an adjusting screw middle
G30 P1 X40 Y190 Z-99999            ; probe near an adjusting screw front right
G30 P2 X40 Y35 Z-99999 S3          ; probe near an adjusting screw rear right
                                   ; and report adjustments needed
M402                               ; retract probe


So here the final config.g file:

    ; Configuration file for Duet 3 (firmware version 3.3)
    ; executed by the firmware on start-up
    ; generated by weigu.lu 2022-02-08

    ; General preferences
    G90                                               ; send absolute coordinates...
    M83                                               ; ...but relative extruder moves
    M550 P"duet3single"                               ; set printer name (must be Raspi host name!)

    ; Drives
    M569 P0.0 S0                                      ; physical drive 0.0 (X) goes backwards (S0)
    M569 P0.1 S1                                      ; physical drive 0.1 (Y) goes forwards
    M569 P0.2 S1                                      ; physical drive 0.2 (Z) goes backwards
    M569 P0.3 S0                                      ; physical drive 0.3 (E0) goes backwards
    M584 X0.0 Y0.1 Z0.2 E0.3                          ; set drive mapping
    M350 X16 Y16 Z16 E16 I1                           ; configure microstepping with interpolation
    M92 X76.19 Y76.19 Z1600.00 E164.00                ; set steps per mm
    M566 X600.00 Y600.00 Z18.00 E228.00               ; set maximum instant. speed changes (mm/min)
    M203 X12000.00 Y12000.00 Z600.00 E1800.00         ; set maximum speeds (mm/min)
    M201 X1100.00 Y1100.00 Z100.00 E10000.00          ; set accelerations (mm/s^2)
    M906 X1275 Y1275 Z1275 E1275 I20                  ; set motor currents (mA) and idle factor (%)
    M84 S20                                           ; Set idle timeout

    ; Axis Limits
    M208 X0:240 Y0:205 Z0:220                         ; set axis minima and maxima

    ; X and Y Endstops
    M574 X1 S1 P"io0.in"                              ; configure active-low endstop (X) pin io0.in
    M574 Y1 S1 P"io1.in"                              ; configure active-low endstop (Y) pin io1.in

    ; Z-Probe
    M558 P5 C"io6.in" H5 F60 T6000                    ; set Z probe type to unmodulated
                                                      ; and the dive height + speeds
    G31 P500 X7 Y35 Z1.49                             ; set Z probe trigger value, offset
                                                      ; and trigger height
    M557 X7:240 Y35:200 S20                           ; define mesh grid (use probe values!)
    ;M671 X110:40:40 Y94:231:-38 P0.5                 ; this is not needed here; look in bed.g

    ; Heaters
    ; bed
    M308 S2 P"temp2" Y"thermistor" A"S2" T100000 B4092; conf. sensor 2 (S2 bed) thermistor pin temp2
    M950 H0 C"out0" T2 Q50                            ; create bed heater out0, PWM freq to 50Hz
                                                      ; and map it to sensor 2 (T2)
    M143 H0 S105                                      ; set temperature limit for heater 0 to 105C
    M307 H0 B0 R0.416 C318.2 D17.67 V19.0 B0 S0.75    ; B0 = no bang-bang (PID) S0.75 = PWM limit
    M140 H0 R20 S55                                   ; map heated bed to heater 0
    ; left extruder                                   ; conf. sensor 0 (left ext.) thermistor temp0
    M308 S0 P"temp0" Y"thermistor" A"S0_Left" T100000 B4092
    M950 H1 C"out1" T0 Q250                           ; nozzle heater on out1, PWM freq to 250Hz
                                                      ; and map it to sensor 0 (T0)
    M143 H1 S275                                      ; set temperature limit for heater 1 to 275C
    M307 H1 B0 R4.208 C197.3 D12.40 S0.75 V19.1       ; B0 = no bang-bang (PID) S0.75 = PWM limit
    M570 H1 P5 T30                                    ; raise overshoot limit to 30°C (5s)

    ; Fans
    M950 F0 C"out7" Q5                                ; create fan 0 print cooling fan out7 pwm 5Hz
    M106 P0 C"print-cooling" S0.0                     ; set fan 0 value
    M950 F1 C"out8" Q5                                ; create fan 1 pin heatsink out8 and pwm 5Hz
    M106 P1 C"heat_sink" S1.0                         ; set fan 1 value

    ; Tools
    M563 P0 D0 H1 F0 S"T0_Ex_Left"                    ; define tool T0 (felix: left ext.) D0=Drive 3
    G10 P0 X-12.19 Y0 Z0                              ; set tool 0 axis offsets
    G10 P0 R120 S185                                  ; set initial tool 0 active, standby temp. 120C

    ; weigu.lu
    M150 X1 R158 U128 B128 S8                         ; Neopixel LEDs
    M144                                              ; switch bed to standby at startup

Final touch

We have a neopixel stripe with 8 LEDs. Look here for the commands: https://duet3d.dozuki.com/Wiki/M150.

I use the command: M150 X1 R128 U128 B128 S8

In the end I created a heatmap with the G29 command. Look at the Mesh Bed Compensation (MBC): http://weigu.lu/other_projects/3d_printing/felix4dual_duet3/index.html#link_6.

height map
Click for bigger picture

First test prints:

Click for bigger picture


Interesting links