|
@@ -391,9 +391,8 @@ static uint8_t target_extruder;
|
391
|
391
|
};
|
392
|
392
|
#endif
|
393
|
393
|
|
394
|
|
-#if ENABLED(HAS_SERVO_ENDSTOPS)
|
395
|
|
- const int servo_endstop_id[] = SERVO_ENDSTOP_IDS;
|
396
|
|
- const int servo_endstop_angle[][2] = SERVO_ENDSTOP_ANGLES;
|
|
394
|
+#if HAS_Z_SERVO_ENDSTOP
|
|
395
|
+ const int z_servo_angle[2] = Z_SERVO_ANGLES;
|
397
|
396
|
#endif
|
398
|
397
|
|
399
|
398
|
#if ENABLED(BARICUDA)
|
|
@@ -488,10 +487,8 @@ static bool send_ok[BUFSIZE];
|
488
|
487
|
#if HAS_SERVOS
|
489
|
488
|
Servo servo[NUM_SERVOS];
|
490
|
489
|
#define MOVE_SERVO(I, P) servo[I].move(P)
|
491
|
|
- #define SERVO_ENDSTOP_EXISTS(I) (servo_endstop_id[I] >= 0)
|
492
|
|
- #define MOVE_SERVO_ENDSTOP(I, J) MOVE_SERVO(servo_endstop_id[I], servo_endstop_angle[I][J])
|
493
|
|
- #define DEPLOY_SERVO_ENDSTOP(I) MOVE_SERVO_ENDSTOP(I, 0)
|
494
|
|
- #define STOW_SERVO_ENDSTOP(I) MOVE_SERVO_ENDSTOP(I, 1)
|
|
490
|
+ #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_ENDSTOP_SERVO_NR, z_servo_angle[0])
|
|
491
|
+ #define STOW_Z_SERVO() MOVE_SERVO(Z_ENDSTOP_SERVO_NR, z_servo_angle[1])
|
495
|
492
|
#endif
|
496
|
493
|
|
497
|
494
|
#ifdef CHDK
|
|
@@ -749,14 +746,12 @@ void servo_init() {
|
749
|
746
|
servo[3].detach();
|
750
|
747
|
#endif
|
751
|
748
|
|
752
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
|
749
|
+ #if HAS_Z_SERVO_ENDSTOP
|
753
|
750
|
|
754
|
751
|
endstops.enable_z_probe(false);
|
755
|
752
|
|
756
|
753
|
/**
|
757
|
|
- * Set position of all defined Servo Endstops
|
758
|
|
- *
|
759
|
|
- * ** UNSAFE! - NEEDS UPDATE! **
|
|
754
|
+ * Set position of Z Servo Endstop
|
760
|
755
|
*
|
761
|
756
|
* The servo might be deployed and positioned too low to stow
|
762
|
757
|
* when starting up the machine or rebooting the board.
|
|
@@ -764,11 +759,8 @@ void servo_init() {
|
764
|
759
|
* homing has been done - no homing with z-probe without init!
|
765
|
760
|
*
|
766
|
761
|
*/
|
767
|
|
- for (int i = 0; i < 3; i++)
|
768
|
|
- if (SERVO_ENDSTOP_EXISTS(i))
|
769
|
|
- STOW_SERVO_ENDSTOP(i);
|
770
|
|
-
|
771
|
|
- #endif // HAS_SERVO_ENDSTOPS
|
|
762
|
+ STOW_Z_SERVO();
|
|
763
|
+ #endif // HAS_Z_SERVO_ENDSTOP
|
772
|
764
|
|
773
|
765
|
}
|
774
|
766
|
|
|
@@ -1837,11 +1829,10 @@ static void setup_for_endstop_move() {
|
1837
|
1829
|
|
1838
|
1830
|
if (endstops.z_probe_enabled) return;
|
1839
|
1831
|
|
1840
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
|
1832
|
+ #if HAS_Z_SERVO_ENDSTOP
|
1841
|
1833
|
|
1842
|
1834
|
// Engage Z Servo endstop if enabled
|
1843
|
|
- if (SERVO_ENDSTOP_EXISTS(Z_AXIS))
|
1844
|
|
- DEPLOY_SERVO_ENDSTOP(Z_AXIS);
|
|
1835
|
+ DEPLOY_Z_SERVO();
|
1845
|
1836
|
|
1846
|
1837
|
#elif ENABLED(Z_PROBE_ALLEN_KEY)
|
1847
|
1838
|
feedrate = Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE;
|
|
@@ -1925,7 +1916,7 @@ static void setup_for_endstop_move() {
|
1925
|
1916
|
}
|
1926
|
1917
|
|
1927
|
1918
|
static void stow_z_probe(bool doRaise = true) {
|
1928
|
|
- #if !(ENABLED(HAS_SERVO_ENDSTOPS) && (Z_RAISE_AFTER_PROBING > 0))
|
|
1919
|
+ #if !(HAS_Z_SERVO_ENDSTOP && (Z_RAISE_AFTER_PROBING > 0))
|
1929
|
1920
|
UNUSED(doRaise);
|
1930
|
1921
|
#endif
|
1931
|
1922
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
@@ -1934,21 +1925,18 @@ static void setup_for_endstop_move() {
|
1934
|
1925
|
|
1935
|
1926
|
if (!endstops.z_probe_enabled) return;
|
1936
|
1927
|
|
1937
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
|
1928
|
+ #if HAS_Z_SERVO_ENDSTOP
|
1938
|
1929
|
|
1939
|
1930
|
// Retract Z Servo endstop if enabled
|
1940
|
|
- if (SERVO_ENDSTOP_EXISTS(Z_AXIS)) {
|
1941
|
|
-
|
1942
|
|
- #if Z_RAISE_AFTER_PROBING > 0
|
1943
|
|
- if (doRaise) {
|
1944
|
|
- raise_z_after_probing(); // this also updates current_position
|
1945
|
|
- stepper.synchronize();
|
1946
|
|
- }
|
1947
|
|
- #endif
|
|
1931
|
+ #if Z_RAISE_AFTER_PROBING > 0
|
|
1932
|
+ if (doRaise) {
|
|
1933
|
+ raise_z_after_probing(); // this also updates current_position
|
|
1934
|
+ stepper.synchronize();
|
|
1935
|
+ }
|
|
1936
|
+ #endif
|
1948
|
1937
|
|
1949
|
|
- // Change the Z servo angle
|
1950
|
|
- STOW_SERVO_ENDSTOP(Z_AXIS);
|
1951
|
|
- }
|
|
1938
|
+ // Change the Z servo angle
|
|
1939
|
+ STOW_Z_SERVO();
|
1952
|
1940
|
|
1953
|
1941
|
#elif ENABLED(Z_PROBE_ALLEN_KEY)
|
1954
|
1942
|
|
|
@@ -2168,16 +2156,25 @@ static void setup_for_endstop_move() {
|
2168
|
2156
|
|
2169
|
2157
|
#endif // DELTA
|
2170
|
2158
|
|
2171
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_SLED)
|
|
2159
|
+ #if HAS_Z_SERVO_ENDSTOP
|
2172
|
2160
|
|
2173
|
|
- void raise_z_for_servo() {
|
2174
|
|
- float zpos = current_position[Z_AXIS], z_dest = Z_RAISE_BEFORE_PROBING;
|
2175
|
|
- /**
|
2176
|
|
- * The zprobe_zoffset is negative any switch below the nozzle, so
|
2177
|
|
- * multiply by Z_HOME_DIR (-1) to move enough away from bed for the probe
|
2178
|
|
- */
|
2179
|
|
- z_dest += axis_homed[Z_AXIS] ? zprobe_zoffset * Z_HOME_DIR : zpos;
|
2180
|
|
- if (zpos < z_dest) do_blocking_move_to_z(z_dest); // also updates current_position
|
|
2161
|
+ /**
|
|
2162
|
+ * Raise Z to a minimum height to make room for a servo to move
|
|
2163
|
+ *
|
|
2164
|
+ * zprobe_zoffset: Negative of the Z height where the probe engages
|
|
2165
|
+ * z_dest: The before / after probing raise distance
|
|
2166
|
+ *
|
|
2167
|
+ * The zprobe_zoffset is negative for a switch below the nozzle, so
|
|
2168
|
+ * multiply by Z_HOME_DIR (-1) to move enough away from the bed.
|
|
2169
|
+ */
|
|
2170
|
+ void raise_z_for_servo(float z_dest) {
|
|
2171
|
+ z_dest += home_offset[Z_AXIS];
|
|
2172
|
+
|
|
2173
|
+ if ((Z_HOME_DIR) < 0 && zprobe_zoffset < 0)
|
|
2174
|
+ z_dest -= zprobe_zoffset;
|
|
2175
|
+
|
|
2176
|
+ if (z_dest > current_position[Z_AXIS])
|
|
2177
|
+ do_blocking_move_to_z(z_dest); // also updates current_position
|
2181
|
2178
|
}
|
2182
|
2179
|
|
2183
|
2180
|
#endif
|
|
@@ -2277,23 +2274,24 @@ static void homeaxis(AxisEnum axis) {
|
2277
|
2274
|
sync_plan_position();
|
2278
|
2275
|
|
2279
|
2276
|
#if ENABLED(Z_PROBE_SLED)
|
2280
|
|
- #define _Z_SERVO_TEST (axis != Z_AXIS) // already deployed Z
|
2281
|
|
- #define _Z_SERVO_SUBTEST false // Z will never be invoked
|
2282
|
2277
|
#define _Z_DEPLOY (dock_sled(false))
|
2283
|
2278
|
#define _Z_STOW (dock_sled(true))
|
2284
|
|
- #elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
|
2285
|
2279
|
#define _Z_SERVO_TEST (axis != Z_AXIS) // already deployed Z
|
2286
|
2280
|
#define _Z_SERVO_SUBTEST false // Z will never be invoked
|
|
2281
|
+ #elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
|
2287
|
2282
|
#define _Z_DEPLOY (deploy_z_probe())
|
2288
|
2283
|
#define _Z_STOW (stow_z_probe())
|
2289
|
|
- #elif ENABLED(HAS_SERVO_ENDSTOPS)
|
|
2284
|
+ #define _Z_SERVO_TEST (axis != Z_AXIS) // already deployed Z
|
|
2285
|
+ #define _Z_SERVO_SUBTEST false // Z will never be invoked
|
|
2286
|
+ #elif HAS_Z_SERVO_ENDSTOP
|
|
2287
|
+ #define _Z_DEPLOY do{ raise_z_for_servo(Z_RAISE_BEFORE_PROBING); DEPLOY_Z_SERVO(); endstops.z_probe_enabled = true; }while(0)
|
|
2288
|
+ #define _Z_STOW do{ raise_z_for_servo(Z_RAISE_AFTER_PROBING); STOW_Z_SERVO(); endstops.z_probe_enabled = false; }while(0)
|
2290
|
2289
|
#define _Z_SERVO_TEST true // Z not deployed yet
|
2291
|
2290
|
#define _Z_SERVO_SUBTEST (axis == Z_AXIS) // Z is a probe
|
2292
|
2291
|
#endif
|
2293
|
2292
|
|
2294
|
|
- // If there's a Z probe that needs deployment...
|
2295
|
|
- #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
|
2296
|
|
- // ...and homing Z towards the bed? Deploy it.
|
|
2293
|
+ // Homing Z towards the bed? Deploy the Z probe or endstop.
|
|
2294
|
+ #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) || HAS_Z_SERVO_ENDSTOP
|
2297
|
2295
|
if (axis == Z_AXIS && axis_home_dir < 0) {
|
2298
|
2296
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
2299
|
2297
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_DEPLOY));
|
|
@@ -2302,14 +2300,6 @@ static void homeaxis(AxisEnum axis) {
|
2302
|
2300
|
}
|
2303
|
2301
|
#endif
|
2304
|
2302
|
|
2305
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
2306
|
|
- // Engage an X, Y (or Z) Servo endstop if enabled
|
2307
|
|
- if (_Z_SERVO_TEST && SERVO_ENDSTOP_EXISTS(axis)) {
|
2308
|
|
- DEPLOY_SERVO_ENDSTOP(axis);
|
2309
|
|
- if (_Z_SERVO_SUBTEST) endstops.z_probe_enabled = true;
|
2310
|
|
- }
|
2311
|
|
- #endif
|
2312
|
|
-
|
2313
|
2303
|
// Set a flag for Z motor locking
|
2314
|
2304
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
2315
|
2305
|
if (axis == Z_AXIS) stepper.set_homing_flag(true);
|
|
@@ -2423,8 +2413,8 @@ static void homeaxis(AxisEnum axis) {
|
2423
|
2413
|
axis_known_position[axis] = true;
|
2424
|
2414
|
axis_homed[axis] = true;
|
2425
|
2415
|
|
2426
|
|
- // Put away the Z probe with a function
|
2427
|
|
- #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
|
|
2416
|
+ // Put away the Z probe
|
|
2417
|
+ #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) || HAS_Z_SERVO_ENDSTOP
|
2428
|
2418
|
if (axis == Z_AXIS && axis_home_dir < 0) {
|
2429
|
2419
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
2430
|
2420
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_STOW));
|
|
@@ -2433,33 +2423,6 @@ static void homeaxis(AxisEnum axis) {
|
2433
|
2423
|
}
|
2434
|
2424
|
#endif
|
2435
|
2425
|
|
2436
|
|
- // Retract X, Y (or Z) Servo endstop if enabled
|
2437
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
2438
|
|
- if (_Z_SERVO_TEST && SERVO_ENDSTOP_EXISTS(axis)) {
|
2439
|
|
- // Raise the servo probe before stow outside ABL context.
|
2440
|
|
- // This is a workaround to allow use of a Servo Probe without
|
2441
|
|
- // ABL until more global probe handling is implemented.
|
2442
|
|
- #if Z_RAISE_AFTER_PROBING > 0
|
2443
|
|
- if (axis == Z_AXIS) {
|
2444
|
|
- #if ENABLED(DEBUG_LEVELING_FEATURE)
|
2445
|
|
- if (DEBUGGING(LEVELING)) SERIAL_ECHOPAIR("Raise Z (after) by ", Z_RAISE_AFTER_PROBING);
|
2446
|
|
- #endif
|
2447
|
|
- current_position[Z_AXIS] = Z_RAISE_AFTER_PROBING;
|
2448
|
|
- feedrate = homing_feedrate[Z_AXIS];
|
2449
|
|
- line_to_current_position();
|
2450
|
|
- stepper.synchronize();
|
2451
|
|
- }
|
2452
|
|
- #endif
|
2453
|
|
-
|
2454
|
|
- #if ENABLED(DEBUG_LEVELING_FEATURE)
|
2455
|
|
- if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_ENDSTOPS > Stow with servo.move()");
|
2456
|
|
- #endif
|
2457
|
|
- STOW_SERVO_ENDSTOP(axis);
|
2458
|
|
- if (_Z_SERVO_SUBTEST) endstops.enable_z_probe(false);
|
2459
|
|
- }
|
2460
|
|
-
|
2461
|
|
- #endif // HAS_SERVO_ENDSTOPS
|
2462
|
|
-
|
2463
|
2426
|
}
|
2464
|
2427
|
|
2465
|
2428
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
@@ -3801,7 +3764,7 @@ inline void gcode_G28() {
|
3801
|
3764
|
#endif
|
3802
|
3765
|
|
3803
|
3766
|
current_position[Z_AXIS] = -zprobe_zoffset + (z_tmp - real_z)
|
3804
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)
|
|
3767
|
+ #if HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)
|
3805
|
3768
|
+ Z_RAISE_AFTER_PROBING
|
3806
|
3769
|
#endif
|
3807
|
3770
|
;
|
|
@@ -3816,11 +3779,9 @@ inline void gcode_G28() {
|
3816
|
3779
|
// Sled assembly for Cartesian bots
|
3817
|
3780
|
#if ENABLED(Z_PROBE_SLED)
|
3818
|
3781
|
dock_sled(true); // dock the sled
|
3819
|
|
- #else
|
|
3782
|
+ #elif !HAS_Z_SERVO_ENDSTOP && DISABLED(Z_PROBE_ALLEN_KEY) && DISABLED(Z_PROBE_SLED)
|
3820
|
3783
|
// Raise Z axis for non-delta and non servo based probes
|
3821
|
|
- #if DISABLED(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_ALLEN_KEY) && DISABLED(Z_PROBE_SLED)
|
3822
|
|
- raise_z_after_probing();
|
3823
|
|
- #endif
|
|
3784
|
+ raise_z_after_probing();
|
3824
|
3785
|
#endif
|
3825
|
3786
|
|
3826
|
3787
|
#endif // !DELTA
|
|
@@ -3862,8 +3823,8 @@ inline void gcode_G28() {
|
3862
|
3823
|
* G30: Do a single Z probe at the current XY
|
3863
|
3824
|
*/
|
3864
|
3825
|
inline void gcode_G30() {
|
3865
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
3866
|
|
- raise_z_for_servo();
|
|
3826
|
+ #if HAS_Z_SERVO_ENDSTOP
|
|
3827
|
+ raise_z_for_servo(Z_RAISE_BEFORE_PROBING);
|
3867
|
3828
|
#endif
|
3868
|
3829
|
deploy_z_probe(); // Engage Z Servo endstop if available. Z_PROBE_SLED is missed here.
|
3869
|
3830
|
|
|
@@ -3884,8 +3845,8 @@ inline void gcode_G28() {
|
3884
|
3845
|
|
3885
|
3846
|
clean_up_after_endstop_move(); // Too early. must be done after the stowing.
|
3886
|
3847
|
|
3887
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
3888
|
|
- raise_z_for_servo();
|
|
3848
|
+ #if HAS_Z_SERVO_ENDSTOP
|
|
3849
|
+ raise_z_for_servo(Z_RAISE_AFTER_PROBING);
|
3889
|
3850
|
#endif
|
3890
|
3851
|
stow_z_probe(false); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed here.
|
3891
|
3852
|
|
|
@@ -6019,14 +5980,14 @@ inline void gcode_M303() {
|
6019
|
5980
|
*/
|
6020
|
5981
|
inline void gcode_M400() { stepper.synchronize(); }
|
6021
|
5982
|
|
6022
|
|
-#if ENABLED(AUTO_BED_LEVELING_FEATURE) && DISABLED(Z_PROBE_SLED) && (ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY))
|
|
5983
|
+#if ENABLED(AUTO_BED_LEVELING_FEATURE) && DISABLED(Z_PROBE_SLED) && (HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_ALLEN_KEY))
|
6023
|
5984
|
|
6024
|
5985
|
/**
|
6025
|
5986
|
* M401: Engage Z Servo endstop if available
|
6026
|
5987
|
*/
|
6027
|
5988
|
inline void gcode_M401() {
|
6028
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
6029
|
|
- raise_z_for_servo();
|
|
5989
|
+ #if HAS_Z_SERVO_ENDSTOP
|
|
5990
|
+ raise_z_for_servo(Z_RAISE_BEFORE_PROBING);
|
6030
|
5991
|
#endif
|
6031
|
5992
|
deploy_z_probe();
|
6032
|
5993
|
}
|
|
@@ -6035,13 +5996,13 @@ inline void gcode_M400() { stepper.synchronize(); }
|
6035
|
5996
|
* M402: Retract Z Servo endstop if enabled
|
6036
|
5997
|
*/
|
6037
|
5998
|
inline void gcode_M402() {
|
6038
|
|
- #if ENABLED(HAS_SERVO_ENDSTOPS)
|
6039
|
|
- raise_z_for_servo();
|
|
5999
|
+ #if HAS_Z_SERVO_ENDSTOP
|
|
6000
|
+ raise_z_for_servo(Z_RAISE_AFTER_PROBING);
|
6040
|
6001
|
#endif
|
6041
|
6002
|
stow_z_probe(false);
|
6042
|
6003
|
}
|
6043
|
6004
|
|
6044
|
|
-#endif // AUTO_BED_LEVELING_FEATURE && (ENABLED(HAS_SERVO_ENDSTOPS) || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
|
|
6005
|
+#endif // AUTO_BED_LEVELING_FEATURE && (HAS_Z_SERVO_ENDSTOP || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
|
6045
|
6006
|
|
6046
|
6007
|
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
6047
|
6008
|
|
|
@@ -7338,14 +7299,14 @@ void process_next_command() {
|
7338
|
7299
|
gcode_M400();
|
7339
|
7300
|
break;
|
7340
|
7301
|
|
7341
|
|
- #if ENABLED(AUTO_BED_LEVELING_FEATURE) && (ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY)) && DISABLED(Z_PROBE_SLED)
|
|
7302
|
+ #if ENABLED(AUTO_BED_LEVELING_FEATURE) && (HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_ALLEN_KEY)) && DISABLED(Z_PROBE_SLED)
|
7342
|
7303
|
case 401:
|
7343
|
7304
|
gcode_M401();
|
7344
|
7305
|
break;
|
7345
|
7306
|
case 402:
|
7346
|
7307
|
gcode_M402();
|
7347
|
7308
|
break;
|
7348
|
|
- #endif // AUTO_BED_LEVELING_FEATURE && (ENABLED(HAS_SERVO_ENDSTOPS) || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
|
|
7309
|
+ #endif // AUTO_BED_LEVELING_FEATURE && (HAS_Z_SERVO_ENDSTOP || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
|
7349
|
7310
|
|
7350
|
7311
|
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
7351
|
7312
|
case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or display nominal filament width
|