Browse Source

Z Axis Safe Homing when using Z Probe

Recommended for those who are using the Z Probe for Z Homing (as
Z-Endstop)

This feature has two changes:

1) Allow user to choose where the Z Probe will touch the bed when homing
all axis together (G28) by setting below defines:

Z_SAFE_HOMING_X_POINT
Z_SAFE_HOMING_Y_POINT

2) Prevents the user to perform Z Axis Homing when the Z Probe is
outsite bed.
Alex Borro 10 years ago
parent
commit
b33375d438
4 changed files with 128 additions and 35 deletions
  1. 29
    11
      Marlin/Configuration.h
  2. 7
    6
      Marlin/Marlin.h
  3. 74
    18
      Marlin/Marlin_main.cpp
  4. 18
    0
      Marlin/language.h

+ 29
- 11
Marlin/Configuration.h View File

@@ -305,6 +305,17 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
305 305
 #define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS.
306 306
 #define max_software_endstops true  // If true, axis won't move to coordinates greater than the defined lengths below.
307 307
 
308
+// Travel limits after homing
309
+#define X_MAX_POS 205
310
+#define X_MIN_POS 0
311
+#define Y_MAX_POS 205
312
+#define Y_MIN_POS 0
313
+#define Z_MAX_POS 200
314
+#define Z_MIN_POS 0
315
+
316
+#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS)
317
+#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS)
318
+#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS)
308 319
 //============================= Bed Auto Leveling ===========================
309 320
 
310 321
 //#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)
@@ -336,20 +347,27 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
336 347
   // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile.
337 348
 
338 349
 //  #define PROBE_SERVO_DEACTIVATION_DELAY 300  
350
+
351
+
352
+//If you have enabled the Bed Auto Levelling and are using the same Z Probe for Z Homing, 
353
+//it is highly recommended you let this Z_SAFE_HOMING enabled!!!
354
+
355
+  #define Z_SAFE_HOMING   // This feature is meant to avoid Z homing with probe outside the bed area. 
356
+                          // When defined, it will:
357
+                          // - Allow Z homing only after X and Y homing AND stepper drivers still enabled
358
+                          // - If stepper drivers timeout, it will need X and Y homing again before Z homing
359
+                          // - Position the probe in a defined XY point before Z Homing when homing all axis (G28)
360
+                          // - Block Z homing only when the probe is outside bed area.
361
+  
362
+  #ifdef Z_SAFE_HOMING
363
+    
364
+    #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2)    // X point for Z homing when homing all axis (G28)
365
+    #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2)    // Y point for Z homing when homing all axis (G28)
366
+    
367
+  #endif
339 368
   
340 369
 #endif
341 370
 
342
-// Travel limits after homing
343
-#define X_MAX_POS 205
344
-#define X_MIN_POS 0
345
-#define Y_MAX_POS 205
346
-#define Y_MIN_POS 0
347
-#define Z_MAX_POS 200
348
-#define Z_MIN_POS 0
349
-
350
-#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS)
351
-#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS)
352
-#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS)
353 371
 
354 372
 // The position of the homing switches
355 373
 //#define MANUAL_HOME_POSITIONS  // If defined, MANUAL_*_HOME_POS below will be used

+ 7
- 6
Marlin/Marlin.h View File

@@ -107,10 +107,10 @@ void manage_inactivity();
107 107
 #if defined(DUAL_X_CARRIAGE) && defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1 \
108 108
     && defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1
109 109
   #define  enable_x() do { WRITE(X_ENABLE_PIN, X_ENABLE_ON); WRITE(X2_ENABLE_PIN, X_ENABLE_ON); } while (0)
110
-  #define disable_x() do { WRITE(X_ENABLE_PIN,!X_ENABLE_ON); WRITE(X2_ENABLE_PIN,!X_ENABLE_ON); } while (0)
110
+  #define disable_x() do { WRITE(X_ENABLE_PIN,!X_ENABLE_ON); WRITE(X2_ENABLE_PIN,!X_ENABLE_ON); axis_known_position[X_AXIS] = false; } while (0)
111 111
 #elif defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1
112 112
   #define  enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON)
113
-  #define disable_x() WRITE(X_ENABLE_PIN,!X_ENABLE_ON)
113
+  #define disable_x() { WRITE(X_ENABLE_PIN,!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }
114 114
 #else
115 115
   #define enable_x() ;
116 116
   #define disable_x() ;
@@ -119,10 +119,10 @@ void manage_inactivity();
119 119
 #if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1
120 120
   #ifdef Y_DUAL_STEPPER_DRIVERS
121 121
     #define  enable_y() { WRITE(Y_ENABLE_PIN, Y_ENABLE_ON); WRITE(Y2_ENABLE_PIN,  Y_ENABLE_ON); }
122
-    #define disable_y() { WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON); WRITE(Y2_ENABLE_PIN, !Y_ENABLE_ON); }
122
+    #define disable_y() { WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON); WRITE(Y2_ENABLE_PIN, !Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
123 123
   #else
124 124
     #define  enable_y() WRITE(Y_ENABLE_PIN, Y_ENABLE_ON)
125
-    #define disable_y() WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON)
125
+    #define disable_y() { WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
126 126
   #endif
127 127
 #else
128 128
   #define enable_y() ;
@@ -132,10 +132,10 @@ void manage_inactivity();
132 132
 #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1
133 133
   #ifdef Z_DUAL_STEPPER_DRIVERS
134 134
     #define  enable_z() { WRITE(Z_ENABLE_PIN, Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN, Z_ENABLE_ON); }
135
-    #define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); }
135
+    #define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
136 136
   #else
137 137
     #define  enable_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
138
-    #define disable_z() WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON)
138
+    #define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
139 139
   #endif
140 140
 #else
141 141
   #define enable_z() ;
@@ -209,6 +209,7 @@ extern float endstop_adj[3];
209 209
 #endif
210 210
 extern float min_pos[3];
211 211
 extern float max_pos[3];
212
+extern bool axis_known_position[3];
212 213
 extern int fanSpeed;
213 214
 #ifdef BARICUDA
214 215
 extern int ValvePressure;

+ 74
- 18
Marlin/Marlin_main.cpp View File

@@ -43,6 +43,7 @@
43 43
 #include "ConfigurationStore.h"
44 44
 #include "language.h"
45 45
 #include "pins_arduino.h"
46
+#include "math.h"
46 47
 
47 48
 #ifdef BLINKM
48 49
 #include "BlinkM.h"
@@ -191,6 +192,7 @@ float endstop_adj[3]={0,0,0};
191 192
 #endif
192 193
 float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
193 194
 float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
195
+bool axis_known_position[3] = {false, false, false};
194 196
 
195 197
 // Extruder offset
196 198
 #if EXTRUDERS > 1
@@ -949,16 +951,11 @@ static void homeaxis(int axis) {
949 951
     current_position[axis] = 0;
950 952
     plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
951 953
 	
954
+
952 955
     // Engage Servo endstop if enabled
953 956
     #ifdef SERVO_ENDSTOPS
954 957
       #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
955 958
         if (axis==Z_AXIS) {
956
-          #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
957
-            destination[axis] = Z_RAISE_BEFORE_HOMING * axis_home_dir * (-1);    // Set destination away from bed
958
-            feedrate = max_feedrate[axis];
959
-            plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder);
960
-            st_synchronize();
961
-          #endif
962 959
           engage_z_probe();
963 960
         }
964 961
 	    else
@@ -1000,6 +997,7 @@ static void homeaxis(int axis) {
1000 997
     destination[axis] = current_position[axis];
1001 998
     feedrate = 0.0;
1002 999
     endstops_hit_on_purpose();
1000
+    axis_known_position[axis] = true;
1003 1001
 
1004 1002
     // Retract Servo endstop if enabled
1005 1003
     #ifdef SERVO_ENDSTOPS
@@ -1208,12 +1206,6 @@ void process_commands()
1208 1206
         HOMEAXIS(Y);
1209 1207
       }
1210 1208
 
1211
-      #if Z_HOME_DIR < 0                      // If homing towards BED do Z last
1212
-      if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
1213
-        HOMEAXIS(Z);
1214
-      }
1215
-      #endif
1216
-
1217 1209
       if(code_seen(axis_codes[X_AXIS]))
1218 1210
       {
1219 1211
         if(code_value_long() != 0) {
@@ -1226,14 +1218,74 @@ void process_commands()
1226 1218
           current_position[Y_AXIS]=code_value()+add_homeing[1];
1227 1219
         }
1228 1220
       }
1221
+      
1222
+      #if Z_HOME_DIR < 0                      // If homing towards BED do Z last
1223
+        #ifndef Z_SAFE_HOMING
1224
+          if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
1225
+            #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
1226
+              destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1);    // Set destination away from bed
1227
+              feedrate = max_feedrate[Z_AXIS];
1228
+              plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder);
1229
+              st_synchronize();
1230
+            #endif
1231
+            HOMEAXIS(Z);
1232
+          }
1233
+        #else                      // Z Safe mode activated. 
1234
+          if(home_all_axis) {
1235
+            destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER);
1236
+            destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER);
1237
+            destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1);    // Set destination away from bed
1238
+            feedrate = XY_TRAVEL_SPEED;
1239
+            current_position[Z_AXIS] = 0;
1240
+			
1241
+            plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
1242
+            plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder);
1243
+            st_synchronize();
1244
+            current_position[X_AXIS] = destination[X_AXIS];
1245
+            current_position[Y_AXIS] = destination[Y_AXIS];
1229 1246
 
1247
+            HOMEAXIS(Z);
1248
+          }
1249
+                                                // Let's see if X and Y are homed and probe is inside bed area.
1250
+          if(code_seen(axis_codes[Z_AXIS])) {
1251
+            if ( (axis_known_position[X_AXIS]) && (axis_known_position[Y_AXIS]) \
1252
+              && (current_position[X_AXIS]+X_PROBE_OFFSET_FROM_EXTRUDER >= X_MIN_POS) \
1253
+              && (current_position[X_AXIS]+X_PROBE_OFFSET_FROM_EXTRUDER <= X_MAX_POS) \
1254
+              && (current_position[Y_AXIS]+Y_PROBE_OFFSET_FROM_EXTRUDER >= Y_MIN_POS) \
1255
+              && (current_position[Y_AXIS]+Y_PROBE_OFFSET_FROM_EXTRUDER <= Y_MAX_POS)) {
1256
+
1257
+              current_position[Z_AXIS] = 0;
1258
+              plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);			  
1259
+              destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1);    // Set destination away from bed
1260
+              feedrate = max_feedrate[Z_AXIS];
1261
+              plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder);
1262
+              st_synchronize();
1263
+
1264
+              HOMEAXIS(Z);
1265
+            } else if (!((axis_known_position[X_AXIS]) && (axis_known_position[Y_AXIS]))) {
1266
+                LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
1267
+                SERIAL_ECHO_START;
1268
+                SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
1269
+            } else {
1270
+                LCD_MESSAGEPGM(MSG_ZPROBE_OUT);
1271
+                SERIAL_ECHO_START;
1272
+                SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT);
1273
+            }
1274
+          }
1275
+        #endif
1276
+      #endif
1277
+
1278
+      
1279
+     
1230 1280
       if(code_seen(axis_codes[Z_AXIS])) {
1231 1281
         if(code_value_long() != 0) {
1232 1282
           current_position[Z_AXIS]=code_value()+add_homeing[2];
1233 1283
         }
1234 1284
       }
1235 1285
       #ifdef ENABLE_AUTO_BED_LEVELING
1236
-         current_position[Z_AXIS] -= Z_PROBE_OFFSET_FROM_EXTRUDER;  //Add Z_Probe offset (the distance is negative)
1286
+        if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
1287
+          current_position[Z_AXIS] -= Z_PROBE_OFFSET_FROM_EXTRUDER;  //Add Z_Probe offset (the distance is negative)
1288
+        }
1237 1289
       #endif
1238 1290
       plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
1239 1291
 #endif // else DELTA
@@ -1275,9 +1327,9 @@ void process_commands()
1275 1327
             do_blocking_move_to(LEFT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, BACK_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[Z_AXIS]);
1276 1328
 
1277 1329
             engage_z_probe();   // Engage Z Servo endstop if available
1278
-            
1279 1330
             run_z_probe();
1280 1331
             float z_at_xLeft_yBack = current_position[Z_AXIS];
1332
+            retract_z_probe();
1281 1333
 
1282 1334
             SERIAL_PROTOCOLPGM("Bed x: ");
1283 1335
             SERIAL_PROTOCOL(LEFT_PROBE_BED_POSITION);
@@ -1290,9 +1342,12 @@ void process_commands()
1290 1342
             // prob 2
1291 1343
             do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS);
1292 1344
             do_blocking_move_to(LEFT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, FRONT_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[Z_AXIS]);
1345
+
1346
+            engage_z_probe();   // Engage Z Servo endstop if available
1293 1347
             run_z_probe();
1294 1348
             float z_at_xLeft_yFront = current_position[Z_AXIS];
1295
-
1349
+            retract_z_probe();
1350
+            
1296 1351
             SERIAL_PROTOCOLPGM("Bed x: ");
1297 1352
             SERIAL_PROTOCOL(LEFT_PROBE_BED_POSITION);
1298 1353
             SERIAL_PROTOCOLPGM(" y: ");
@@ -1305,9 +1360,12 @@ void process_commands()
1305 1360
             do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS);
1306 1361
             // the current position will be updated by the blocking move so the head will not lower on this next call.
1307 1362
             do_blocking_move_to(RIGHT_PROBE_BED_POSITION - X_PROBE_OFFSET_FROM_EXTRUDER, FRONT_PROBE_BED_POSITION - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[Z_AXIS]);
1363
+
1364
+            engage_z_probe();   // Engage Z Servo endstop if available
1308 1365
             run_z_probe();
1309 1366
             float z_at_xRight_yFront = current_position[Z_AXIS];
1310
-
1367
+            retract_z_probe(); // Retract Z Servo endstop if available
1368
+            
1311 1369
             SERIAL_PROTOCOLPGM("Bed x: ");
1312 1370
             SERIAL_PROTOCOL(RIGHT_PROBE_BED_POSITION);
1313 1371
             SERIAL_PROTOCOLPGM(" y: ");
@@ -1320,8 +1378,6 @@ void process_commands()
1320 1378
 
1321 1379
             set_bed_level_equation(z_at_xLeft_yFront, z_at_xRight_yFront, z_at_xLeft_yBack);
1322 1380
 
1323
-            retract_z_probe(); // Retract Z Servo endstop if available
1324
-            
1325 1381
             st_synchronize();            
1326 1382
 
1327 1383
             // The following code correct the Z height difference from z-probe position and hotend tip position.

+ 18
- 0
Marlin/language.h View File

@@ -136,6 +136,8 @@
136 136
 	#define MSG_FILAMENTCHANGE "Change filament"
137 137
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
138 138
 	#define MSG_CNG_SDCARD "Change SD-Card"
139
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
140
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
139 141
 
140 142
 // Serial Console Messages
141 143
 
@@ -301,6 +303,8 @@
301 303
 	#define MSG_FILAMENTCHANGE "Change filament"
302 304
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
303 305
 	#define MSG_CNG_SDCARD "Change SD-Card"
306
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
307
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
304 308
 
305 309
 // Serial Console Messages
306 310
 
@@ -465,6 +469,8 @@
465 469
 	#define MSG_FILAMENTCHANGE "Changer filament"
466 470
 	#define MSG_INIT_SDCARD "Init. la carte SD"	
467 471
 	#define MSG_CNG_SDCARD "Changer de carte SD"
472
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
473
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
468 474
 
469 475
 // Serial Console Messages
470 476
 
@@ -632,6 +638,8 @@
632 638
 	#define MSG_FILAMENTCHANGE "Filament wechseln"
633 639
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
634 640
 	#define MSG_CNG_SDCARD "Change SD-Card"
641
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
642
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
635 643
 	
636 644
 // Serial Console Messages
637 645
 
@@ -803,6 +811,8 @@
803 811
 	#define MSG_RETRACT_ARROW "Retraer"
804 812
 	#define MSG_PART_RELEASE "Desacople Parcial"
805 813
 	#define MSG_STEPPER_RELEASED "Desacoplada."
814
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
815
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
806 816
 
807 817
 // Serial Console Messages
808 818
 
@@ -964,6 +974,8 @@
964 974
 	#define MSG_FILAMENTCHANGE "Change filament"
965 975
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
966 976
 	#define MSG_CNG_SDCARD "Change SD-Card"
977
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
978
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
967 979
 
968 980
 // Serial Console Messages
969 981
 
@@ -1125,6 +1137,8 @@
1125 1137
 	#define MSG_FILAMENTCHANGE       "Cambia filamento"
1126 1138
 	#define MSG_INIT_SDCARD          "Iniz. SD-Card"
1127 1139
 	#define MSG_CNG_SDCARD           "Cambia SD-Card"
1140
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
1141
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
1128 1142
 
1129 1143
 	// Serial Console Messages
1130 1144
 
@@ -1295,6 +1309,8 @@
1295 1309
 	#define MSG_FILAMENTCHANGE "Change filament"
1296 1310
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
1297 1311
 	#define MSG_CNG_SDCARD "Change SD-Card"
1312
+    #define MSG_ZPROBE_OUT "Sonda fora da mesa"
1313
+    #define MSG_POSITION_UNKNOWN "Home X/Y antes de Z"
1298 1314
 
1299 1315
 // Serial Console Messages
1300 1316
 
@@ -1461,6 +1477,8 @@
1461 1477
 	#define MSG_FILAMENTCHANGE "Change filament"
1462 1478
 	#define MSG_INIT_SDCARD "Init. SD-Card"	
1463 1479
 	#define MSG_CNG_SDCARD "Change SD-Card"
1480
+    #define MSG_ZPROBE_OUT "ZProbe Outside Bed"
1481
+    #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
1464 1482
 
1465 1483
 // Serial Console Messages
1466 1484
 

Loading…
Cancel
Save