forked from teachingtechYT/teachingtechYT.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
calibration.html
1295 lines (1279 loc) · 143 KB
/
calibration.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<script src="js/loadscripts.js"></script>
</head>
<body onload="loadAllFormData(); displayCustom();">
<div id="menu"></div>
<div id="header"></div>
<div id="tabs">
<ul>
<li><a href="#intro">Introduction - <span style="color:red;">read me!</span></a></li>
<li><a href="#frame">Frame Check</a></li>
<li><a href="#pid">PID Autotune</a></li>
<li><a href="#esteps">Extruder E-steps Calibration</a></li>
<li><a href="#firstlayer">First Layer</a></li>
<li><a href="#baseline">Baseline Print</a></li>
<li><a href="#flow">Slicer Flow Calibration</a></li>
<li><a href="#steppers">Stepper Motor Driver Current</a></li>
<li><a href="#temp">Temperature Tuning</a></li>
<li><a href="#retraction">Retraction Tuning</a></li>
<li><a href="#speed">Speed & Max Flow Tuning</a></li>
<li><a href="#accel">Acceleration Tuning</a></li>
<li><a href="#linadv">Linear Advance</a></li>
<li><a href="#xyzsteps">XYZ steps Calibration</a></li>
</ul>
<div id="intro">
<h2>Introduction</h2>
<p>This page serves as a companion for this video: <a href="https://www.youtube.com/watch?v=rp3r921DBGI" target="_blank">3D printer calibration revolutionised - Step by step to better print quality</a></p>
<p>It has received a major update to bring it up to V2 which is explained in this video: <a href="https://www.youtube.com/watch?v=9kDK7czgMxc" target="_blank">3D printer calibration site V2 - Still free and better than ever!</a></p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/rp3r921DBGI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/9kDK7czgMxc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>It aims to make calibrating your 3D printer as easy as possible. If you find it helps you and you would like to say thank you, here is a donation link: <a href="https://paypal.me/testlawgicau" target="_blank">PayPal.me</a></p>
<p>Special thanks to my <a href="http://www.patreon.com/teachingtech" target="_blank">Patrons</a> for suggesting this video, helping define the contents and testing/proofing.</p>
<p>Watch the videos and then work through each tab. I have created a custom gcode generator to assist in making testing towers. This used to be a laborious process and beyond the skills of many users. Other times pre-sliced gcode was used from the internet, but it is impossible to have gcode available for every printer configuration. <i>Until now!</i></p>
<div class="warning">
<h2>Warning - Read carefully!</h2>
<p>Every attempt has been made to ensure this is safe but ultimately there always is risk in running pre-sliced gcode from the internet. Preview the gcode in your slicer or <a href="http://zupfe.velor.ca" target="_blank">Zupfe GCode Viewer</a> and <span style="color:red; font-weight: bolder;">print at your own risk.</span></p>
<p>Only print this gcode when you are present, alert and capable of stopping the printer in case of emergency.</p>
<p>Validation has been built into the forms to only allow sensible min and max values, however this is not foolproof.</p>
</div>
<h4>How this site works</h4>
<p>The gcode generated by this page is originally from Simplify3D. This website then uses Javascript to modify the contents based on user inputs. This site is not a web based slicer, therefore it is limited in some ways.</p>
<p>The aim for the site is to provide compatibility with the majority of 3D printers. It aims to be beginner friendly and as such where possible the interface is kept as minimal as possible. Because of this, some requests for extra functionality will not be accepted. Something that makes the experience better for 1% of users but confuses 40% of others is not worth including.</p>
<h4>Print Settings from the calibration S3D slicer profile</h4>
<p>A 'calibration' slicer profile in S3D is used as the basis of the gcode on this site. S3D offers multiple processes to assist with splitting the towers into segments where the print settings can vary. Apart from this, the only special functionality used is post processing scripts to delete some lines, and to modify others with simple search and replace functions.</p>
<p>The general characteristics of the slicer profile are as follows:</p>
<ul>
<li>Sliced for Marlin firmware, although in most cases will still be compatible with other firmwares.</li>
<li>A build volume of 120 x 120 x 250 mm (This site can accommodate anything as small as this and anything larger)</li>
<li>1.75mm filament (However <b>M221 S38</b> for 2.85 mm filament and <b>M221 S34</b> for 3.0 mm filament can be applied in the custom start gcode field as compensation)</b></li>
<li>Absolute extrusion values (M82 as opposed to relative/M83)</li>
<li>0.4mm nozzle and 0.2mm layer height, although now additional configurations are now possible</li>
<li>Line width on auto, typically 120% of nozzle diameter</li>
<li>Defaut feedrate of 60mm/sec. Modifiers include 60% for perimeters, 80% for solid infill, 166% travel moves, and 50% for the first layer</li>
<li>Travel moves of 20 mm/sec for Z</li>
<li>Flow rate of 0.90. Please see the note on the bottom of the <a href="calibration.html#flow" target="_blank">flow</a> tab for instructions on adapting this to your printer.</li>
<li>Nozzle priming has been turned off to avoid bed clips or problems with delta printers. Use the custom start gcode feature to insert the priming sequence from your slicer profile.</li>
<li>A single layer skirt (except on the acceleration test)</li>
<li>100% part cooling fan for bridging</li>
<li>First layer height of 100%, width 120%</li>
<li>No minimum layer time, auto part cooling, etc</li>
<li>4 top layers, 3 bottom layers, 3 perimeters</li>
<li>20% rectilinear infill</li>
</ul>
<p>The default start gcode is as follows (this can be completely replaced by ticking the appropriate option on each form):</p>
<pre>; G-Code originally generated by Simplify3D(R) Version 4.1.2
; This calibration test gcode modified by the Teaching Tech Calibration website: https://teachingtechyt.github.io/calibration.html
;M80 ; power supply on
G90
M82
M106 S0
;bed0a
;bed0b
;temp0a
G28 ; home all axes
;G29 ; probe ABL
;M420 S1 ; restore ABL mesh
;temp0b
;customstart
G0 Z3; fix for delta printers that home at max`;</pre>
<p>The default end gcode is as follows (this can be completely replaced by ticking the approprpriate option on each form):</p>
<pre>G28 X0 ; home X axis
M106 S0 ; turn off cooling fan
M104 S0 ; turn off extruder
M140 S0 ; turn off bed
M84 ; disable motors
;customend</pre>
<p>The information above is a summary, but if you wish to see the exact settings, the Simplify3D fff profile is available for download <a href="files/calibration.fff" target="_blank">here</a>.</p>
<p>Please note that non Simplify users can simply open this file in a text editor and everything will be listed.</p>
<p>You may notice settings related to temperatures, retraction, Z hop, part cooling, etc have set values, but these are altered by post processing scripts and this site to ultimately be set using the user's inputs. Several parameters work like this, please don't be fooled by what is in the slicing profile. Opening the final gcode file in a text editor and searching for 'custom' will show if the user's inputs have been successfully adopted.</p>
<h4>Post processing scripts in Simplify3D</h4>
<p>Unfortunately, there is no official reference for this provided by S3D. Instead, I have relied on <a href="https://forum.simplify3d.com/viewtopic.php?f=8&t=1959" target="_blank">this forum post</a>.</p>
<p>The scripts in my profile perform the following tasks:</p>
<ul>
<li>Strip out all comments apart from new processes and layers.</li>
<li>Strip out all start and end gcode. This gcode is instead provided by the site.</li>
<li>Find specific lines relating to retraction and zhop, replacing them with comments this site expects to find and modify further.</li>
</ul>
<pre>
{REPLACE "; process" ";process"}
{REPLACE "; layer" ";layer"}
{STRIP "; "}
{STRIP "M82"}
{STRIP "G90"}
{STRIP "M106 S0"}
{STRIP "M104"}
{STRIP "M109"}
{STRIP "M140"}
{STRIP "M190"}
{STRIP ";layer end"}
{REPLACE "G1 E-5.0000 F2400\n" ";retract1\n"}
{REPLACE "G1 E0.0000 F2400\n" ";unretract1\n"}
{REPLACE "G1 E-5.5000 F2460\n" ";retract2\n"}
{REPLACE "G1 E0.0000 F2460\n" ";unretract2\n"}
{REPLACE "G1 E-6.0000 F2520\n" ";retract3\n"}
{REPLACE "G1 E0.0000 F2520\n" ";unretract3\n"}
{REPLACE "G1 E-6.5000 F2580\n" ";retract4\n"}
{REPLACE "G1 E0.0000 F2580\n" ";unretract4\n"}
{REPLACE "G1 E-7.0000 F2640\n" ";retract5\n"}
{REPLACE "G1 E0.0000 F2640\n" ";unretract5\n"}
{REPLACE "G1 E-7.5000 F2700\n" ";retract6\n"}
{REPLACE "G1 E0.0000 F2700\n" ";unretract6\n"}</pre>
<h4>Changes made per test to the base slicing profile</h4>
<p>The information below is mainly for my reference. However, if you wish to duplicate the tests yourself out of interest or perhaps to develop a new test for the site, then the steps must be followed exactly, including replicating the process names.</p>
<p>First layer test: No changes, although it should be noted that a single square is included which is then duplicated and positioned by this site. Non uniform scaling of the source STL needs to occur to suit certain nozzle/layer combinations. The square should be 25 x 25 mm with it's height scaled to match the target layer height.</p>
<p>Baseline test: No changes</p>
<p>Retraction test:</p>
<ul>
<li>Z seam alignment set to 50, 50 mm</li>
<li>'Process-1' from 0mm</li>
<li>'Process-2' from 1mm - 0% infill</li>
<li>'Process-3' from 5mm - 5.5 mm retraction at 41 mm/sec - 0% infill</li>
<li>'Process-4' from 10mm - 6.0 mm retraction at 42 mm/sec - 0% infill</li>
<li>'Process-5' from 15mm - 6.5 mm retraction at 43 mm/sec - 0% infill</li>
<li>'Process-6' from 20mm - 7.0 mm retraction at 44 mm/sec - 0% infill</li>
<li>'Process-7' from 25mm - 7.5 mm retraction at 45 mm/sec - 0% infill</li>
</ul>
<p>Temperature test:</p>
<ul>
<li>'Process-1' from 0mm</li>
<li>'Process-2' from 9mm</li>
<li>'Process-3' from 17mm</li>
<li>'Process-4' from 25mm</li>
<li>'Process-5' from 33mm</li>
</ul>
<p>Acceleration test:</p>
<ul>
<li>5 perimeter wide brim instead of a skirt</li>
<li>0% infill</li>
<li>0 top and bottom layers</li>
<li>2 perimeters</li>
<li>Z seam alignment set to 0, 100 mm</li>
<li>'Process-1' from 0mm</li>
<li>'Process-2' from 5mm</li>
<li>'Process-3' from 10mm</li>
<li>'Process-4' from 15mm</li>
<li>'Process-5' from 20mm</li>
</ul>
<p>Speed tower test</p>
<ul>
<li>Single outline corkscrew printing mode</li>
<li>0 top layers</li>
<li>1 bottom layer</li>
<li>100% outline underspeed</li>
<li>'Process-1' from 0mm</li>
<li>'Process-2' from 10mm</li>
<li>'Process-3' from 20mm</li>
<li>'Process-4' from 30mm</li>
<li>'Process-5' from 40mm</li>
</ul>
</div>
<div id="frame">
<div class="exp">
<h2>Frame Check</h2>
<h5>Aim:</h5>
<p>To ensure there are no underlying problems with the frame or mechanical components of the 3D printer.</p>
<h5>When required:</h5>
<p>Any time the frame or mechanical components have been disassembled or replaced.</p>
<h5>Tools:</h5>
<p>Basic spanners, Allen keys, etc.</p>
</div>
<p>It would be easy to use the techniques elsewhere on this page to try and fix problems that were actually caused by a problem with the physical components, so we will eliminate this possibility first.</p>
<p>Many of these procedures are covered in this video: <a href="https://youtu.be/T-Z3GmM20JM" target="_blank">Complete beginner's guide to 3D printing - Assembly, tour, slicing, levelling and first prints</a></p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/T-Z3GmM20JM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h4>Loose nuts and bolts</h4>
<p>Move around the machine and check all fasteners. Crucial ones include those on the print head gantry such as those that hold the hot end on.</p>
<h4>V-roller tension</h4>
<p>If your printer has a motion system based on V-roller wheels riding on V-slot extrusions, check they are properly tensioned. Each location will have one eccentric nut. This can be twisted to either add or remove tension on the wheels.</p>
<p><b>If the wheels are too loose:</b> Wobble will be present in the assembly, which will show in the print as surface artefacts.</p>
<p><b>If the wheels are too tight:</b> The assembly will be too tense, which will wear the V-rollers prematurely.</p>
<p>In some rare instances poorly adjusted rollers may affect first layer accuracy across the bed.</p>
<h4>Lubrication</h4>
<p>Lubrication is an important maintenance task to perform regularly. Components that are not adequately lubricated may bind and affect print quality. Use <a href="https://amzn.to/3aqLT0a" target="_blank">SuperLube Synthetic Grease</a>. Lubrication needs to be performed regularly on any hardened rods, <a href="https://www.youtube.com/watch?v=loBHYcifzRM" target="_blank">linear rails</a> and lead screws.</p>
<h4>Bed Levelling</h4>
<p>Probably the most essential part of setting up your 3D printer. Most new users will trip up on this. If you have ABL, this includes making sure your Z offset has been set and saved. Dialing in the first layer has now been moved to its <a href="#firstlayer">own tab</a>.</p>
<h4>PTFE Tube</h4>
<p>If your printer has PTFE tube, such as a bowden tube setup for the extruder/hot end, it is essential to make the tube is fully inserted and seated in the coupler. Also ensure the coupler is properly tightened. You may wish to use a small retaining clip on the coupler to prevent the tube working loose: <a href="https://www.thingiverse.com/thing:4268489" target="_blank">Creality PTFE clip by morfidesign</a>.</p>
<h4>Nozzle</h4>
<p>It is worth heating up the nozzle and pushing some filament through to see if it is exiting the nozzle properly. If the diameter is inconsistent or the extruded plastic shoots to one side, it may indicate a partial blockage in the nozzle that will be a pain in the future. It is also worth checking if the nozzle is properly tightened. Only do this when it is hot, or you may break it.</p>
<h4>Belts</h4>
<p>Ensure all belts are properly aligned and tensioned sufficiently. Also check the grub screws are tight on the pulleys that connect the belts to the stepper motors.</p>
<h4>Fans</h4>
<p>Check all fans are spinning freely. This includes but is not limited to: mainboard cooling fan, heat sink fan, part cooling fan, PSU fan. It can be hard to diagose if a fan is performing at less than full capacity. It may be easier to simply replace than repair if you suspect a fan is failing.</p>
<p>Another suitable video for seeing some of these procedures is here:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/kAafiApJs9A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<div id="pid">
<div class="exp">
<h2>PID Autotune</h2>
<h5>Aim:</h5>
<p>To ensure the heating of the 3D printer nozzle and bed are safe, stable and consistent.</p>
<h5>When required:</h5>
<p>Any time the hot end is changed, including adding/removing a silicone sock or altering part cooling fan/ducts. Any time the bed is changed, such as adding a glass/mirror plate, magnetic spring steel sheet and/or under bed insulation.</p>
<h5>Tools:</h5>
<p>Terminal software such as <a href="https://www.pronterface.com/" target="_blank">Pronterface</a> or <a href="https://octoprint.org/" target="_blank">Octoprint</a>.</p>
<p>Instructions on how to setup <a href="troubleshooting.html#tools" target="_blank">terminal software</a> can be found <a href="troubleshooting.html#terminal" target="_blank">here.</a></p>
</div>
<p>PID autotuning is quick and easy, and relates to the most potentially dangerous components of your 3D printer: the heaters. It makes sense to do it as a first step. This procedure is covered in this video: <a href="https://youtu.be/qCtL0Yd_w0I" target="_blank">Two easy fixes for 3D printer temperature swings</a></p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/qCtL0Yd_w0I" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>In Marlin, this is a very straightforward process using <a href="https://marlinfw.org/docs/gcode/M303.html" target="_blank">M303</a>.</p>
<p>It is recommended to run the tuning with conditions as close to printing as possible. This means filament loaded and the part cooling fan set to your normal speed. This can be done from the printer's interface or in a terminal, by entering the following (this example is 100% fan speed):</p>
<pre>M106 S255</pre>
<p>It is not essential, but you may prefer to start this process with the hot end at room temperature. To tune the hot end, enter in a terminal:</p>
<pre>M303 E0 S200 U1</pre>
<p>This will tune the hot end at 200 degrees. The <b>S</b> value can be altered to suit your most common printing temperature. The <b>U1</b> means the result is stored to RAM and we can save it immediately to EEPROM by sending:</p>
<pre>M500</pre>
<p>For the bed, <b>PIDTEMPBED</b> must be enabled in the firmware, then the command is quite similar:</p>
<pre>M303 E-1 S60 U1</pre>
<p>The bed is selected with <b>E-1</b>, and the temp set to 60 degrees. Substitute as necessary for your normal printing bed temperature. Once again save to EEPROM afterwards with:</p>
<pre>M500</pre>
<p>It may be preferable to have the printer as close to printing conditions as possible during these tuning procedures. That means having filament loaded and the part cooling fan on for PLA temperatures. If there is no UI button available to turn on the part cooling fan, you can do it manually via gcode with <b>M106 S255</b>.</p>
<div class="exp">
<h5>Special note: If your printer doesn't support saving settings in EEPROM</h5>
<p>In this case, you need to insert <b>M301</b> (hot end) or <b>M304</b> (bed) into your slicer start gcode so the correct settings are loaded before each print.</p>
<p>After PID auto tuning, the final values for P, I and D will be listed in the terminal. Retreive them and use them as follows for the hot end:</p>
<pre>M301 E0 P[p value] I[i value] D[d value]</pre>
<p>This will set the PID values for the default hot end, eg. <b>M301 E0 P34.4 I0.02 D5.7</b> (bogus numbers, please don't copy them).</p>
<p>For the bed:</p>
<pre>M304 P[p value] I[i value] D[d value]</pre>
<p>This will set the PID values for the bed, eg. <b>M304 P26.0 I1.33 D20.5</b> (bogus numbers, please don't copy them).</p>
</div>
</div>
<div id="firstlayer">
<div class="exp">
<h2>First Layer</h2>
<h5>Aim:</h5>
<p>To ensure the printer bed is both level and an appropriate distance from the nozzle. In the case of using ABL, to check if compensation is working and the Z offset is correctly set. This will result in a first layer with the correct amount of 'squish', meaning good adhesion, and greatly increasing the chances of the print being successful.</p>
<h5>When required:</h5>
<p>Initial setup of the printer, regular maintainence, if first layer quality diminishes, any time the frame or mechanical components have been disassembled or replaced, any change of bed surface or nozzle, a change in filament that has significantly difference bed/hot end temperatures. There is a lot that can throw the bed level off, but careful use of your printer without any hardware changes should see it remain consistent for an extended period of time.</p>
<h5>Tools:</h5>
<p>The gcode generator on this page. A standard sheet of office paper.</p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#fl').offset().top-200)},500);">Scroll to gcode generator</button>
</div>
<h2>General Principles</h2>
<p>Getting a good first layer is an essential part of 3D printing successfully and is probably the number one cause of failed prints for new users.</p>
<p>Firstly, the bed needs to be parallel to the plane the nozzle traverses when moving in X and Y. This is achieved by moving the corners of the bed up and down relative to each other. With manual bed levelling this is achieved by turning the levelling knobs in each corner.</p>
<p>Secondly, the vertical distance between the bed and the nozzle needs to be correct for the first layer to print correctly. In a manual system, this is achieved by turning the levelling knobs in unison to lift or lower each corner the same amount.</p>
<p>If this distance is too far, the filament will not be squished into the bed enough, potentially even printing in mid air, and the print will detach from the bed and fail.</p>
<p>If the nozzle is too close, there will not be enough room for the extruded filament to take the correct shape, and it will be forced to squeeze outwards. In minor cases, the extruded line will be wider than necessary and produce <i>elephant's foot</i>. Prints like this may be quite hard to remove from the bed.</p>
<p>In extreme cases, there will be no way for the filament to exit the nozzle, at best causing extruder stepper motor skipping, and even potentially even jamming the extruder/hot end.</p>
<p>The contents of this page are shown in detail in the following video:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/Ze36SX1xzOE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h2>Manual Levelling Procedure</h2>
<p>There are many techniques available, but a common one is to move the nozzle to the various corners of the bed, turning the levelling knobs until a standard piece of office paper can just fit between the bed and nozzle. A 0.1mm feeler gauge can be used, but make sure it doesn't have any oil on it that will contaminate the bed surface. Typically, this procedure is done with the bed at printing temperature (essential), and the nozzle close to printing temperature - just cool enough to prevent filament oozing out (optional).</p>
<p>It is common to follow up with a first layer calibration print, and 'live level' the bed by continuing to adjust the knobs when the print is under way.</p>
<p>This process is depicted in detail in the video above, and a gcode generator is provided at the bottom of the page to generate a suitable test print.</p>
<h2>Auto Bed Levelling and Z offset</h2>
<p>Auto bed levelling automates the procedure to some extent. A sensor such as a BLtouch, EZABL, strain gauge or peizo transducer is used to probe the bed in a grid formation. At each location, it measures the vertical height, building up an array of stored values, called a <i>mesh</i>. <a href="https://www.youtube.com/watch?v=vcxM7-VK44k" target="_blank">Manual mesh bed levelling</a> can also be used to probe such a grid, but is still a manual process and hence not considered 'automatic'. Here is a visual representation of a probed mesh, shown with the <a href="https://plugins.octoprint.org/plugins/bedlevelvisualizer/" target="_blank">Bed level visualizer Octprint plugin</a>:</p>
<a href="#" data-featherlight="img/ablmesh.jpg"><img loading="lazy" class="thumb" src="img/ablmesh.jpg" /></a>
<p>During printing, the firmware will reference the mesh and compensate for an angled and/or warped bed by raising and lowering the nozzle using Z axis movement. This means the nozzle can travel up and down to match the contours of the bed, ensuring a good first layer.</p>
<p>If the printer's bed is perfectly flat, it is reasonable to claim ABL is not needed. Some users may still prefer it for the added convenience. In the event that the bed is warped (very common), it can be impossible to get a good first layer without ABL or manual mesh bed levelling. An example of this situation is shown in the video above.</p>
<p>It's worth noting that you can compensate for a warped bed in other ways, such as shimming the lower portions with a thin and flexible material. You can also use a glass/mirror plate over the top, which are typically quite flat. The downside of this is a longer time required to reach printing tempratures and additional load on the Y stepper (on an i3/'bed slinger' style printer) that may require lower print speed/acceleration.</p>
<p>The bed can be probed at the start of the print with a <b>G29</b> command, with the resulting mesh immediately used to compensate as the initial layers are produced. Alternatively, the bed can also be probed some other time (while not printing), the mesh stored in the EEPROM and then restored with <b>M420 S1</b> at the start of a print. In this case the print will start sooner, since we do not need to wait for a new mesh to be probed, although it may not be as accurate if anything has changed since probing. Either of these gcode commands should come after the <b>G28</b> home command in the start gcode.</p>
<p>Although ABL can compensate for a crooked/non-levelled bed, it is still better to attempt to level manually first and get everything in the ballpark.</p>
<p>Probing the bed and building a mesh only accounts for an uneven or warped bed. Like manual levelling, we still need to set the distance between the nozzle and bed to get a good first layer. This is where the Z offset comes in, which is simply the vertical distance between where the probe triggers vs the nozzle tip. Here are some examples:</p>
<ul>
<li>BLtouch/EZABL/Pinda probe - The nozzle is in mid air when these probes are triggered, which will require a negative Z offset.</li>
<li>Manual mesh bed levelling - The nozzle and bed will be very close when manually probing, requiring a Z offset close to zero.</li>
<li><a href="https://www.youtube.com/watch?v=hs6IVfNrf5k" target="_blank">CR-6 style</a> strain gauge - The nozzle touches the bed and flexes upwards to trigger the probe. This means the trigger point is actually higher than the nozzle tip, and requires a positive Z offset.</li>
</ul>
<p>The following picture shows Z offset for a BLtouch. You can clearly see the vertical difference between the probing point (tip of BLtouch) and the tip of the nozzle.</p>
<a href="#" data-featherlight="img/zoffset.jpg"><img loading="lazy" class="thumb" src="img/zoffset.jpg" /></a>
<p>If <b>BABYSTEP_ZPROBE_OFFSET</b> is enabled in Marlin, setting the Z offset can easily be done as the first layer goes down. Don't forget to save to EEPROM afterwards. Newer versions of Marlin also have a Z offset wizard that can be included when you compile. I have a dedicated video for this:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/fN_ndWvXGBQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Another advantage of some ABL systems is that once the Z offset is set, you can interchange build surfaces of various thicknesses, with no changes needed for a successful first layer. Assuming the probe is triggered the same way on the bed surface, the Z offset is applied to this trigger point and the first layer height should be the same. On a manually levelled bed, the four corner knobs would need to be turned in unison to raise or lower the bed in accounting for thickness of the new build surface.</p>
<h6 id="fl" >First layer gcode generator</h6>
<p>The following form will create a series of five squares that you can use to live level your bed or set the Z offset. It is quick to print and features one square in the middle of the bed, with four others in the corners. You can use these to turn the levelling knobs in each corner until they are consistent, or ensure your ABL system is working if you have one in place.</p>
<p>This test is intentionally placed before others because it is assumed that your first layer must be reasonable for the later tests to succeed. In some cases, however, if your flow, retraction, etc is way off, it may prevent your first layer from sticking properly and you may wish to try these other tests first.</p>
<a href="#" data-featherlight="img/firstlayerpreview.jpg"><img loading="lazy" class="thumb" src="img/firstlayerpreview.jpg" /></a>
<!-- firstlayerForm -->
<form name="firstlayerForm" id="firstlayerForm" onsubmit="return false;">
<script>
createForm("firstlayer");
</script>
<p><input type="button" onclick="processGcode(form)" value="Download Gcode"></p>
<p><input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters"> <input type="button" onclick="outputSettings(form)" value="Output Settings Summary"></p>
</form>
<h2>Interpreting Results:</h2>
<p>Please use the following video as a guide to this test:</p>
<iframe loading="lazy" width="640" height="480" src="https://www.youtube.com/embed/seBOQpjLCQ4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The following diagram and reference picture can be useful in determing if your first layer is too close or too far away from the nozzle. The reference image is quite large to aid clarity, you may wish to open it in a new tab to view it at maximum size.</p>
<p>If one side looks too close, but the other too far, adjust the levellng knobs to correct this. It is worth printing this gcode more than once after making adjustments to make sure the result is accurate and repeatable.</p>
<a href="#" data-featherlight="img/firstlayer.jpg"><img loading="lazy" class="thumb" src="img/firstlayer.jpg" /></a> <a href="#" data-featherlight="img/firstlayer2.jpg"><img loading="lazy" class="thumb" src="img/firstlayer2.jpg" /></a>
</div>
<div id="baseline">
<div class="exp">
<h2>Baseline Print</h2>
<h5>Aim:</h5>
<p>To establish a baseline for comparison with later tests or before modifications.</p>
<h5>When required:</h5>
<p>Before general calibration or before a significant modification is to be fitted.</p>
<h5>Tools:</h5>
<p>Gcode generator on this page.</p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#bl').offset().top-200)},500);">Scroll to gcode generator</button>
</div>
<h6 id="bl">Baseline test print generator</h6>
<p>The form below will create a customised version of the <a href="https://www.thingiverse.com/thing:1278865" target="_blank">XYZ 20mm calibration cube by iDig3Dprinting</a>. It is fast to print and gives a good indication if there is any fundamental problem with the printer.</p>
<a href="#" data-featherlight="img/cube.jpg"><img loading="lazy" class="thumb" src="img/cube.jpg" /></a>
<!-- baselineForm -->
<form name="baselineForm" id="baselineForm" onsubmit="return false;">
<script>
createForm("baseline");
</script>
<p><input type="button" onclick="processGcode(form)" value="Download Gcode"></p>
<p><input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters"> <input type="button" onclick="outputSettings(form)" value="Output Settings Summary"></p>
</form>
<h2>Interpreting Results:</h2>
<p>Please use the following video as a guide to this test:</p>
<iframe loading="lazy" width="640" height="480" src="https://www.youtube.com/embed/Vf7nSuDGHI0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The cube should look similar to those at the top of this page. If there are no major issues, please continue to the next step. If there is a significant defect, the culprit will likely be found by working through the frame tab. Minor issues will hopefully be resolved with the subsequent tests.</p>
</div>
<div id="esteps">
<div class="exp">
<h2>Extruder E-steps Calibration</h2>
<h5>Aim:</h5>
<p>To determine the correct amount of steps Marlin firmware needs to send to the extruder stepper motor for accurate movement.</p>
<h5>When required:</h5>
<p>Base calibration, as well as any time there has been a change to the extruder/hot end.</p>
<h5>Tools:</h5>
<p>Ruler, permanent marker, terminal software such as <a href="https://www.pronterface.com/" target="_blank">Pronterface</a> or <a href="https://octoprint.org/" target="_blank">Octoprint</a>.</p>
<p>Instructions on how to setup <a href="troubleshooting.html#tools" target="_blank">terminal software</a> can be found <a href="troubleshooting.html#terminal" target="_blank">here.</a></p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#esc').offset().top-200)},500);">Scroll to calculator</button>
</div>
<p>For the X, Y, and Z axes, the steps per mm is usually consistent between printers and rarely changes with modifications. As long as belts are tight and true, it rarely needs to be tuned.</p>
<p>For the extruder however, variations in extruder hardware and filament means it is worth properly calibrating the extruder steps per mm, or E-steps.</p>
<p>This can be done by sending simple gcode commands via terminal to extrude a set amount of filament, then measuring how much filament actually went through the system.</p>
<div class="exp">
<h5>Special Note:</h5>
<p>This calibration is best done with the extruder detached from the hot end, so no restriction is present on the movement. If it is convenient, you can partially disassemble the printer so the output of the extruder is open and the filament exits in free air. If this is inconvenient, the process below aims to minimise restrictions by extruding very slowly and with a slightly higher temperature. The results from this should still be reliable.</p>
</div>
<p>Firstly, we need to know the existing E-steps value. To find this, enter:</p>
<pre>M92</pre>
<p>If you only receive an <i>ok</i> message from this, alternatively you can look for the <b>M92</b> line after entering:</p>
<pre>M503</pre>
<p><a href="https://marlinfw.org/docs/gcode/M092.html" target="_blank">M92</a> is used to report or set the steps per mm for each axis. M92 by itself will report the current parameters. We want to make note of the number after <b>E</b>, in the example below, <b>93.00</b>:</p>
<img src="img/esteps1.jpg" />
<p>Manually move the nozzle high enough above the bed to provide adequate clearance to extrude filament. Now heat up your hot end to whatever temperature you usually print with plus 10 degrees. Once the temperature is stable, enter:</p>
<pre>G91</pre>
<p><a href="https://marlinfw.org/docs/gcode/G091.html" target="_blank">G91</a> puts the printer in relative movement mode. This means requesting 100mm of filament adds 100mm to the current position, instead of moving to the specific position of 100mm.</p>
<p>For Klipper and Rep Rap Firmware, <b>M83</b> is used to select relative extruder movement instead.</p>
<p>Now we take a permanent marker and put a mark 120mm from the entry to the extruder:</p>
<a href="#" data-featherlight="img/mark.jpg"><img loading="lazy" class="thumb" src="img/mark.jpg" /></a>
<p>Next, we enter:</p>
<pre>G1 E100 F50</pre>
<p><a href="https://marlinfw.org/docs/gcode/G000-G001.html" target="_blank">G1</a> sends a move command to the printer, in this case asking the extruder to advance 100mm at a speed of 50mm/min.</p>
<p>The filament will then very slowly go through the extruder (and hot end). Once the extrusion finishes, we measure the distance between the mark and the entry to the extruder.</p>
<img src="img/mark2.jpg" />
<p>Ideally, 20mm remains, which means exactly 100mm was extruded. If your distance is anything other than this, complete the form below to calculate the correct E-steps:</p>
<h6 id="esc">E-steps calculator</h6>
<form name="estepsForm" onsubmit="return false;">
<p><label>Previous E-steps as reported by M92: <input type="number" name="oldSteps" value="93.0" step="0.01"></label></p>
<p><label>Measurement between extruder entry and mark on filament (mm): <input type="number" name="remainingFil" value="20.0" step="0.01"></label></p>
<input type="button" onclick="esteps();" value="Calculate">
<input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters">
<div id="estepsresult">
<p>There was <b id="e1"></b> mm of filament remaining, which means you extruded <b id="e2"></b> mm of filament. Your new E-steps should be <b id="e3"></b><br />
Enter the following in the terminal:</p>
<pre>M92 E<span id="e4"></span></pre>
<p>Followed by M500 to save to EEPROM.</p>
<pre>M500</pre>
<p>You may wish to repeat this test with the new E-steps value to verify.</p>
<p>Special note: Prusa has disabled M500 saving to EEPROM on some printers (eg. Mini). In these cases the above M92 gcode must be added to the start gcode in your slicer to be read before every print.</p>
</div>
</form>
<p>Although starting a new print or power cycling will achieve this, it may be safer to put the printer back into absolute position mode after completing this calibration by sending:</p>
<pre>G90</pre>
<p>For Klipper and Rep Rap Firmware, <b>M82</b> is used to select absolute extruder movement instead.</p>
<h2>Storing the updated E-steps</h2>
<p>Once you have determined the correct value, it must be saved to the firmware to take effect on subsequent prints. Although it can be hard coded into the firmware by recompiling Marlin, it is far easier to use gcode to achieve this.</p>
<p>In a terminal, enter:</p>
<pre>M92 E[your new value]</pre>
<p>Obviously, you would substitute in your E-steps value after the E. Save to EEPROM with:</p>
<pre>M500</pre>
<p>Special note: Prusa has disabled M500 saving to EEPROM on some printers (eg. Mini). In these cases the above M92 gcode must be added to the start gcode in your slicer to be read before every print.</p>
<p>You can also use the <b>Configuration</b> menu on the LCD to make this change, but with a large change (eg. switch to geared extruder) it may take considerable time to turn the knob enough to reach the desired value. Don't forget to <b>Store Settings</b> to save to EEPROM.</p>
<div class="exp">
<h5>Special note for dual/multi extrusion</h5>
<p>By default, Marlin expects the e-steps for each of your extruders to be the same. To work around this, you must compile with <b>DISTINCT_E_FACTORS</b> uncommented/enabled in <b>configuration.h</b>:</p>
<img style="margin-left:50px;" src="img/distinct-e-factors.jpg" />
<p>You will then be able to enter a unique <b>M92</b> value for each extruder.</p>
<p>If recompiling the firmware is not an option. The <i>M92</i> command for each extruder can be inserted into the slicer 'tool change' section. This way the correct e-steps will be set just before extrusion for that tool takes place.</p>
</div>
</div>
<div id="flow">
<div class="exp">
<h2>Slicer Flow Calibration</h2>
<h5>Aim:</h5>
<p>To determine the correct amount filament to be extruded by the 3D printer as directed by the slicer.</p>
<h5>When required:</h5>
<p>Base calibration, as well as any time there has been a change to the extruder/hot end. You may wish to revisit this after tuning linear advance.</p>
<h5>Tools:</h5>
<p>Your favourite slicer. <a href="https://amzn.to/3h62loN" target="_blank">Accurate digital/vernier calipers</a> (two decimal places is much more preferable to a set with only one).</p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#frc').offset().top-200)},500);">Scroll to calculator</button>
</div>
<p>Our E-steps are now correct in the firmware, so we will move on to calibrating the slicer. Each slicer has a setting to control the overall amount of filament extruded by the printer. If the flow rate is increased, more filament will be extruded. If the flow rate is decreased, less filament will be extruded.</p>
<p>In Simplify3D and PrusaSlicer, this is called <b>Extrusion Multiplier</b>. Cura calls it <b>Flow</b>.</p>
<p>My method of determining the correct flow rate is to print a hollow, single wall cube with a specified wall thickness, then measure the actual thickness of the wall and adjust the flow rate in the slicer to suit.</p>
<p>Some people prefer to have multiple walls and measure them together. For example, if the extrusion width was <b>0.4mm</b> with two perimeters, then you would be hoping to measure <b>0.8mm</b> for the cube wall. This does introduce more variables, such as the amount of perimeter overlap, and therefore a risk of the process failing. This is why I personally prefer a single wall cube, but each to their own.</p>
<p>Unfortunately, I can't provide pre-sliced gcode for this process. It is vital to use gcode generated by <i>YOUR</i> slicer. Setting up your slicer to print the cube in the right way should be simple by following these steps:</p>
<table width="100%">
<thead>
<tr>
<th colspan="2"><script>document.write(slicerSelector);</script></th>
</tr>
</thead>
<tbody>
<tr>
<td>1. Import STL</td>
<td style="text-align: center;"><a href="files/cube.stl">cube.stl</a></td>
</tr>
<tr>
<td>2. Turn off infill</td>
<td class="curaContent">Infill > Infill density: 0%</td>
<td class="s3dContent">General settings > Infill percentage: 0%</td>
<td class="prusaslicerContent">Print settings > Infill > Fill density: 0%<br />Also set infill to 0% on main panel</td>
<td class="superslicerContent">Print settings > Infill > Sparse: 0%<br />Also set infill to 0% on main panel</td>
<td class="ideamakerContent">Template > Infill > Infill density: 0%</td>
</tr>
<tr>
<td>3. Turn off top layers</td>
<td class="curaContent">Top/bottom > Top/bottom thickness > Top layers: 0</td>
<td class="s3dContent">Layer > Top solid layers: 0</td>
<td class="prusaslicerContent">Print settings > Layers and perimeters > Horizontal shells > Top: 0</td>
<td class="superslicerContent">Print settings > Perimeters and Shell > Horizontal shells > Top: 0</td>
<td class="ideamakerContent">Template > Solid Fill > Top solid fill layers: 0</td>
</tr>
<tr>
<td>4. Ensure wall thickness is a known value.<br />Substitute whatever values you like here.<br />This example uses <b>0.4</b>, which is common for a 0.4mm nozzle and 0.2mm layer height.</td>
<td class="curaContent">Walls > Wall thickness: <b>0.4</b></td>
<td class="s3dContent">Extruder > Extrusion width > tick manual > <b>0.4</b></td>
<td class="prusaslicerContent">Print settings > Advanced > Extrusion width > Default extrusion width: <b>0.4</b><br />
<i>and</i><br />
Print settings > Advanced > Extrusion width > Perimeters: <b>0.4</b><br />
<i>and</i><br />
Print settings > Advanced > Extrusion width > External perimeters: <b>0.4</b></td>
<td class="superslicerContent">
Print settings > Width and flow > Extrusion width > default: <b>0.4</b><br />
<i>and</i><br />
Print settings > Width and flow > Extrusion width > perimeter: <b>0.4</b><br />
<i>and</i><br />
Print settings > Width and flow > Extrusion width > external perimeter: <b>0.4</b></td>
<td class="ideamakerContent">Template > Extruder > Extrusion width: <b>0.4</b></td>
</tr>
<tr>
<td>5. Set outer wall thickness to single extrusion</td>
<td class="curaContent">Walls > Wall line count: 1<br/>(Also ensure Walls > Alternate extra wall is disabled)</td>
<td class="s3dContent">Layer > Outline/Perimeter shells: 1</td>
<td class="prusaslicerContent">Print settings > Layers and perimeters > Vertical shells > Perimeters: 1</td>
<td class="superslicerContent">Print settings > Perimeters and shell > Vertical shells > Perimeters: 1</td>
<td class="ideamakerContent">Template > Layer > Shells: 1</td>
</tr>
<tr>
<td>6. Set flow rate to default: 1.0 / 100%</td>
<td class="curaContent">Material > Flow: 100 & Material > Initial Flow: 100 (first layer flow)</td>
<td class="s3dContent">Extruder > Extrusion multiplier: 1.0</td>
<td class="prusaslicerContent">Filament settings > Filament > Extrusion multiplier: 1</td>
<td class="superslicerContent">Filament settings > Filament > Extrusion multiplier: 1</td>
<td class="ideamakerContent">Primary extruder > General > Flowrate: 100%</td>
</tr>
<tr>
<td>7. Enable vase/spiral mode (optional)</td>
<td class="curaContent"><i>Not recommended for Cura. Testing suggests the flow rate is increased which will void the test.</i></td>
<td class="s3dContent">Layer > Single outline corkscrew printing mode (vase mode)</td>
<td class="prusaslicerContent">Print settings > Layers and perimeters > Vertical shells > Spiral vase</td>
<td class="superslicerContent">Print settings > Perimeters and shells > Vertical shells > Spiral vase</td>
<td class="ideamakerContent">Template > Layer > Spiral vase mode</td>
</tr>
<tr>
<td>8. Expected result:</td>
<td class="curaContent"><img src="img/curacube.jpg" /></td>
<td class="s3dContent"><img src="img/simplify3dcube.jpg" /></td>
<td class="prusaslicerContent"><img src="img/prusaslicercube.jpg" /></td>
<td class="superslicerContent"><img src="img/superslicercube.jpg" /></td>
<td class="ideamakerContent"><img src="img/ideamakercube.jpg" /></td>
</tr>
</tbody>
</table>
<div class="exp">
<h5>Special note:</h5>
<p>Some other factors may affect the accuracy of the result.</p>
<p>Some slicers have a minimum layer time, which on a fast print like this, may slow down the feedrate significantly and alter the wall thickness. You may disable this in the slicer, but if your part cooling system is insufficient, the walls may become very hot and deform.</p>
<p>To overcome this, you may scale up the X and Y dimensions of the cube. As long as the file is sliced as described above, the wall thickness will not alter from this change in scale and the test will be valid.</p>
</div>
<p>Now slice and print!</p>
<h2>Interpreting Results:</h2>
<p>Use digital/vernier callipers to measure the outer wall thickness of the hollow cube. Take measurements in multiple places/sides and average them. You may wish to cut/tear off the lower and upper layers of the cube. This is to remove portions with elephant's foot and/or other abnormalities.</p>
<a href="#" data-featherlight="img/measurecube.jpg"><img loading="lazy" class="thumb" src="img/measurecube.jpg" /></a>
<p>If your measurement is <i>significantly</i> off, the following calculator can then be used to calculate the new flow rate:</p>
<h6 id="frc">Flow rate calculator</h6>
<table>
<thead>
<tr>
<th>Cura / ideaMaker</th>
<th>Simplify3D / PrusaSlicer / SuperSlicer</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<form name="flow1" onsubmit="return false;">
<p><label>Previous flow rate: <input type="number" name="oldFlow1" value="100.0" min="0" max="200" step="1"></label></p>
<p><label>Target wall thickness (mm): <input type="number" name="targetWall" value="0.4" min="0.1" max="1" step="0.01"></label></p>
<p><label>Measured wall thickness (mm): <input type="number" name="measuredWall" value="0.4" min="0.1" max="1" step="0.01"></label></p>
<input type="button" onclick="flowCalc1()" value="Calculate">
<input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters">
<div id="flow1result">
<p>Your new flow rate should be <b id="f1"></b></p>
</div>
</form>
</td>
<td>
<form name="flow2" onsubmit="return false;">
<p><label>Previous flow rate: <input type="number" name="oldFlow2" value="1.0" step="0.1" min="0.1" max="2"></label></p>
<p><label>Target wall thickness (mm): <input type="number" name="targetWall" value="0.4" min="0.1" max="1" step="0.01"></label></p>
<p><label>Measured wall thickness (mm): <input type="number" name="measuredWall" value="0.4" min="0.1" max="1" step="0.01"></label></p>
<input type="button" onclick="flowCalc2();" value="Calculate">
<input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters">
<div id="flow2result">
<p>Your new flow rate should be <b id="f2"></b></p>
</div>
</form>
</td>
</tr>
</tbody>
</table>
<div class="exp">
<h2>Important note!</h2>
<p>What you see with your eyes is more important than a theoretical calculation. After you have performed this calibration, please adjust the flow rate higher or lower based on what you actually see.</p>
<p>For example, the cube shown in the thumbnail of the <a href="https://www.thingiverse.com/thing:1278865" target="_blank">XYZ 20mm calibration cube by iDig3Dprinting</a>:</p>
<a href="#" data-featherlight="img/xyzcube.jpg"><img loading="lazy" class="thumb" src="img/xyzcube.jpg" /></a>
<p>This print shows clear signs of under extrusion. There are gaps in the top infill as well as gaps between the perimeters and infill. Despite what any calibration procedure determined, the flow rate for this slicer/printer combination needs to be increased.</p>
<p><a href="https://all3dp.com/2/over-extrusion-3d-printing-tips-and-tricks-to-solve-it/" target="_blank">This article on all3DP</a> has examples of what over extrusion looks like.</p>
<p>You may also consider holding the cube up to a bright light source, to see if there are any gaps in the extrusion. Small gaps may indicate the need to margially increase flow rate. If this test cube is too small to do this effectively, most models completed in vase/spiral mode will be suitable.</p>
</div>
<h2>Can I use this flow value in the other tests on this site? - <span style="color:red">Important!</span></h2>
<p>The short answer is: not really.</p>
<p>The gcode generators on this site work by using javascript to modify source gcode originally created by Simplify3D. However, when you completed the calibration test above, you sliced your own gcode, making your own baseline and then making a flow adjustment relative to that. Therefore, this test is unique from the others on this site which is why the flow rate doesn't necessarily translate.</p>
<p>Let's say your old flow rate was 100% and you have tested and corrected this to 96%. The gcode on this site originally had a flow rate of 90% when sliced, so applying your 96% to that gives a final result of 86.4%, not 96%. Your slicer profile settings will also be different in other ways, which further complicates matters. Therefore, there is not a straightforward correlation between your slicer and my gcode generators.</p>
<p>The aim of the site is to discover ideal settings you can apply to your own slicer profile, not to optimise the gcode created by the generators. Keep this in mind and focus on the aim of each test, rather than the general print quality.</p>
<p>If you are experiencing significant over or under extrusion that prevents you from using the tests properly, by using the custom start gcode function on this site you can optionally issue an <a href="https://marlinfw.org/docs/gcode/M221.html" target="_blank">M221</a> to override the values in the generatored gcode. For example, using <b>M221 S90</b> would tell the firmware to only extrude 90% of what the gcode asks for. This is an easy method for making a quick correction that will alow the tests to complete successfully.</p>
</div>
<div id="steppers">
<div class="exp">
<h2>Stepper Motor Current Tuning</h2>
<h5>Aim:</h5>
<p>To set the correct amount of current supplied to the stepper motors of the printer. This is set with the stepper motor drivers, located on the mainboard.</p>
<h5>When required:</h5>
<p>If steps are being skipped/missed. If the stepper motors are too hot to touch. When significant changes are made to the motion system (e.g. heavier bed, conversion to direct drive from bowden tube).</p>
<p>If your 3D printer is running fine without hot stepper motors, you may skip this step.</p>
<h5>Tools:</h5>
<p>For newer, 'smart' stepper motor drivers: terminal software such as <a href="https://www.pronterface.com/" target="_blank">Pronterface</a> or <a href="https://octoprint.org/" target="_blank">Octoprint</a>.</p>
<p>For older stepper motor drivers: a multimeter, small screwdriver and a spare wire with alligator clips (optional but recommended).</p>
<p>Instructions on how to setup <a href="troubleshooting.html#tools" target="_blank">terminal software</a> can be found <a href="troubleshooting.html#terminal" target="_blank">here.</a></p>
</div>
<p>Setting the stepper driver current is an important step in calibrating a 3D printer, although typically the value does not need to be exact. There is a window within which the printer will operate without issue.</p>
<p>General methods are used on this page, but if you are after more detail on a specific driver, my <a href="https://www.youtube.com/playlist?list=PLGqRUdq5ULsOIIaBONPU65uH2s6iI6GqY" target="_blank">stepper motor driver guide playlist</a> may be of use.</p>
<p>Although we target a specific current, the following rule of thumb is the most important factor:</p>
<div class="exp">
<h5>Rule of thumb:</h5>
<p>If the stepper motor is missing steps or you are experiencing layer shifts, the stepper current needs to be increased. This will supply more torque to the motor but also make it (and the driver) run hotter.</p>
<p>If the stepper motor is too hot to touch, the stepper current needs to be decreased. This will remove torque and make the motor (and the driver) run cooler.</p>
</div>
<p>Unfortunately, sometimes a stepper motor may be running hot and still missing steps. The following may apply in these cases:</p>
<ul>
<li>In the case of the extruder stepper motor, there may be an obstruction such as a partially blocked nozzle, PTFE tube unseated, hot end temperature too low (increased resistance to melting/flow) and/or first layer too close (nozzle jammed against bed, nowhere for plastic to exit).</li>
<li>For X, Y and Z, the stepper motor may be undersized for the mass it is pushing. This can occur when increasing the size of the printer (e.g. Ender Extender kit), adding something heavier to the bed (e.g. glass/mirror plate), and/or converting from bowden tube to a heavy direct drive extruder.</li>
<li>If there is some sort of mechanical misalignment that makes movement a lot harder. This may be a V-roller that is far too tight or a misaligned Z axis leadscrew causing the Z axis to bind.</li>
<li>The acceleration/jerk and printing speeds are too aggressive for the stepper motors.</li>
<li>Each stepper motor driver has a rated current, if this is too high it will run very hot and potentially cause missed steps. Active cooling can help this, but the current should still be still within the safe specifications for that driver.</li>
</ul>
<p>If tuning the stepper driver current is unable to find a sweet spot, the good news is you can upgrade to a larger stepper motor easily in most cases. Nema17 steppers have the same mounting pattern and output shaft diameter, however you should still check your machine to ensure there is enough room for a longer stepper before any purchase. With all else being equal, a longer stepper motor will be capable of more torque and handling higher current.</p>
<div class="exp">
<p>Depending on the stepper motor driver, there are two ways of setting the current:</p>
<h5>1. Physical:</h5>
<p>For older stepper motor drivers or TMC drivers running in legacy mode, the current is set by turning a trim pot screw on the top of the driver to raise or lower VREF, which in turns sets the driver current.</p>
<h5>2. Gcode:</h5>
<p>On TMC drivers, the current is set directly with gcode commands. This can be set in the firmware, via a terminal or by using the printer's LCD. This value should then be saved to EEPROM to stay persistent.</p>
<p>We will cover these one at a time below.</p>
</div>
<h2>Peak Current and Sense Resistor Value</h2>
<p>Setting stepper driver current accurately relies on knowing two values: the peak current that the stepper motor is rated for and the sense resistor value on the stepper motor driver.</p>
<p>For newer TMC drivers, the sense resistor value is already known. For older drivers, methods for determining this are seen in the following snippet. Methods for determining the stepper motor peak current are shown too:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/H41hIXdB6js?start=307&end=359" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h2>1. Physical</h2>
<p>I have covered this in detail before, so please use the embedded video below (queued to the correct time) to see how to set the VREF. The process is essentially the same for any driver.</p>
<p>The VREF is just a reference voltage to assist us in setting the driver current. It is used because it is much simpler to measure voltage rather than current with a multimeter. Typically these drivers have the peak/max current set.</p>
<p>The general steps for setting current via VREF are the same between drivers, only the VREF formula changes:</p>
<ol>
<li>Power up mainboard via 12/24V normal power supply, <i>NOT</i> just USB 5V.</li>
<li>Set multimeter to DC voltage, max 2V range.</li>
<li>Connect black/negative multimeter probe to ground. This can be a negative terminal or the top of the USB connector.</li>
<li>Connect the red/positive probe to the trim pot on top of the driver to measure VREF.</li>
<li>Turn the trim pot <i>SLOWLY</i> with a screwdriver, then remeasure.</li>
<li>Repeat for each stepper motor driver.</li>
</ol>
<p>Alternatively, you can use an alligator clip wire between the red probe and the metal shaft of the screwdriver, so that a VREF reading is available as you turn the screwdriver. This procedure is shown in this snippet:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/H41hIXdB6js?start=389&end=438" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The VREF formulas for drivers I have tested are as follows:</p>
<h4>A4988</h4>
<p>The typical sense resistor value is 0.1. Please check your drivers to be sure.</p>
<pre>VREF = 8 x max current x sense resistor value</pre>
<p>Then use the video above as a guide to the process.</p>
<h4>DRV8825</h4>
<p>The sense resistor value should be 0.1. If it is:</p>
<pre>VREF = max current / 2</pre>
<p>The process is then the same as for A4988s as shown in the video above.</p>
<h4>TMC2100</h4>
<p>Like the TMC drivers covered in the gcode section, the current for the TMC2100 is set not as a peak, but instead as RMS. To determine RMS, divide the peak current by <b>1.41</b>.</p>
<pre>VREF = (RMS current * 2.5) / 1.77</pre>
<p>The process is then the same as for A4988s as shown in the video above.</p>
<h4>TMC2208 - Legacy/standalone mode (as found in Creality silent boards)</h4>
<p>Like the TMC drivers covered in the gcode section, the current for the TMC2208 (legacy mode) is set not as a peak, but instead as RMS. To determine RMS, divide the peak current by <b>1.41</b>.</p>
<pre>VREF = (RMS current * 2.5) / 1.77</pre>
<p>The process is then the same as for A4988s as shown in the video above.</p>
<div class="exp">
<h5>Special note for some Creality silent boards</h5>
<p>Courtesy of <a href="https://github.com/teachingtechYT/teachingtechYT.github.io/issues/168" target="_blank">ZuckMe</a>:</p>
<p>"My creality silent board has <b>R150</b> sense resistors not <b>R100</b> so the VREF formula is wrong, for details here": <a href="https://www.eevblog.com/forum/chat/3d-printer-yet/msg3271034/#msg3271034" target="_blank">EEVBLOG</a></p>
</div>
<h4>LV8729</h4>
<p>There are mainly two kinds of stepper driver boards with this driver.</p>
<p>One has a resistor labelled R100 on the bottom, and on the other the resistor is labelled R220. Which formula you use is based off of this resistor</p>
<p>The process is then mostly the same as for A4988s as shown in the video above, but with the correct formula for your driver board.</p>
<p>R100:</p>
<pre>VREF = max current / 2</pre>
<p>R220:</p>
<pre>VREF = max current * 1.1</pre>
<h2>2. Gcode</h2>
<p>TMC drivers connected via UART or SPI serial can easily have their current set via gcode. This is not peak current, but rather RMS (root mean square) current. Rather than the maximum, think of this as more a typical/average current, where the driver will be operating mostly. To convert the peak current from stepper motor specs to RMS, divide it by <b>1.41</b>.</p>
<p>The current can be set in a few different ways for each driver:</p>
<h4>TMC2208, TMC2209, TMC2130, etc</h4>
<p>These drivers should have a sense resistor value of <b>0.11</b>. This is the default in Marlin, so when compiling it should already be set (<b>X_RSENSE</b> for the X axis, <b>Y_SENSE</b> for Y and so forth):</p>
<img src="img/tmc1.jpg" />
<p>Therefore, you can set your RMS current directly in the firmware when compiling. This is <b>X_CURRENT</b> for the X axis, <b>Y_CURRENT</b> for the Y and so forth. After flashing firmware, remember that the previous value may still be stored in the EEPROM. Check your values by entering <b>M503</b> in a terminal.</p>
<p>You can also set the RMS current via terminal with <a href="https://marlinfw.org/docs/gcode/M906.html" target="_blank">M906</a>. Please follow the link to see the reference. An example of setting the X axis current to 680 would be:</p>
<pre>M906 X680</pre>
<p>Don't forget to save the value to EEPROM afterwards with:</p> <pre>M500</pre>
<p>Finally, the LCD <b>Configuration</b> menu can be used to set the RMS current. Don't forget to save afterwards by clicking on <b>Store Settings</b>.</p>
<h4>TMC5160</h4>
<p>The TMC5160 is the same as the other TMC drivers apart from one important difference: the sense resistor value needs to be changed from <b>0.11</b> to <b>0.075</b> when compiling the firmware.</p>
<img src="img/tmc2.jpg" />
<p>After this change is made, the same procedures apply:</p>
<p>You can set your RMS current directly in the firmware when compiling. This is <b>X_CURRENT</b> for the X axis, <b>Y_CURRENT</b> for the Y and so forth. After flashing firmware, remember that the previous value may still be stored in the EEPROM. Check your values by entering <b>M503</b> in a terminal.</p>
<p>You can also set the RMS current via terminal with <a href="https://marlinfw.org/docs/gcode/M906.html" target="_blank">M906</a>. Please follow the link to see the reference. An example of setting the X axis current to 680 would be:</p>
<pre>M906 X680</pre>
<p>Don't forget to save the value to EEPROM afterwards with:</p> <pre>M500</pre>
<p>Finally, the LCD <b>Configuration</b> menu can be used to set the RMS current. Don't forget to save afterwards by clicking on <b>Store Settings</b>.</p>
</div>
<div id="retraction">
<div class="exp">
<h2>Retraction Tuning</h2>
<h5>Aim:</h5>
<p>To set the correct parameters concerning retraction during 3D printing, including retraction distance, speed, extra restart distance, prime speed and z hop.</p>
<h5>When required:</h5>
<p>Initial calibration, any time the hot end or extruder is changed, when trying a new type/brand of filament.</p>
<h5>Tools:</h5>
<p>Gcode generator on this page.</p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#ret').offset().top-200)},500);">Scroll to gcode generator</button>
</div>
<p>FDM works by melting plastic filament and extruding it accurately one layer at a time to build up 3D geometry. By its nature, the plastic will continue to ooze and drip out of the nozzle even when not pushed by the extruder. To combat this, our slicers use retraction, where the filament is withdrawn from the hot end, alleviating pressure and minimising ooze. When properly tuned, this has the effect of removing stringing, the unwanted oozing of plastic between two points of the model.</p>
<p>An example of fine stringing can be seen in the following image. It appears like cobwebs:</p>
<a href="#" data-featherlight="img/stringing.jpg"><img loading="lazy" class="thumb" src="img/stringing.jpg" /></a>
<div class="exp">
<h5>Special note:</h5>
<p>Temperature tuning and retraction tuning are related to each other. You could do them in either order, and it may be necessary to tune back and forth to reach an ideal result. A higher nozzle temperature will promote more oozing and stringing, whereas a lower temperature will reduce oozing and stringing.</p>
</div>
<p>Besides hot end temperature, there are five parameters we will be tuning relating to retraction. In the table is a description of each as well as where the setting is found in the most popular slicers. By far the most important is retraction distance.</p>
<table>
<thead>
<tr>
<th>Retraction Parameter</th>
<th><script>document.write(slicerSelector);</script></th>
</tr>
</thead>
<tbody>
<tr>
<td><b>Retraction distance</b>: The length the filament is pulled away from the nozzle in mm.</td>
<td class="curaContent">Travel > Retraction distance</td>
<td class="s3dContent">Extruder > Retraction distance</td>
<td class="prusaslicerContent">Printer settings > Extruder 1 > Retraction > Length</td>
<td class="superslicerContent">Printer settings > Extruder 1 > Retraction > Length</td>
<td class="ideamakerContent">Template > Extruder > Retraction > Retraction Material Amount</td>
</tr>
<tr>
<td><b>Retraction speed</b>: The speed at which this filament is withdrawn in mm/sec.</td>
<td class="curaContent">Travel > Retraction speed</td>
<td class="s3dContent">Extruder > Retraction speed</td>
<td class="prusaslicerContent">Printer settings > Extruder 1 > Retraction > Retraction Speed</td>
<td class="superslicerContent">Printer settings > Extruder 1 > Retraction > Retraction Speed</td>
<td class="ideamakerContent">Template > Extruder > Retraction > Retraction Speed</td>
</tr>
<tr>
<td><b>Extra restart distance</b>: The retraction distance will be reversed when the travel (non-extruding) movement is over. This is typically zero, but you can opt for extra filament to be extruded (a positive value) or less than what was retracted (a negative value). Also measured in mm.</td>
<td class="curaContent">Travel > Retraction extra prime amount</td>
<td class="s3dContent">Extruder > Extra restart distance</td>
<td class="prusaslicerContent">Printer settings > Extruder 1 > Retraction > Extra length on restart</td>
<td class="superslicerContent">Printer settings > Extruder 1 > Retraction > Extra length on restart</td>
<td class="ideamakerContent">Template > Extruder > Retraction > Extra Restart Amount</td>
</tr>
<tr>
<td><b>Prime (unretract) speed</b>: The speed at which this filament is reintroduced to the nozzle in mm/sec.</td>
<td class="curaContent">Travel > Retraction prime speed</td>
<td class="s3dContent"><i>Not supported. S3D will use retraction speed as prime speed.</i></td>
<td class="prusaslicerContent">Printer settings > Extruder 1 > Retraction > Deretraction speed</td>
<td class="superslicerContent">Printer settings > Extruder 1 > Retraction > Deretraction speed</td>
<td class="ideamakerContent">Template > Extruder > Retraction > Restart Speed</td>
</tr>
<tr>
<td><b>Z hop</b>: The amount the nozzle lifts vertically in mm during a travel (non-extruding) movement. After this movement, the correct Z value is then restored before the filament is unretracted/primed again ready for printing.</td>
<td class="curaContent">Travel > Z hop when retracted</td>
<td class="s3dContent">Extruder > Retraction vertical lift</td>
<td class="prusaslicerContent">Printer settings > Extruder 1 > Retraction > Lift z</td>
<td class="superslicerContent">Printer settings > Extruder 1 > Retraction > Lift z</td>
<td class="ideamakerContent">Template > Extruder > Retraction > Z Hop at Retraction</td>
</tr>
</tbody>
</table>
<h6 id="ret">Retraction tuning tower generator</h6>
<p>The following form will create a retraction tower to conveniently test back to back parameters in the same print. Of the three available parameters, it is best to change only one per test print. For example, keep the retraction speed and extra restart distance the same, but vary the retraction distance over each segment. Changing more than one parameter makes is hard to tell what made the difference. The print is quick, so repeat the test varying other parameters until you are happy with them all.</p>
<p>Here is the STL if you would like to slice a similar test yourself: <a href="files/retractiontestv2.stl">retractiontestv2.stl</a>. This file has been updated to V2, which changes the external shape from circular to pentagonal. It is also prints slightly faster. The original file is still available here: <a href="files/retractiontest.stl">retractiontest.stl</a></p>
<!-- retractionForm -->
<form name="retractionForm" id="retractionForm" onsubmit="return false;">
<script>
createForm("retraction");
</script>
<p><input type="button" onclick="processGcode(form)" value="Download Gcode"></p>
<p><input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters"> <input type="button" onclick="outputSettings(form)" value="Output Settings Summary"></p>
</form>
<h2>Interpreting Results:</h2>
<p>Please use the following video as a guide to this test:</p>
<iframe loading="lazy" width="640" height="480" src="https://www.youtube.com/embed/JY6E9srwZm0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Inspect your finished print. Hopefully, there will be a clear difference between the segments that reflect the settings you entered. In the example below (Ender 3 direct drive, PLA, linear advance enabled), the retraction distance varied from 0.4 up to 1.4mm in 0.2mm increments. Segments A and B have the least stringing. Based on this, I would assume that a retraction distance of 0.4 - 0.6 is best for this printer. this is consistent with linear advance being enabled.</p>
<p>I would then repeat the test, setting the same retraction distance for each segment and instead altering the retraction speed to dial that in. A third test could then take place to test extra restart distance, a fourth for Z hop, etc.</p>
<a href="#" data-featherlight="img/retractionresults.jpg"><img loading="lazy" class="thumb" src="img/retractionresults.jpg" /></a>
<p>If you would like to be able to customise additional parameters for a retraction test, Prahjister has made a great tool: <a href="http://retractioncalibration.com/" target="_blank">Retraction Calibration Tool</a>. It has a higher degree of difficulty due to needing more parameters but is ultimately more powerful. Warning! This is an external website and beyond my control. Some users have reported success and others have had issues with the gcode generated. As with the gcode made by this website, monitor your printer during printing with a view to cutting the power if needed.</p>
<div class="exp">
<h5>I can't translate my test results to my own slicer! Other factors beyond the scope of this test - <span style="color:red;">Important!</span></h5>
<p>After you have found a combination of parameters which works well on your machine, the idea is to then translate them to your own slicing profile. If you can't replicate the results, please work through the following:</p>
<ul>
<li>Slow down is layer time is below (PrusaSlicer) / Speed Overrides (Simplify3D) / Minimum layer time (Cura): Most slicers have a setting to detect if a layer will complete in less than a certain time threshold. In this case, all movement for that layer is slowed, including those related to retraction, to increase the layer time to meet the target. The gcode generated by the this page has this setting OFF. If your results vary, trying turning this setting off in your own slicer too.</li>
<li>Z hop speed: If you are using Z hop, the vertical feedrate for the Z movements is set to 20 mm/sec for these tests. Matching this in your slicer is advised if these tests look better than your own slicer results.</li>
<li>Retraction acceleration: This will affect whether the retraction speed can actually be reached. The gcode generator below does not include any changes to what is set on your printer. You can change this with <a href="https://marlinfw.org/docs/gcode/M204.html" target="_blank">M204</a> and the <b>R</b> argument.</li>
<li>Slicer settings such as coast and wipe: Coast stops extrusion slightly early to assist retraction. It effectively lets the hot end 'run dry' at the end of the printing movement to reduce ooze. This varies from slicer to slicer and isn't always necessary to tune.
<br />Wipe moves the nozzle back towards the recently printed geometry to wipe ooze off. If you are having trouble reducing stringing, it may be a good option.
<br />Both coast and wipe are turned off in the gcode generator below.</li>
<li>Maximum extruder feedrate: Your firmware may have a hard limit imposed on extruder movement that is below the retraction speed values you are attempting to use with the form above. You may need to use <a href="https://marlinfw.org/docs/gcode/M203.html" target="_blank">M203</a> to raise the extruder feedrate limit to try higher values for retraction speed. This potentially needs to be saved with <b>M500</b> if you want it to be permanent.</li>
<li>Travel feedrate: A travel move is one where the printer moves to a new location without extruding. The slower this move is, the more time filament will have to ooze from the nozzle and add to stringing. The default feedrate is set to 100mm/sec in the gcode generator above, and increases or decreases based on the user feedrate input. Matching this in your slicer is advised if these tests look better than your own slicer results.</li>
<li>Travel acceleration: This test does not manipulate travel acceleration but increasing its value may help reduce stringing. You can change travel acceleration with <a href="https://marlinfw.org/docs/gcode/M204.html" target="_blank">M204</a> and the <b>T</b> argument.</li>
<li>Linear advance: Linear advance, covered later in this guide, can drastically improve the accuracy of our extrusion. It has a significant impact of retraction (reducing the need), so after configuring linear advance you may need to revisit retraction.</li>
<li>Slicer differences: The gcode generated below was originally sliced by Simplify3D. The settings you establish should translate to your slicer quite well but there may be idiosyncrasies. For instance, Cura measures extra restart distance in volume rather than length.</li>
</ul>
</div>
</div>
<div id="temp">
<div class="exp">
<h2>Temperature Tuning</h2>
<h5>Aim:</h5>
<p>To set the ideal printing temperature for the hot end for a given filament.</p>
<h5>When required:</h5>
<p>Initial calibration, any time the hot end is changed, when trying a new type/brand of filament.</p>
<h5>Tools:</h5>
<p>Gcode generator on this page.</p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#tmp').offset().top-200)},500);">Scroll to gcode generator</button>
</div>
<p>For this calibration, we are only concerned with the temperature of the hot end, not the bed. The bed temperature will need to be matched to any given filament, and once a good value is found, you will generally stick with it.</p>
<p>Instead here we are tuning the temperature at which the filament is extruded. There is no universal temperature for a given filament. Variations in heater blocks and thermistor placement dictate this.</p>
<div class="exp">
<h5>Rule of thumb and special note:</h5>
<p>A higher nozzle temperature should result in stronger parts, particularly interlayer adhesion. Part surface may be shinier. The filament will be softer so ooze and stringing may be increased, and some surface detail potentially lost, especially on overhangs. A hot end temperature too high may damage parts of the assembly such as the internal PTFE tube.</p>
<p>A lower nozzle temperature should result in weaker parts, particularly interlayer adhesion. Part surface may be duller. The filament will be firmer so ooze and stringing may be reduced, with good surface detail, especially on overhangs. A hot end temperature too low can cause the hot end to jam.</p>
<p>Temperature tuning and retraction tuning are related to each other. You could do them in either order, and it may be necessary to tune back and forth to reach an ideal result.</p>
</div>
<p>The following form will create a temperature tower to conveniently test back to back parameters in the same print. There are five segments to vary the temperature. Generally the lowest temperatures would be at the start of the print (segment A) and the increase up to the highest by the top of the print (segment E).</p>
<p>Your 3D printer firmware will have a minimum hot end temperature extrusion is allowed and a maximum hot end temperature for safety. Make sure to keep within these boundaries to avoid errors.</p>
<p>Here is the STL if you would like to slice a similar test yourself: <a href="files/temperaturetowerv2.stl">temperaturetowerv2.stl</a>. This is an updated model that prints in less time, has more variation in overhangs, and has a narrow pyramid in each band to try and snap off to test layer adhesion.</p>
<p>The original design can be found here: <a href="files/temperaturetower.stl">temperaturetower.stl</a></p>
<h6 id="tmp">Temperature tuning tower generator</h6>
<!-- temperatureForm -->
<form name="temperatureForm" id="temperatureForm" onsubmit="return false;">
<script>
createForm("temperature");
</script>
<p><input type="button" onclick="processGcode(form)" value="Download Gcode"></p>
<p><input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters"> <input type="button" onclick="outputSettings(form)" value="Output Settings Summary"></p>
</form>
<h2>Interpreting Results:</h2>
<p>Please use the following video as a guide to this test:</p>
<iframe loading="lazy" width="640" height="480" src="https://www.youtube.com/embed/D6m_kYhOth0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Inspect your finished print. Hopefully, there will be a clear difference between the segments that reflect the temperatures you entered. In the example below (Ender 3 direct drive, PLA, linear advance enabled), the hot end temperature varied from 180 to 260 in 20 degree increments</p>
<a href="#" data-featherlight="img/temperatureresults.jpg"><img loading="lazy" class="thumb" src="img/temperatureresults.jpg" /></a>
<p>As expected, surfaces becomes more glossy as the temperature increases. What was unexpected was surface rippling being more obvious as the temperatures went up. Overhangs and bridges all look good on this test, however the little spikes could not be printed accurately at the higher temps due to the part cooling system not keeping up. The coolest spike in segment A was very brittle, the spike on segment C the strongest, and the upper spikes too malformed to test accurately.</p>
<p>My previous hot end temperature was 200 degrees for this printer, but I will consider raising it to 210 degrees after this test to gain some interlayer strength without any trouble with part cooling.</p>
</div>
<div id="accel">
<div class="exp">
<h2>Acceleration Tuning</h2>
<h5>Aim:</h5>
<p>To find the right compromise between printing speed and quality, specifically related to surface artefacts such as ghosting.</p>
<h5>When required:</h5>
<p>Initial calibration, when significant changes are made to the motion system (e.g. heavier bed, conversion to direct drive from bowden tube).</p>
<h5>Tools:</h5>
<p>Terminal software such as <a href="https://www.pronterface.com/" target="_blank">Pronterface</a> or <a href="https://octoprint.org/" target="_blank">Octoprint</a>.</p>
<p>Gcode generator on this page.</p>
<p>Instructions on how to setup <a href="troubleshooting.html#tools" target="_blank">terminal software</a> can be found <a href="troubleshooting.html#terminal" target="_blank">here.</a></p>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#acc').offset().top-200)},500);">Scroll to gcode generator</button>
<button class="zoom" onclick="$('html, body').animate({scrollTop: ($('#mfc').offset().top-200)},500);">Scroll to max feedrate calculator</button>
</div>
<p>We set a feedrate or movement speed in our slicer, but the printer does not instantly reach these speeds. Like a motor vehicle, it needs time to accelerate. If the distance of the movement is short, it may not even have time to reach the specified speed. This can determined with the handy <a href="https://blog.prusaprinters.org/calculator/" target="_blank">acceleration calculator</a>, available on the Prusa website.</p>
<p>Complementary to acceleration we have jerk, replaced by junction deviation in newer versions of Marlin. These settings have differences, but both are essentially responsible for making sure the printer does not come to a complete stop between each movement, but rather decelerates an appropriate amount depending on the angle of the next 'corner'.</p>
<p>We will be tuning both of these parameters with another tower. The aim is to have a reasonably fast print time without inducing excessive ringing/ghosting. An example of bad ghosting is seen below. The features of the model are repeated across the surfaces due to vibration of the printer components:</p>
<a href="#" data-featherlight="img/ghosting.jpg"><img loading="lazy" class="thumb" src="img/ghosting.jpg" /></a>
<p>I have previously made a detailed video guide on this subject, complete with many diagrams explaining the concepts. The tuning process depicted will be improved upon here with an easier to use calculator and custom gcode generator below.</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/Mnvj6xCzikM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<div class="exp">
<h5>Rule of thumb:</h5>
<p>Higher acceleration and jerk will result in a faster print time, as the printer reaches top speed faster and maintains a higher speed when corning. This is harder on the printer, and may result in reduced lifespan of components and the need for more regular maintenance. It also introduces more surface defects such as ringing/ghosting.</p>
<p>Lower acceleration and jerk will result in a slower print time, as the printer reaches top speed more gradually and corners at a lower velocity. This is easier on the printer, with potentially increased component lifespan and less need for regular maintenance. It reduces surface artefacts such as ringing/ghosting, unless it is far too conservative, in which case it may introduce bulging in corners.</p>
</div>
<h2>Calculating maximum feedrate - optional but strongly recommended</h2>
<p>This is simplified test that will not be as accurate as using the gcode generator on the <a href="calibration.html#speed" target="_blank">Speed/Max flow tab</a>. If you would like to see it, you can toggle visibility <span style="cursor:pointer;" onclick="$('#oldFlowTest').toggle();"><b>here</b></span>.</p>
<div id="oldFlowTest" style="display:none;">
<p>One strategy is to calculate the fastest your 3D printer can move while extruding cleanly, set this feedrate in the slicer, and then tune acceleration to meet this speed. If you are not interested in printing as fast as possible, skip to the next section.</p>
<p><i>This part of the guide and calculator is adapted from <a href="https://grabcad.com/tutorials/dialing-in-a-filament-and-specifying-the-max-volumetric-e-xtrusion-value" target="_blank">Martin Pirringer's tutorial</a>. Please consider supporting him and his robotics team through <a href="paypal.me/DudeWithaPulse" target="_blank">paypal</a> or you can also donate to team 1989 through their <a href="https://www.vernonrobotics.com" target="_blank">Team 1989 Web Site</a></i></p>
<p>The following calculator will assist you in determining the maximum feedrate your printer/extruder/hot end is capable of.</p>
<ol>
<li>Clear debris from hobbed gear, bring nozzle up to normal printing temp and load filament.</li>
<li>Enter the following into pronterface. This will set movement to relative and then extrude 50mm of filament at a feedrate of 2mm/sec:</li>
<pre>G91</pre>
<pre>G1 E50 F120</pre>
<li>Inspect extruded filament for consistency. If all is well, keep repeating with higher feedrate F, until extrusion is inconsistent, extruder stepper skips steps and/or hobbed gear starts eating into filament.<br />
The following are examples of increasing the extruder feed rate by 1mm/sec each time, although you should stop when the extrusion becomes problematic. You may have more or less steps than this:</li>
<pre>G1 E50 F180</pre>
<pre>G1 E50 F240</pre>
<pre>G1 E50 F300</pre>
<pre>G1 E50 F360</pre>
<pre>...</pre>
<li>After you find the limiting speed, back off and repeat the test at a lower feedrate several times in a row until you are confident of reliable and repeatable extrusion. <br />Don't forget to put the printer back into absolute movement mode:</li>
<pre>G90</pre>
<li>Enter your reliable feedrate and filament diameter below:</li>
<h6 id="mfc">Maximum feedrate calculator</h6>
<form id="maxExtrusion1" name="maxExtrusion1">
<label>Reliable feedrate: <input type="number" min="60" max="1000" name="maxFeed" value="180" step="10" onchange="maxExt(); maxFee();"></label>
<label>Filament diameter: <input type="number" min="1.5" max="4" name="filDia" value="1.75" step="0.05" onchange="maxExt(); maxFee();"></label>
<p class="result">Your maximum reliable extrusion rate is <b><span id="maxExt">7.22</span> mm³</b> per second.</p>
</form>
<li>Enter the following settings from your slicer:</li>
<table>
<thead>
<tr>
<th>Input setting:</th>
<th><script>document.write(slicerSelector);</script></th>
</tr>
</thead>
<tbody>
<tr>
<form id="maxExtrusion2" name="maxExtrusion2">
<td><label>Layer height (mm): <input type="number" name="layerH" min="0.05" max="1" value="0.2" step="0.05" onchange="maxFee();"></label></td>
<td class="curaContent">Quality > Layer height</td>
<td class="s3dContent">Layer > Primary layer height</td>
<td class="prusaslicerContent">Print settings > Layers and perimeters > Layer height > Layer height</td>
<td class="superslicerContent">Print settings > Slicing > Layer height > Base Layer height</td>
<td class="ideamakerContent">Template > Layer > General > Layer height</td>
</tr>
<tr>
<td><label>Extrusion width (mm): <input type="number" name="layerW" min="0.1" max="1" value="0.4" step="0.01" onchange="maxFee();"></label></td>
<td class="curaContent">Quality > Line width</td>
<td class="s3dContent">Extruder > Extrusion width</td>
<td class="prusaslicerContent">Print settings > Advanced > Extrusion width > Default extrusion width</td>
<td class="superslicerContent">Print settings > Width & Flow > Extrusion width > default</td>
<td class="ideamakerContent">Template > Extruder > General > Extrusion width</td>
</form>
</tr>
</tbody>
</table>
<p class="result">Your maximum reliable XY feedrate is <b><span id="maxFee">90</span> mm</b> per second.</p>
<p class="warning">Warning: This value is dependent on a number of variables such as filament type, brand, colour, ambient temperature, etc. Be conservative to ensure success.</p>
</ol>
</div>
<h2>Acceleration Tuning</h2>
<p>We will now produce an acceleration tower to conveniently test back to back settings in a single print. If you would like to slice the model yourself, here is the STL: <a href="files/accelerationtower.stl">accelerationtower.stl</a>. It should be sliced with a normal base, but hollow, no top layers and only 2 perimeters.</p>
<script>document.write(firmwareSelector);</script>
<div class="marlinContent">
<p>With Marlin firmware, the only thing you need to know before this test is whether your firmware is set up for jerk (older) or junction deviation (newer). Entering <b>M503</b> via terminal will give a list of printer variables:</p>
<ul>
<li>If the <b>M205</b> line contains the letters <b>X, Y & Z</b>, your printer is running jerk. The numbers after the X,Y & Z are your current jerk values for each axis.</li>
<li>If the <b>M205</b> contains the letter <b>J</b>, your printer is running junction deviation. The number after the J is your current junction deviation value.</li>
</ul>
<p>The image below shows an example of each of these scenarios:</p>
<a href="#" data-featherlight="img/m205.jpg"><img loading="lazy" class="thumb" src="img/m205.jpg" /></a>
<p>Use the following form to customise the gcode to your liking:</p>
</div>
<div class="klipperContent">
<p>Klipper uses both <b>ACCEL</b> and <b>ACCEL_TO_DECEL</b>. The difference between the is explained <a href="https://www.klipper3d.org/Config_Reference.html#printer" target="_blank">here</a>.</p>
<p>Klipper uses a value known as Square Corner Velocity (SCV) instead of junction deviation or jerk, but the idea behind it is the same. A value of 5 mm/sec will allow the toolhead to slow to and maintain a 5 mm/sec speed for a 90 degree corner. This speed will be higher for a shallower turn and lower for a sharper turn.</p>
</div>
<div class="rrfContent">
<p>RepRapFirmware uses <a href="https://duet3d.dozuki.com/Wiki/M205" target="_blank">M205</a> to set Max Instantaneous Speed Change instead of jerk or junction deviation, but the idea behind it is the same.</p>
</div>
<h6 id="acc">Acceleration & jerk/junction deviation tuning tower generator</h6>
<p>The STL for this test is available here: <a href="files/accelerationtower.stl">accelerationtower.stl</a></p>
<!-- accelerationForm -->
<form name="accelerationForm" id="accelerationForm" onsubmit="return false;">
<script>
createForm("acceleration");
</script>
<p><input type="button" onclick="processGcode(form)" value="Download Gcode"></p>
<p><input type="button" onclick="resetFormToDefaults(form)" value="Reset parameters"> <input type="button" onclick="outputSettings(form)" value="Output Settings Summary"></p>
<p class="warning">This gcode will raise the acceleration limits (<a href="https://marlinfw.org/docs/gcode/M201.html" target="_blank">M201</a>), set acceleration (<a href="https://marlinfw.org/docs/gcode/M204.html" target="_blank">M204</a>) and set junction deviation/jerk (<a href="https://marlinfw.org/docs/gcode/M205.html" target="_blank">M205</a>) for the purposes of the test. If you print another job afterwards these higher values will still be in place. If you are unsure how to restore your previous values, the easiest thing to do is to power cycle the printer.</p>
</form>
<h2>Interpreting Results:</h2>
<p>Please use the following video as a guide to this test:</p>
<iframe loading="lazy" width="640" height="480" src="https://www.youtube.com/embed/SIsKQIyuzYs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>You may initially think the X and Y labels are facing the wrong way, but they are not. This is explained and demonstrated in the video above.</p>
<p>You may also notice a few bits of stringing. These are a quirk of how the test was originally sliced and can safely be ignored.</p>
<p>Inspect your finished print. Hopefully, there will be a clear difference between the segments that reflect the acceleration values you entered. In the example below (Ender 3 direct drive, PLA, linear advance enabled), acceleration varied from 300 to 800 in 100 mm/sec/sec increments. Junction deviation was left at the default 0.08. The difference between each segment is subtle, but there is increased ghosting around the letter Y on the higher segments. In the lowest segment, the gentle acceleration means the nozzle spends more time in the corners and they tend to bulge. This would be more evident if linear advance was disabled.</p>
<p>The ideal segment will have the best compromise between low acceleration corner bulging and high acceleration ringing.</p>
<p>My previous value was 500, but a small increase in quality may be achieved from lowering the value to 400.</p>
<a href="#" data-featherlight="img/accelerationresults.jpg"><img loading="lazy" class="thumb" src="img/accelerationresults.jpg" /></a>
<script>document.write(firmwareSelector);</script>
<div class="marlinContent">
<p>Once you have an acceleration value you are happy with, you can update with:</p>
<pre>M204 P400</pre>
<p>where <b>400</b> is the value of the acceleration with the best compromise based on the tower test print.</p>
<p>It's also worth noting that the <b>M201 value acts as a per axis limit for acceleration</b>. For example, if you set the <b>M204</b> print acceleration to 1000 but the X and Y <b>M201</b> acceleration limits are only 800, then the <b>M204 P</b> value will be capped at 800. Use <b>M503</b> to see the current <b>M201</b> values, and if necessary, use <b>M201</b> to set higher X and Y acceleration limit values to suit.</p>
<p>We can store the new value(s) to EEPROM by sending:</p>
<pre>M500</pre>
<p>You would then repeat the test with all of the acceleration values locked at your preferred value for each segment, but this time varying jerk/junction deviation.</p>
<p>To save for a printer with jerk (with a determined best compromise of <b>8</b> for this example), we would enter:</p>
<pre>M205 X8 Y8</pre>
<p>To save for a printer with junction deviation (with a determined best compromise of <b>0.05</b> for this example), we would enter:</p>
<pre>M205 J0.05</pre>
<p>Either way, we save to EEPROM afterwards with:</p>
<pre>M500</pre>
<p>Each of these parameters can also be entered and stored from the <b>configuration</b> menu of the Marlin LCD.</p>
</div>
<div class="klipperContent">
<p>Once you have an acceleration value you are happy with, you can edit the <a href="https://www.klipper3d.org/Config_Reference.html#printer" target="_blank">[printer]</a> section of <b>printer.cfg</b></p>
<pre>[printer]
max_accel: 400
max_accel_to_decel: 400</pre>
<p>where <b>400</b> is the value of the acceleration with the best compromise based on the tower test print.</p>
<p>Obviously you can enter a unique value for <b>MAX_ACCEL_TO_DECEL</b> compared to <b>MAX_ACCEL</b>.</p>
<p>You would then repeat the test with all of the acceleration values locked at your preferred value for each segment, but this time varying square corner velocity.</p>
<p>To save an example value of <b>8</b> you can edit the <a href="https://www.klipper3d.org/Config_Reference.html#printer" target="_blank">[printer]</a> section of <b>printer.cfg</b></p>
<pre>[printer]
square_corner_velocity: 8.0</pre>
<p>Save config to restart Klipper with the changes in effect.</p>
</div>
<div class="rrfContent">
<p>Once you have an acceleration value you are happy with, you can edit <b>config.g</b> with:</p>
<pre>M204 P400 T[value]</pre>
<p>where <b>400</b> is the value of the acceleration with the best compromise based on the tower test print. The T value represents travel acceleration, when no filament is being extruded. It can likely be a higher valu without any loss in quality.</p>
<p>It's also worth noting that the <b>M201 value acts as a per axis limit for acceleration</b>. For example, if you set the <b>M204</b> print acceleration to 1000 but the X and Y <b>M201</b> acceleration limits are only 800, then the <b>M204 P</b> value will be capped at 800. Look the current <b>M201</b> values, and if necessary, use <b>M201</b> to set higher X and Y acceleration limit values to suit.</p>
<p>You would then repeat the test with all of the acceleration values locked at your preferred value for each segment, but this time varying max instananeous speed change.</p>
<p><b>config.g</b>> can then be updated to reflect the best results, for instance a value of <b>8</b>:</p>
<pre>M205 X8 Y8 Z[value] E[value]</pre>
<p>Note you would likely leave <b>Z</b> and <b>E</b> unchanged from their original values.</p>
<p>Save <b>config.g</b> to restart the firmware with the changes in effect.</p>>
</div>
<div class="exp">
<h5>Special note for Cura, PrusaSlicer and SuperSlicer:</h5>
<p>Cura, PrusaSlicer and SuperSlicer all have the capability to control these parameters from the slicer by inserting appropriate gcode. If you are finding that your new acceleration values are not taking effect, you may need to also set them in the slicer. This is actually a desirable feature, as it allows more aggressive settings for infill and features that can't be seen in the final print, yet be more conservative for outer walls where aesthetics are paramount.</p>
<a href="#" data-featherlight="img/acceloverride.jpg"><img loading="lazy" class="thumb" src="img/acceloverride.jpg" /></a>
</div>
<h2>Higher acceleration without ringing: Input Shaping</h2>
<p>An amazing development in 3D printing is input shaping, which compensates for the machine's resonant frequency by altering stepper motor inputs to drastically reduce ringing. Available in Klipper and RepRapFirmware, input shaping allows much higher feedrates without a loss in print quality. To see it in action, see the videos below:</p>
<iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/er7q-CJL1lc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>