Browse Source

Fix issues, make optional

Scott Lahteine 7 years ago
parent
commit
3e81745e81

+ 4
- 3
Marlin/Configuration.h View File

@@ -1947,9 +1947,10 @@
1947 1947
 // If the servo can't reach the requested position, increase it.
1948 1948
 #define SERVO_DELAY { 300 }
1949 1949
 
1950
-// Servo deactivation
1951
-//
1952
-// With this option servos are powered only during movement, then turned off to prevent jitter.
1950
+// Only power servos during movement, otherwise leave off to prevent jitter
1953 1951
 //#define DEACTIVATE_SERVOS_AFTER_MOVE
1954 1952
 
1953
+// Allow servo angle to be edited and saved to EEPROM
1954
+//#define EDITABLE_SERVO_ANGLES
1955
+
1955 1956
 #endif // CONFIGURATION_H

+ 4
- 3
Marlin/src/config/default/Configuration.h View File

@@ -1946,9 +1946,10 @@
1946 1946
 // If the servo can't reach the requested position, increase it.
1947 1947
 #define SERVO_DELAY { 300 }
1948 1948
 
1949
-// Servo deactivation
1950
-//
1951
-// With this option servos are powered only during movement, then turned off to prevent jitter.
1949
+// Only power servos during movement, otherwise leave off to prevent jitter
1952 1950
 //#define DEACTIVATE_SERVOS_AFTER_MOVE
1953 1951
 
1952
+// Allow servo angle to be edited and saved to EEPROM
1953
+//#define EDITABLE_SERVO_ANGLES
1954
+
1954 1955
 #endif // CONFIGURATION_H

+ 3
- 3
Marlin/src/gcode/config/M281.cpp View File

@@ -21,13 +21,13 @@
21 21
  */
22 22
 #include "../../inc/MarlinConfig.h"
23 23
 
24
-#if HAS_SERVOS
24
+#if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
25 25
 
26 26
 #include "../gcode.h"
27 27
 #include "../../module/servo.h"
28 28
 
29 29
 void GcodeSuite::M281() {
30
-    if (!parser.seen('P')) return;
30
+  if (!parser.seenval('P')) return;
31 31
   const int servo_index = parser.value_int();
32 32
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
33 33
     bool angle_change = false;
@@ -53,4 +53,4 @@ void GcodeSuite::M281() {
53 53
   }
54 54
 }
55 55
 
56
-#endif
56
+#endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES

+ 4
- 4
Marlin/src/gcode/config/M43.cpp View File

@@ -146,10 +146,10 @@ inline void servo_probe_test() {
146 146
     uint8_t i = 0;
147 147
     bool deploy_state, stow_state;
148 148
     do {
149
-      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); //deploy
149
+      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy
150 150
       safe_delay(500);
151 151
       deploy_state = READ(PROBE_TEST_PIN);
152
-      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); //stow
152
+      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow
153 153
       safe_delay(500);
154 154
       stow_state = READ(PROBE_TEST_PIN);
155 155
     } while (++i < 4);
@@ -170,7 +170,7 @@ inline void servo_probe_test() {
170 170
       #endif
171 171
     }
172 172
     else {                                           // measure active signal length
173
-      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]);     // deploy
173
+      MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy
174 174
       safe_delay(500);
175 175
       SERIAL_PROTOCOLLNPGM("please trigger probe");
176 176
       uint16_t probe_counter = 0;
@@ -194,7 +194,7 @@ inline void servo_probe_test() {
194 194
           else
195 195
             SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse
196 196
 
197
-          MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); //stow
197
+          MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow
198 198
 
199 199
         }  // pulse detected
200 200
 

+ 3
- 1
Marlin/src/gcode/gcode.cpp View File

@@ -487,7 +487,9 @@ void GcodeSuite::process_parsed_command(
487 487
 
488 488
       #if HAS_SERVOS
489 489
         case 280: M280(); break;                                  // M280: Set servo position absolute
490
-        case 281: M281(); break;
490
+        #if ENABLED(EDITABLE_SERVO_ANGLES)
491
+          case 281: M281(); break;                                // M281: Set servo angles
492
+        #endif
491 493
       #endif
492 494
 
493 495
       #if ENABLED(BABYSTEPPING)

+ 4
- 2
Marlin/src/gcode/gcode.h View File

@@ -172,7 +172,7 @@
172 172
  * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS)
173 173
  * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS)
174 174
  * M280 - Set servo position absolute: "M280 P<index> S<angle|µs>". (Requires servos)
175
- * M281 - Set servo min|max position: "M281 P<index> L<min> U<max>". (Requires servos)
175
+ * M281 - Set servo min|max position: "M281 P<index> L<min> U<max>". (Requires EDITABLE_SERVO_ANGLES)
176 176
  * M290 - Babystepping (Requires BABYSTEPPING)
177 177
  * M300 - Play beep sound S<frequency Hz> P<duration ms>
178 178
  * M301 - Set PID parameters P I and D. (Requires PIDTEMP)
@@ -628,7 +628,9 @@ private:
628 628
 
629 629
   #if HAS_SERVOS
630 630
     static void M280();
631
-    static void M281();
631
+    #if ENABLED(EDITABLE_SERVO_ANGLES)
632
+      static void M281();
633
+    #endif
632 634
   #endif
633 635
 
634 636
   #if ENABLED(BABYSTEPPING)

+ 2
- 2
Marlin/src/inc/SanityCheck.h View File

@@ -687,8 +687,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
687 687
 /**
688 688
  * Limited number of servos
689 689
  */
690
-#if NUM_SERVOS > 4
691
-  #error "The maximum number of SERVOS in Marlin is 4."
690
+#if NUM_SERVOS > MAX_SERVOS
691
+  #error "The selected board doesn't support enough servos for your configuration. Reduce NUM_SERVOS."
692 692
 #endif
693 693
 
694 694
 /**

+ 63
- 27
Marlin/src/module/configuration_store.cpp View File

@@ -72,7 +72,7 @@
72 72
 
73 73
 #if HAS_SERVOS
74 74
   #include "servo.h"
75
-#endif 
75
+#endif
76 76
 
77 77
 #if HAS_BED_PROBE
78 78
   #include "../module/probe.h"
@@ -181,9 +181,7 @@ typedef struct SettingsDataStruct {
181 181
   //
182 182
   // SERVO_ANGLES
183 183
   //
184
-  #if HAS_SERVOS
185
-    uint8_t servo_angles[NUM_SERVOS][2];
186
-  #endif
184
+  uint16_t servo_angles[MAX_SERVOS][2];                 // M281 P L U
187 185
 
188 186
   //
189 187
   // DELTA / [XYZ]_DUAL_ENDSTOPS
@@ -543,10 +541,26 @@ void MarlinSettings::postprocess() {
543 541
       EEPROM_WRITE(storage_slot);
544 542
     #endif // AUTO_BED_LEVELING_UBL
545 543
 
546
-    #if HAS_SERVOS
547
-      EEPROM_WRITE(servo_angles);
544
+    #if !HAS_SERVOS || DISABLED(EDITABLE_SERVO_ANGLES)
545
+      #if ENABLED(SWITCHING_EXTRUDER)
546
+        constexpr uint16_t sesa[][2] = SWITCHING_EXTRUDER_SERVO_ANGLES;
547
+      #endif
548
+      constexpr uint16_t servo_angles[MAX_SERVOS][2] = {
549
+        #if ENABLED(SWITCHING_EXTRUDER)
550
+          [SWITCHING_EXTRUDER_SERVO_NR] = { sesa[0], sesa[1] }
551
+          #if EXTRUDERS > 3
552
+            , [SWITCHING_EXTRUDER_E23_SERVO_NR] = { sesa[2], sesa[3] }
553
+          #endif
554
+        #elif ENABLED(SWITCHING_NOZZLE)
555
+          [SWITCHING_NOZZLE_SERVO_NR] = SWITCHING_NOZZLE_SERVO_ANGLES
556
+        #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR)
557
+          [Z_PROBE_SERVO_NR] = Z_SERVO_ANGLES
558
+        #endif
559
+      };
548 560
     #endif
549 561
 
562
+    EEPROM_WRITE(servo_angles);
563
+
550 564
     // 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS
551 565
     #if ENABLED(DELTA)
552 566
 
@@ -1153,10 +1167,10 @@ void MarlinSettings::postprocess() {
1153 1167
       //
1154 1168
       // SERVO_ANGLES
1155 1169
       //
1156
-      #if HAS_SERVOS
1157
-        EEPROM_READ(servo_angles);
1170
+      #if !HAS_SERVOS || DISABLED(EDITABLE_SERVO_ANGLES)
1171
+        uint16_t servo_angles[MAX_SERVOS][2];
1158 1172
       #endif
1159
-
1173
+      EEPROM_READ(servo_angles);
1160 1174
 
1161 1175
       //
1162 1176
       // DELTA Geometry or Dual Endstops offsets
@@ -1801,32 +1815,39 @@ void MarlinSettings::reset(PORTARG_SOLO) {
1801 1815
   // Servo Angles
1802 1816
   //
1803 1817
 
1804
-  #if HAS_SERVOS
1818
+  #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
1819
+
1805 1820
     #if ENABLED(SWITCHING_EXTRUDER)
1821
+
1806 1822
       #if EXTRUDERS > 3
1807 1823
         #define REQ_ANGLES 4
1808 1824
       #else
1809 1825
         #define REQ_ANGLES 2
1810 1826
       #endif
1811
-      const uint8_t extruder_angles[2] = SWITCHING_EXTRUDER_SERVO_ANGLES;
1827
+      constexpr uint16_t extruder_angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES;
1812 1828
       static_assert(COUNT(extruder_angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
1813 1829
       servo_angles[SWITCHING_EXTRUDER_SERVO_NR][0] = extruder_angles[0];
1814 1830
       servo_angles[SWITCHING_EXTRUDER_SERVO_NR][1] = extruder_angles[1];
1815
-    #endif
1831
+      #if EXTRUDERS > 3
1832
+        servo_angles[SWITCHING_EXTRUDER_E23_SERVO_NR][0] = extruder_angles[2];
1833
+        servo_angles[SWITCHING_EXTRUDER_E23_SERVO_NR][1] = extruder_angles[3];
1834
+      #endif
1816 1835
 
1817
-    #if ENABLED(SWITCHING_NOZZLE)
1818
-      const uint8_t nozzel_angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
1819
-      servo_angles[SWITCHING_NOZZLE_SERVO_NR][0] = nozzel_angles[0];
1820
-      servo_angles[SWITCHING_NOZZLE_SERVO_NR][1] = nozzel_angles[1];
1821
-    #endif
1836
+    #elif ENABLED(SWITCHING_NOZZLE)
1822 1837
 
1823
-    #if defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR)
1824
-      const uint8_t z_probe_angles[2] = Z_SERVO_ANGLES;
1838
+      constexpr uint16_t nozzle_angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
1839
+      servo_angles[SWITCHING_NOZZLE_SERVO_NR][0] = nozzle_angles[0];
1840
+      servo_angles[SWITCHING_NOZZLE_SERVO_NR][1] = nozzle_angles[1];
1841
+
1842
+    #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR)
1843
+
1844
+      constexpr uint16_t z_probe_angles[2] = Z_SERVO_ANGLES;
1825 1845
       servo_angles[Z_PROBE_SERVO_NR][0] = z_probe_angles[0];
1826 1846
       servo_angles[Z_PROBE_SERVO_NR][1] = z_probe_angles[1];
1847
+
1827 1848
     #endif
1828 1849
 
1829
-  #endif
1850
+  #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
1830 1851
 
1831 1852
   #if ENABLED(DELTA)
1832 1853
     const float adj[ABC] = DELTA_ENDSTOP_ADJ,
@@ -2306,19 +2327,34 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2306 2327
 
2307 2328
     #endif // HAS_LEVELING
2308 2329
 
2309
-    #if HAS_SERVOS
2330
+    #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
2331
+
2310 2332
       if (!forReplay) {
2311 2333
         CONFIG_ECHO_START;
2312 2334
         SERIAL_ECHOLNPGM_P(port, "Servo Angles:");
2313 2335
       }
2314 2336
       for (uint8_t i = 0; i < NUM_SERVOS; i++) {
2315
-        CONFIG_ECHO_START;
2316
-        SERIAL_ECHOPAIR_P(port, "  M281 P", i);
2317
-        SERIAL_ECHOPAIR_P(port, " L",servo_angles[i][0]);
2318
-        SERIAL_ECHOPAIR_P(port, " U",servo_angles[i][1]);
2319
-        SERIAL_EOL_P(port);
2337
+        switch (i) {
2338
+          #if ENABLED(SWITCHING_EXTRUDER)
2339
+            case SWITCHING_EXTRUDER_SERVO_NR:
2340
+            #if EXTRUDERS > 3
2341
+              case SWITCHING_EXTRUDER_E23_SERVO_NR:
2342
+            #endif
2343
+          #elif ENABLED(SWITCHING_NOZZLE)
2344
+            case SWITCHING_NOZZLE_SERVO_NR:
2345
+          #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR)
2346
+            case Z_PROBE_SERVO_NR:
2347
+          #endif
2348
+            CONFIG_ECHO_START;
2349
+            SERIAL_ECHOPAIR_P(port, "  M281 P", int(i));
2350
+            SERIAL_ECHOPAIR_P(port, " L", servo_angles[i][0]);
2351
+            SERIAL_ECHOPAIR_P(port, " U", servo_angles[i][1]);
2352
+            SERIAL_EOL_P(port);
2353
+          default: break;
2354
+        }
2320 2355
       }
2321
-    #endif
2356
+
2357
+    #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
2322 2358
 
2323 2359
     #if ENABLED(DELTA)
2324 2360
 

+ 1
- 1
Marlin/src/module/probe.cpp View File

@@ -434,7 +434,7 @@ bool set_probe_deployed(const bool deploy) {
434 434
 
435 435
       #elif HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)
436 436
 
437
-        MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][(deploy ? 0 : 1)]);
437
+        MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][deploy ? 0 : 1]);
438 438
 
439 439
       #elif ENABLED(Z_PROBE_ALLEN_KEY)
440 440
 

+ 1
- 1
Marlin/src/module/servo.cpp View File

@@ -31,7 +31,7 @@
31 31
 #include "servo.h"
32 32
 
33 33
 HAL_SERVO_LIB servo[NUM_SERVOS];
34
-uint8_t servo_angles[NUM_SERVOS][2];
34
+uint16_t servo_angles[NUM_SERVOS][2];
35 35
 
36 36
 void servo_init() {
37 37
   #if NUM_SERVOS >= 1 && HAS_SERVO_0

+ 1
- 1
Marlin/src/module/servo.h View File

@@ -30,7 +30,7 @@
30 30
 #include "../HAL/shared/servo.h"
31 31
 
32 32
 extern HAL_SERVO_LIB servo[NUM_SERVOS];
33
-extern uint8_t servo_angles[NUM_SERVOS][2];
33
+extern uint16_t servo_angles[NUM_SERVOS][2];
34 34
 extern void servo_init();
35 35
 
36 36
 #define MOVE_SERVO(I, P) servo[I].move(P)

+ 4
- 4
Marlin/src/module/tool_change.cpp View File

@@ -60,9 +60,9 @@
60 60
 #if DO_SWITCH_EXTRUDER
61 61
 
62 62
   #if EXTRUDERS > 3
63
-    #define _SERVO_NR (e < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR)
63
+    #define _SERVO_NR(E) ((E) < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR)
64 64
   #else
65
-    #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR
65
+    #define _SERVO_NR(E) SWITCHING_EXTRUDER_SERVO_NR
66 66
   #endif
67 67
 
68 68
   void move_extruder_servo(const uint8_t e) {
@@ -71,7 +71,7 @@
71 71
       if (e < EXTRUDERS - 1)
72 72
     #endif
73 73
     {
74
-      MOVE_SERVO(_SERVO_NR, servo_angles[_SERVO_NR][e]);
74
+      MOVE_SERVO(_SERVO_NR(e), servo_angles[_SERVO_NR(e)][e]);
75 75
       safe_delay(500);
76 76
     }
77 77
   }
@@ -82,7 +82,7 @@
82 82
 
83 83
   void move_nozzle_servo(const uint8_t e) {
84 84
     planner.synchronize();
85
-    MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, servo_angles[SWITCHING_EXTRUDER_SERVO_NR][e]);
85
+    MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, servo_angles[SWITCHING_NOZZLE_SERVO_NR][e]);
86 86
     safe_delay(500);
87 87
   }
88 88
 

+ 4
- 0
Marlin/src/pins/pins.h View File

@@ -625,6 +625,10 @@
625 625
   #define MAX_EXTRUDERS 5
626 626
 #endif
627 627
 
628
+#ifndef MAX_SERVOS
629
+  #define MAX_SERVOS 4
630
+#endif
631
+
628 632
 //
629 633
 // Assign auto fan pins if needed
630 634
 //

Loading…
Cancel
Save