Merge Anti-jitter for all servo moves (PR#2427)
This commit is contained in:
commit
63715aba4f
@ -504,13 +504,6 @@ const bool Z_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic
|
|||||||
//#define Z_PROBE_SLED // turn on if you have a z-probe mounted on a sled like those designed by Charles Bell
|
//#define Z_PROBE_SLED // turn on if you have a z-probe mounted on a sled like those designed by Charles Bell
|
||||||
//#define SLED_DOCKING_OFFSET 5 // the extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like.
|
//#define SLED_DOCKING_OFFSET 5 // the extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like.
|
||||||
|
|
||||||
//If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk
|
|
||||||
//The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it.
|
|
||||||
// You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile.
|
|
||||||
|
|
||||||
// #define PROBE_SERVO_DEACTIVATION_DELAY 300
|
|
||||||
|
|
||||||
|
|
||||||
//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing,
|
//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing,
|
||||||
//it is highly recommended you let this Z_SAFE_HOMING enabled!!!
|
//it is highly recommended you let this Z_SAFE_HOMING enabled!!!
|
||||||
|
|
||||||
@ -774,6 +767,17 @@ const bool Z_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic
|
|||||||
//
|
//
|
||||||
//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
|
//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
|
||||||
|
|
||||||
|
// If DEACTIVATE_SERVOS_AFTER_MOVE is defined, the servos will be turned on only during movement and then turned off to avoid jitter
|
||||||
|
// SERVO_DEACTIVATION_DELAY is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it.
|
||||||
|
// If your servo does not reach the requested position, enlarge the time.
|
||||||
|
// You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile.
|
||||||
|
//
|
||||||
|
//#define DEACTIVATE_SERVOS_AFTER_MOVE
|
||||||
|
|
||||||
|
#ifdef DEACTIVATE_SERVOS_AFTER_MOVE
|
||||||
|
#define SERVO_DEACTIVATION_DELAY 300
|
||||||
|
#endif
|
||||||
|
|
||||||
// Servo Endstops
|
// Servo Endstops
|
||||||
//
|
//
|
||||||
// This allows for servo actuated endstops, primary usage is for the Z Axis to eliminate calibration or bed height changes.
|
// This allows for servo actuated endstops, primary usage is for the Z Axis to eliminate calibration or bed height changes.
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif // ENABLE_AUTO_BED_LEVELING
|
#endif // ENABLE_AUTO_BED_LEVELING
|
||||||
|
|
||||||
#define SERVO_LEVELING (defined(ENABLE_AUTO_BED_LEVELING) && PROBE_SERVO_DEACTIVATION_DELAY > 0)
|
#define SERVO_LEVELING (defined(ENABLE_AUTO_BED_LEVELING) && defined(DEACTIVATE_SERVOS_AFTER_MOVE))
|
||||||
|
|
||||||
#ifdef MESH_BED_LEVELING
|
#ifdef MESH_BED_LEVELING
|
||||||
#include "mesh_bed_leveling.h"
|
#include "mesh_bed_leveling.h"
|
||||||
@ -570,13 +570,9 @@ void servo_init() {
|
|||||||
#ifdef SERVO_ENDSTOPS
|
#ifdef SERVO_ENDSTOPS
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
if (servo_endstops[i] >= 0)
|
if (servo_endstops[i] >= 0)
|
||||||
servo[servo_endstops[i]].write(servo_endstop_angles[i * 2 + 1]);
|
servo[servo_endstops[i]].move(0, servo_endstop_angles[i * 2 + 1]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERVO_LEVELING
|
|
||||||
delay(PROBE_SERVO_DEACTIVATION_DELAY);
|
|
||||||
servo[servo_endstops[Z_AXIS]].detach();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1315,14 +1311,7 @@ static void setup_for_endstop_move() {
|
|||||||
// Engage Z Servo endstop if enabled
|
// Engage Z Servo endstop if enabled
|
||||||
if (servo_endstops[Z_AXIS] >= 0) {
|
if (servo_endstops[Z_AXIS] >= 0) {
|
||||||
Servo *srv = &servo[servo_endstops[Z_AXIS]];
|
Servo *srv = &servo[servo_endstops[Z_AXIS]];
|
||||||
#if SERVO_LEVELING
|
srv->move(0, servo_endstop_angles[Z_AXIS * 2]);
|
||||||
srv->attach(0);
|
|
||||||
#endif
|
|
||||||
srv->write(servo_endstop_angles[Z_AXIS * 2]);
|
|
||||||
#if SERVO_LEVELING
|
|
||||||
delay(PROBE_SERVO_DEACTIVATION_DELAY);
|
|
||||||
srv->detach();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(Z_PROBE_ALLEN_KEY)
|
#elif defined(Z_PROBE_ALLEN_KEY)
|
||||||
@ -1424,14 +1413,7 @@ static void setup_for_endstop_move() {
|
|||||||
|
|
||||||
// Change the Z servo angle
|
// Change the Z servo angle
|
||||||
Servo *srv = &servo[servo_endstops[Z_AXIS]];
|
Servo *srv = &servo[servo_endstops[Z_AXIS]];
|
||||||
#if SERVO_LEVELING
|
srv->move(0, servo_endstop_angles[Z_AXIS * 2 + 1]);
|
||||||
srv->attach(0);
|
|
||||||
#endif
|
|
||||||
srv->write(servo_endstop_angles[Z_AXIS * 2 + 1]);
|
|
||||||
#if SERVO_LEVELING
|
|
||||||
delay(PROBE_SERVO_DEACTIVATION_DELAY);
|
|
||||||
srv->detach();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(Z_PROBE_ALLEN_KEY)
|
#elif defined(Z_PROBE_ALLEN_KEY)
|
||||||
@ -1683,7 +1665,7 @@ static void homeaxis(AxisEnum axis) {
|
|||||||
if (axis != Z_AXIS) {
|
if (axis != Z_AXIS) {
|
||||||
// Engage Servo endstop if enabled
|
// Engage Servo endstop if enabled
|
||||||
if (servo_endstops[axis] > -1)
|
if (servo_endstops[axis] > -1)
|
||||||
servo[servo_endstops[axis]].write(servo_endstop_angles[axis * 2]);
|
servo[servo_endstops[axis]].move(0, servo_endstop_angles[axis * 2]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1786,7 +1768,7 @@ static void homeaxis(AxisEnum axis) {
|
|||||||
{
|
{
|
||||||
// Retract Servo endstop if enabled
|
// Retract Servo endstop if enabled
|
||||||
if (servo_endstops[axis] > -1)
|
if (servo_endstops[axis] > -1)
|
||||||
servo[servo_endstops[axis]].write(servo_endstop_angles[axis * 2 + 1]);
|
servo[servo_endstops[axis]].move(0, servo_endstop_angles[axis * 2 + 1]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4354,14 +4336,7 @@ inline void gcode_M226() {
|
|||||||
servo_position = code_value_short();
|
servo_position = code_value_short();
|
||||||
if (servo_index >= 0 && servo_index < NUM_SERVOS) {
|
if (servo_index >= 0 && servo_index < NUM_SERVOS) {
|
||||||
Servo *srv = &servo[servo_index];
|
Servo *srv = &servo[servo_index];
|
||||||
#if SERVO_LEVELING
|
srv->move(0, servo_position);
|
||||||
srv->attach(0);
|
|
||||||
#endif
|
|
||||||
srv->write(servo_position);
|
|
||||||
#if SERVO_LEVELING
|
|
||||||
delay(PROBE_SERVO_DEACTIVATION_DELAY);
|
|
||||||
srv->detach();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SERIAL_ECHO_START;
|
SERIAL_ECHO_START;
|
||||||
|
@ -35,12 +35,14 @@
|
|||||||
|
|
||||||
write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)
|
write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)
|
||||||
writeMicroseconds() - Sets the servo pulse width in microseconds
|
writeMicroseconds() - Sets the servo pulse width in microseconds
|
||||||
|
move(pin, angel) - Sequence of attach(pin), write(angel),
|
||||||
|
if DEACTIVATE_SERVOS_AFTER_MOVE is defined waits SERVO_DEACTIVATION_DELAY, than detaches.
|
||||||
read() - Gets the last written servo pulse width as an angle between 0 and 180.
|
read() - Gets the last written servo pulse width as an angle between 0 and 180.
|
||||||
readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
|
readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
|
||||||
attached() - Returns true if there is a servo attached.
|
attached() - Returns true if there is a servo attached.
|
||||||
detach() - Stops an attached servos from pulsing its i/o pin.
|
detach() - Stops an attached servos from pulsing its i/o pin.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
|
|
||||||
#ifdef NUM_SERVOS
|
#ifdef NUM_SERVOS
|
||||||
@ -301,4 +303,17 @@ int Servo::readMicroseconds() {
|
|||||||
|
|
||||||
bool Servo::attached() { return servos[this->servoIndex].Pin.isActive; }
|
bool Servo::attached() { return servos[this->servoIndex].Pin.isActive; }
|
||||||
|
|
||||||
|
uint8_t Servo::move(int pin, int value) {
|
||||||
|
uint8_t ret;
|
||||||
|
ret = this->attach(pin);
|
||||||
|
if (ret) {
|
||||||
|
this->write(value);
|
||||||
|
#ifdef DEACTIVATE_SERVOS_AFTER_MOVE && (SERVO_DEACTIVATION_DELAY > 0)
|
||||||
|
delay(SERVO_DEACTIVATION_DELAY);
|
||||||
|
this->detach();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
|
readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
|
||||||
attached() - Returns true if there is a servo attached.
|
attached() - Returns true if there is a servo attached.
|
||||||
detach() - Stops an attached servos from pulsing its i/o pin.
|
detach() - Stops an attached servos from pulsing its i/o pin.
|
||||||
|
move(pin, angel) - Sequence of attach(pin), write(angel),
|
||||||
|
if DEACTIVATE_SERVOS_AFTER_MOVE is defined waits SERVO_DEACTIVATION_DELAY, than detaches.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef servo_h
|
#ifndef servo_h
|
||||||
@ -120,6 +122,9 @@ class Servo {
|
|||||||
void detach();
|
void detach();
|
||||||
void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds
|
void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds
|
||||||
void writeMicroseconds(int value); // Write pulse width in microseconds
|
void writeMicroseconds(int value); // Write pulse width in microseconds
|
||||||
|
uint8_t move(int pin, int value); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure.
|
||||||
|
// if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds.
|
||||||
|
// if DEACTIVATE_SERVOS_AFTER_MOVE is defined waits SERVO_DEACTIVATION_DELAY, than detaches.
|
||||||
int read(); // returns current pulse width as an angle between 0 and 180 degrees
|
int read(); // returns current pulse width as an angle between 0 and 180 degrees
|
||||||
int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release)
|
int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release)
|
||||||
bool attached(); // return true if this servo is attached, otherwise false
|
bool attached(); // return true if this servo is attached, otherwise false
|
||||||
|
Loading…
Reference in New Issue
Block a user