Store servo angles in EEPROM
This commit is contained in:
		
							
								
								
									
										56
									
								
								Marlin/src/gcode/config/M281.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								Marlin/src/gcode/config/M281.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #include "../../inc/MarlinConfig.h" | ||||
|  | ||||
| #if HAS_SERVOS | ||||
|  | ||||
| #include "../gcode.h" | ||||
| #include "../../module/servo.h" | ||||
|  | ||||
| void GcodeSuite::M281() { | ||||
|     if (!parser.seen('P')) return; | ||||
|   const int servo_index = parser.value_int(); | ||||
|   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { | ||||
|     bool angle_change = false; | ||||
|     if (parser.seen('L')) { | ||||
|       servo_angles[servo_index][0] = parser.value_int(); | ||||
|       angle_change = true; | ||||
|     } | ||||
|     if (parser.seen('U')) { | ||||
|       servo_angles[servo_index][1] = parser.value_int(); | ||||
|       angle_change = true; | ||||
|     } | ||||
|     if (!angle_change) { | ||||
|       SERIAL_ECHO_START(); | ||||
|       SERIAL_ECHOPAIR(" Servo ", servo_index); | ||||
|       SERIAL_ECHOPAIR(" L", servo_angles[servo_index][0]); | ||||
|       SERIAL_ECHOLNPAIR(" U", servo_angles[servo_index][1]); | ||||
|     } | ||||
|   } | ||||
|   else { | ||||
|     SERIAL_ERROR_START(); | ||||
|     SERIAL_ECHOPAIR("Servo ", servo_index); | ||||
|     SERIAL_ECHOLNPGM(" out of range"); | ||||
|   } | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -103,8 +103,8 @@ inline void servo_probe_test() { | ||||
|  | ||||
|     SERIAL_PROTOCOLLNPGM("Servo probe test"); | ||||
|     SERIAL_PROTOCOLLNPAIR(".  using index:  ", probe_index); | ||||
|     SERIAL_PROTOCOLLNPAIR(".  deploy angle: ", z_servo_angle[0]); | ||||
|     SERIAL_PROTOCOLLNPAIR(".  stow angle:   ", z_servo_angle[1]); | ||||
|     SERIAL_PROTOCOLLNPAIR(".  deploy angle: ", servo_angles[probe_index][0]); | ||||
|     SERIAL_PROTOCOLLNPAIR(".  stow angle:   ", servo_angles[probe_index][1]); | ||||
|  | ||||
|     bool probe_inverting; | ||||
|  | ||||
| @@ -146,10 +146,10 @@ inline void servo_probe_test() { | ||||
|     uint8_t i = 0; | ||||
|     bool deploy_state, stow_state; | ||||
|     do { | ||||
|       MOVE_SERVO(probe_index, z_servo_angle[0]); //deploy | ||||
|       MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); //deploy | ||||
|       safe_delay(500); | ||||
|       deploy_state = READ(PROBE_TEST_PIN); | ||||
|       MOVE_SERVO(probe_index, z_servo_angle[1]); //stow | ||||
|       MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); //stow | ||||
|       safe_delay(500); | ||||
|       stow_state = READ(PROBE_TEST_PIN); | ||||
|     } while (++i < 4); | ||||
| @@ -170,7 +170,7 @@ inline void servo_probe_test() { | ||||
|       #endif | ||||
|     } | ||||
|     else {                                           // measure active signal length | ||||
|       MOVE_SERVO(probe_index, z_servo_angle[0]);     // deploy | ||||
|       MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]);     // deploy | ||||
|       safe_delay(500); | ||||
|       SERIAL_PROTOCOLLNPGM("please trigger probe"); | ||||
|       uint16_t probe_counter = 0; | ||||
| @@ -194,7 +194,7 @@ inline void servo_probe_test() { | ||||
|           else | ||||
|             SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse | ||||
|  | ||||
|           MOVE_SERVO(probe_index, z_servo_angle[1]); //stow | ||||
|           MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); //stow | ||||
|  | ||||
|         }  // pulse detected | ||||
|  | ||||
|   | ||||
| @@ -487,6 +487,7 @@ void GcodeSuite::process_parsed_command( | ||||
|  | ||||
|       #if HAS_SERVOS | ||||
|         case 280: M280(); break;                                  // M280: Set servo position absolute | ||||
|         case 281: M281(); break; | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(BABYSTEPPING) | ||||
|   | ||||
| @@ -172,6 +172,7 @@ | ||||
|  * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) | ||||
|  * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS) | ||||
|  * M280 - Set servo position absolute: "M280 P<index> S<angle|µs>". (Requires servos) | ||||
|  * M281 - Set servo min|max position: "M281 P<index> L<min> U<max>". (Requires servos) | ||||
|  * M290 - Babystepping (Requires BABYSTEPPING) | ||||
|  * M300 - Play beep sound S<frequency Hz> P<duration ms> | ||||
|  * M301 - Set PID parameters P I and D. (Requires PIDTEMP) | ||||
| @@ -627,6 +628,7 @@ private: | ||||
|  | ||||
|   #if HAS_SERVOS | ||||
|     static void M280(); | ||||
|     static void M281(); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(BABYSTEPPING) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user