Skip to content

Commit 51446ee

Browse files
committed
Hangprinter: Allow Hangprinter to be configured with 9 anchors
1 parent ac4b7d3 commit 51446ee

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

src/Movement/Kinematics/HangprinterKinematics.cpp

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@
2020
constexpr size_t DefaultNumAnchors = 4;
2121
// Default anchor coordinates
2222
// These are only placeholders. Each machine must have these values calibrated in order to work correctly.
23-
constexpr float DefaultAnchors[8][3] = {{ 0.0, -2000.0, -100.0},
23+
constexpr float DefaultAnchors[9][3] = {{ 0.0, -2000.0, -100.0},
2424
{ 2000.0, 1000.0, -100.0},
2525
{-2000.0, 1000.0, -100.0},
2626
{ 0.0, 0.0, 3000.0},
2727
{ 0.0, 0.0, 0.0},
2828
{ 0.0, 0.0, 0.0},
2929
{ 0.0, 0.0, 0.0},
30+
{ 0.0, 0.0, 0.0},
3031
{ 0.0, 0.0, 0.0}};
3132
constexpr float DefaultPrintRadius = 1500.0;
3233

@@ -86,13 +87,13 @@ void HangprinterKinematics::Init() noexcept
8687
* In practice you might want to compensate a bit more or a bit less */
8788
constexpr float DefaultSpoolBuildupFactor = 0.007;
8889
/* Measure and set spool radii with M669 to achieve better accuracy */
89-
constexpr float DefaultSpoolRadii[HANGPRINTER_MAX_AXES] = { 75.0, 75.0, 75.0, 75.0, 75.0, 75.0, 75.0, 75.0}; // HP4 default
90+
constexpr float DefaultSpoolRadii[HANGPRINTER_MAX_AXES] = { 75.0, 75.0, 75.0, 75.0, 75.0, 75.0, 75.0, 75.0, 75.0}; // HP4 default
9091
/* If axis runs lines back through pulley system, set mechanical advantage accordingly with M669 */
91-
constexpr uint32_t DefaultMechanicalAdvantage[HANGPRINTER_MAX_AXES] = { 2, 2, 2, 2, 2, 2, 2, 4}; // HP4 default
92-
constexpr uint32_t DefaultLinesPerSpool[HANGPRINTER_MAX_AXES] = { 1, 1, 1, 1, 1, 1, 1, 1}; // HP4 default
93-
constexpr uint32_t DefaultMotorGearTeeth[HANGPRINTER_MAX_AXES] = { 20, 20, 20, 20, 20, 20, 20, 20}; // HP4 default
94-
constexpr uint32_t DefaultSpoolGearTeeth[HANGPRINTER_MAX_AXES] = { 255, 255, 255, 255, 255, 255, 255, 255}; // HP4 default
95-
constexpr uint32_t DefaultFullStepsPerMotorRev[HANGPRINTER_MAX_AXES] = { 25, 25, 25, 25, 25, 25, 25, 25};
92+
constexpr uint32_t DefaultMechanicalAdvantage[HANGPRINTER_MAX_AXES] = { 2, 2, 2, 2, 2, 2, 2, 2, 4}; // HP4 default
93+
constexpr uint32_t DefaultLinesPerSpool[HANGPRINTER_MAX_AXES] = { 1, 1, 1, 1, 1, 1, 1, 1, 1}; // HP4 default
94+
constexpr uint32_t DefaultMotorGearTeeth[HANGPRINTER_MAX_AXES] = { 20, 20, 20, 20, 20, 20, 20, 20, 20}; // HP4 default
95+
constexpr uint32_t DefaultSpoolGearTeeth[HANGPRINTER_MAX_AXES] = { 255, 255, 255, 255, 255, 255, 255, 255, 255}; // HP4 default
96+
constexpr uint32_t DefaultFullStepsPerMotorRev[HANGPRINTER_MAX_AXES] = { 25, 25, 25, 25, 25, 25, 25, 25, 25};
9697
ARRAY_INIT(anchors, DefaultAnchors);
9798
numAnchors = DefaultNumAnchors;
9899
printRadius = DefaultPrintRadius;
@@ -214,6 +215,14 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const
214215
return true;
215216
}
216217
}
218+
if (numAnchors > 8)
219+
{
220+
if (gb.TryGetFloatArray('I', 3, anchors[I_AXIS], reply, seen))
221+
{
222+
error = true;
223+
return true;
224+
}
225+
}
217226

218227
if (gb.Seen('P'))
219228
{
@@ -260,6 +269,11 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const
260269
reply.lcatf("H:%.2f, %.2f, %.2f\n",
261270
(double)anchors[H_AXIS][X_AXIS], (double)anchors[H_AXIS][Y_AXIS], (double)anchors[H_AXIS][Z_AXIS]);
262271
}
272+
if (numAnchors > 8)
273+
{
274+
reply.lcatf("I:%.2f, %.2f, %.2f\n",
275+
(double)anchors[I_AXIS][X_AXIS], (double)anchors[I_AXIS][Y_AXIS], (double)anchors[I_AXIS][Z_AXIS]);
276+
}
263277
}
264278
}
265279
else if (mCode == 666)
@@ -605,6 +619,16 @@ bool HangprinterKinematics::WriteCalibrationParameters(FileStore *f) const noexc
605619
}
606620
}
607621

622+
if (numAnchors > 8)
623+
{
624+
scratchString.printf(" I%.3f:%.3f:%.3f",
625+
(double)anchors[I_AXIS][X_AXIS], (double)anchors[I_AXIS][Y_AXIS], (double)anchors[I_AXIS][Z_AXIS]);
626+
if (!f->Write(scratchString.c_str()))
627+
{
628+
return false;
629+
}
630+
}
631+
608632
scratchString.printf(" P%.1f\n", (double)printRadius);
609633
if (!f->Write(scratchString.c_str()))
610634
{
@@ -821,8 +845,8 @@ void HangprinterKinematics::PrintParameters(const StringRef& reply) const noexce
821845
HangprinterKinematics::ODriveAnswer HangprinterKinematics::GetODrive3EncoderEstimate(DriverId const driver, bool const makeReference, const StringRef& reply, bool const subtractReference) THROWS(GCodeException)
822846
{
823847
const uint8_t cmd = CANSimple::MSG_GET_ENCODER_ESTIMATES;
824-
static CanAddress seenDrives[HANGPRINTER_MAX_AXES] = { 0, 0, 0, 0, 0, 0, 0, 0 };
825-
static float referencePositions[HANGPRINTER_MAX_AXES] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
848+
static CanAddress seenDrives[HANGPRINTER_MAX_AXES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
849+
static float referencePositions[HANGPRINTER_MAX_AXES] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
826850
static size_t numSeenDrives = 0;
827851
size_t thisDriveIdx = 0;
828852

src/Movement/Kinematics/HangprinterKinematics.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class HangprinterKinematics : public RoundBedKinematics
5252

5353
private:
5454
// Basic facts about movement system
55-
static constexpr size_t HANGPRINTER_MAX_AXES = 8;
55+
static constexpr size_t HANGPRINTER_MAX_AXES = 9;
5656
static constexpr size_t A_AXIS = 0;
5757
static constexpr size_t B_AXIS = 1;
5858
static constexpr size_t C_AXIS = 2;
@@ -61,6 +61,7 @@ class HangprinterKinematics : public RoundBedKinematics
6161
static constexpr size_t F_AXIS = 5;
6262
static constexpr size_t G_AXIS = 6;
6363
static constexpr size_t H_AXIS = 7;
64+
static constexpr size_t I_AXIS = 8;
6465

6566
void Init() noexcept;
6667
void Recalc() noexcept;

0 commit comments

Comments
 (0)