Browse Source

Fix issues, make optional

Scott Lahteine 7 years ago
parent
commit
3e81745e81

+ 4
- 3
Marlin/Configuration.h View File

1947
 // If the servo can't reach the requested position, increase it.
1947
 // If the servo can't reach the requested position, increase it.
1948
 #define SERVO_DELAY { 300 }
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
 //#define DEACTIVATE_SERVOS_AFTER_MOVE
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
 #endif // CONFIGURATION_H
1956
 #endif // CONFIGURATION_H

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

1946
 // If the servo can't reach the requested position, increase it.
1946
 // If the servo can't reach the requested position, increase it.
1947
 #define SERVO_DELAY { 300 }
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
 //#define DEACTIVATE_SERVOS_AFTER_MOVE
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
 #endif // CONFIGURATION_H
1955
 #endif // CONFIGURATION_H

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

21
  */
21
  */
22
 #include "../../inc/MarlinConfig.h"
22
 #include "../../inc/MarlinConfig.h"
23
 
23
 
24
-#if HAS_SERVOS
24
+#if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
25
 
25
 
26
 #include "../gcode.h"
26
 #include "../gcode.h"
27
 #include "../../module/servo.h"
27
 #include "../../module/servo.h"
28
 
28
 
29
 void GcodeSuite::M281() {
29
 void GcodeSuite::M281() {
30
-    if (!parser.seen('P')) return;
30
+  if (!parser.seenval('P')) return;
31
   const int servo_index = parser.value_int();
31
   const int servo_index = parser.value_int();
32
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
32
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
33
     bool angle_change = false;
33
     bool angle_change = false;
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
     uint8_t i = 0;
146
     uint8_t i = 0;
147
     bool deploy_state, stow_state;
147
     bool deploy_state, stow_state;
148
     do {
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
       safe_delay(500);
150
       safe_delay(500);
151
       deploy_state = READ(PROBE_TEST_PIN);
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
       safe_delay(500);
153
       safe_delay(500);
154
       stow_state = READ(PROBE_TEST_PIN);
154
       stow_state = READ(PROBE_TEST_PIN);
155
     } while (++i < 4);
155
     } while (++i < 4);
170
       #endif
170
       #endif
171
     }
171
     }
172
     else {                                           // measure active signal length
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
       safe_delay(500);
174
       safe_delay(500);
175
       SERIAL_PROTOCOLLNPGM("please trigger probe");
175
       SERIAL_PROTOCOLLNPGM("please trigger probe");
176
       uint16_t probe_counter = 0;
176
       uint16_t probe_counter = 0;
194
           else
194
           else
195
             SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse
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
         }  // pulse detected
199
         }  // pulse detected
200
 
200
 

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

487
 
487
 
488
       #if HAS_SERVOS
488
       #if HAS_SERVOS
489
         case 280: M280(); break;                                  // M280: Set servo position absolute
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
       #endif
493
       #endif
492
 
494
 
493
       #if ENABLED(BABYSTEPPING)
495
       #if ENABLED(BABYSTEPPING)

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

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

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

687
 /**
687
 /**
688
  * Limited number of servos
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
 #endif
692
 #endif
693
 
693
 
694
 /**
694
 /**

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

72
 
72
 
73
 #if HAS_SERVOS
73
 #if HAS_SERVOS
74
   #include "servo.h"
74
   #include "servo.h"
75
-#endif 
75
+#endif
76
 
76
 
77
 #if HAS_BED_PROBE
77
 #if HAS_BED_PROBE
78
   #include "../module/probe.h"
78
   #include "../module/probe.h"
181
   //
181
   //
182
   // SERVO_ANGLES
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
   // DELTA / [XYZ]_DUAL_ENDSTOPS
187
   // DELTA / [XYZ]_DUAL_ENDSTOPS
543
       EEPROM_WRITE(storage_slot);
541
       EEPROM_WRITE(storage_slot);
544
     #endif // AUTO_BED_LEVELING_UBL
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
     #endif
560
     #endif
549
 
561
 
562
+    EEPROM_WRITE(servo_angles);
563
+
550
     // 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS
564
     // 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS
551
     #if ENABLED(DELTA)
565
     #if ENABLED(DELTA)
552
 
566
 
1153
       //
1167
       //
1154
       // SERVO_ANGLES
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
       #endif
1172
       #endif
1159
-
1173
+      EEPROM_READ(servo_angles);
1160
 
1174
 
1161
       //
1175
       //
1162
       // DELTA Geometry or Dual Endstops offsets
1176
       // DELTA Geometry or Dual Endstops offsets
1801
   // Servo Angles
1815
   // Servo Angles
1802
   //
1816
   //
1803
 
1817
 
1804
-  #if HAS_SERVOS
1818
+  #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
1819
+
1805
     #if ENABLED(SWITCHING_EXTRUDER)
1820
     #if ENABLED(SWITCHING_EXTRUDER)
1821
+
1806
       #if EXTRUDERS > 3
1822
       #if EXTRUDERS > 3
1807
         #define REQ_ANGLES 4
1823
         #define REQ_ANGLES 4
1808
       #else
1824
       #else
1809
         #define REQ_ANGLES 2
1825
         #define REQ_ANGLES 2
1810
       #endif
1826
       #endif
1811
-      const uint8_t extruder_angles[2] = SWITCHING_EXTRUDER_SERVO_ANGLES;
1827
+      constexpr uint16_t extruder_angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES;
1812
       static_assert(COUNT(extruder_angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
1828
       static_assert(COUNT(extruder_angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
1813
       servo_angles[SWITCHING_EXTRUDER_SERVO_NR][0] = extruder_angles[0];
1829
       servo_angles[SWITCHING_EXTRUDER_SERVO_NR][0] = extruder_angles[0];
1814
       servo_angles[SWITCHING_EXTRUDER_SERVO_NR][1] = extruder_angles[1];
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
       servo_angles[Z_PROBE_SERVO_NR][0] = z_probe_angles[0];
1845
       servo_angles[Z_PROBE_SERVO_NR][0] = z_probe_angles[0];
1826
       servo_angles[Z_PROBE_SERVO_NR][1] = z_probe_angles[1];
1846
       servo_angles[Z_PROBE_SERVO_NR][1] = z_probe_angles[1];
1847
+
1827
     #endif
1848
     #endif
1828
 
1849
 
1829
-  #endif
1850
+  #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
1830
 
1851
 
1831
   #if ENABLED(DELTA)
1852
   #if ENABLED(DELTA)
1832
     const float adj[ABC] = DELTA_ENDSTOP_ADJ,
1853
     const float adj[ABC] = DELTA_ENDSTOP_ADJ,
2306
 
2327
 
2307
     #endif // HAS_LEVELING
2328
     #endif // HAS_LEVELING
2308
 
2329
 
2309
-    #if HAS_SERVOS
2330
+    #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES)
2331
+
2310
       if (!forReplay) {
2332
       if (!forReplay) {
2311
         CONFIG_ECHO_START;
2333
         CONFIG_ECHO_START;
2312
         SERIAL_ECHOLNPGM_P(port, "Servo Angles:");
2334
         SERIAL_ECHOLNPGM_P(port, "Servo Angles:");
2313
       }
2335
       }
2314
       for (uint8_t i = 0; i < NUM_SERVOS; i++) {
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
     #if ENABLED(DELTA)
2359
     #if ENABLED(DELTA)
2324
 
2360
 

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

434
 
434
 
435
       #elif HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)
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
       #elif ENABLED(Z_PROBE_ALLEN_KEY)
439
       #elif ENABLED(Z_PROBE_ALLEN_KEY)
440
 
440
 

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

31
 #include "servo.h"
31
 #include "servo.h"
32
 
32
 
33
 HAL_SERVO_LIB servo[NUM_SERVOS];
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
 void servo_init() {
36
 void servo_init() {
37
   #if NUM_SERVOS >= 1 && HAS_SERVO_0
37
   #if NUM_SERVOS >= 1 && HAS_SERVO_0

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

30
 #include "../HAL/shared/servo.h"
30
 #include "../HAL/shared/servo.h"
31
 
31
 
32
 extern HAL_SERVO_LIB servo[NUM_SERVOS];
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
 extern void servo_init();
34
 extern void servo_init();
35
 
35
 
36
 #define MOVE_SERVO(I, P) servo[I].move(P)
36
 #define MOVE_SERVO(I, P) servo[I].move(P)

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

60
 #if DO_SWITCH_EXTRUDER
60
 #if DO_SWITCH_EXTRUDER
61
 
61
 
62
   #if EXTRUDERS > 3
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
   #else
64
   #else
65
-    #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR
65
+    #define _SERVO_NR(E) SWITCHING_EXTRUDER_SERVO_NR
66
   #endif
66
   #endif
67
 
67
 
68
   void move_extruder_servo(const uint8_t e) {
68
   void move_extruder_servo(const uint8_t e) {
71
       if (e < EXTRUDERS - 1)
71
       if (e < EXTRUDERS - 1)
72
     #endif
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
       safe_delay(500);
75
       safe_delay(500);
76
     }
76
     }
77
   }
77
   }
82
 
82
 
83
   void move_nozzle_servo(const uint8_t e) {
83
   void move_nozzle_servo(const uint8_t e) {
84
     planner.synchronize();
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
     safe_delay(500);
86
     safe_delay(500);
87
   }
87
   }
88
 
88
 

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

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

Loading…
Cancel
Save