Skip to content

Commit 17f1ba1

Browse files
committed
Hangprinter: Allow Hangprinter to be configured with 6 anchors
1 parent fa3337f commit 17f1ba1

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,10 +20,11 @@
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[5][3] = {{ 0.0, -2000.0, -100.0},
23+
constexpr float DefaultAnchors[6][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},
27+
{ 0.0, 0.0, 0.0},
2728
{ 0.0, 0.0, 0.0}};
2829
constexpr float DefaultPrintRadius = 1500.0;
2930

@@ -83,13 +84,13 @@ void HangprinterKinematics::Init() noexcept
8384
* In practice you might want to compensate a bit more or a bit less */
8485
constexpr float DefaultSpoolBuildupFactor = 0.007;
8586
/* Measure and set spool radii with M669 to achieve better accuracy */
86-
constexpr float DefaultSpoolRadii[HANGPRINTER_MAX_AXES] = { 75.0, 75.0, 75.0, 75.0, 75.0}; // HP4 default
87+
constexpr float DefaultSpoolRadii[HANGPRINTER_MAX_AXES] = { 75.0, 75.0, 75.0, 75.0, 75.0, 75.0}; // HP4 default
8788
/* If axis runs lines back through pulley system, set mechanical advantage accordingly with M669 */
88-
constexpr uint32_t DefaultMechanicalAdvantage[HANGPRINTER_MAX_AXES] = { 2, 2, 2, 2, 4}; // HP4 default
89-
constexpr uint32_t DefaultLinesPerSpool[HANGPRINTER_MAX_AXES] = { 1, 1, 1, 1, 1}; // HP4 default
90-
constexpr uint32_t DefaultMotorGearTeeth[HANGPRINTER_MAX_AXES] = { 20, 20, 20, 20, 20}; // HP4 default
91-
constexpr uint32_t DefaultSpoolGearTeeth[HANGPRINTER_MAX_AXES] = { 255, 255, 255, 255, 255}; // HP4 default
92-
constexpr uint32_t DefaultFullStepsPerMotorRev[HANGPRINTER_MAX_AXES] = { 25, 25, 25, 25, 25};
89+
constexpr uint32_t DefaultMechanicalAdvantage[HANGPRINTER_MAX_AXES] = { 2, 2, 2, 2, 2, 4}; // HP4 default
90+
constexpr uint32_t DefaultLinesPerSpool[HANGPRINTER_MAX_AXES] = { 1, 1, 1, 1, 1, 1}; // HP4 default
91+
constexpr uint32_t DefaultMotorGearTeeth[HANGPRINTER_MAX_AXES] = { 20, 20, 20, 20, 20, 20}; // HP4 default
92+
constexpr uint32_t DefaultSpoolGearTeeth[HANGPRINTER_MAX_AXES] = { 255, 255, 255, 255, 255, 255}; // HP4 default
93+
constexpr uint32_t DefaultFullStepsPerMotorRev[HANGPRINTER_MAX_AXES] = { 25, 25, 25, 25, 25, 25};
9394
ARRAY_INIT(anchors, DefaultAnchors);
9495
numAnchors = DefaultNumAnchors;
9596
printRadius = DefaultPrintRadius;
@@ -187,6 +188,14 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const
187188
return true;
188189
}
189190
}
191+
if (numAnchors > 5)
192+
{
193+
if (gb.TryGetFloatArray('F', 3, anchors[F_AXIS], reply, seen))
194+
{
195+
error = true;
196+
return true;
197+
}
198+
}
190199

191200
if (gb.Seen('P'))
192201
{
@@ -218,6 +227,11 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const
218227
reply.lcatf("E:%.2f, %.2f, %.2f\n",
219228
(double)anchors[E_AXIS][X_AXIS], (double)anchors[E_AXIS][Y_AXIS], (double)anchors[E_AXIS][Z_AXIS]);
220229
}
230+
if (numAnchors > 5)
231+
{
232+
reply.lcatf("F:%.2f, %.2f, %.2f\n",
233+
(double)anchors[F_AXIS][X_AXIS], (double)anchors[F_AXIS][Y_AXIS], (double)anchors[F_AXIS][Z_AXIS]);
234+
}
221235
}
222236
}
223237
else if (mCode == 666)
@@ -533,6 +547,16 @@ bool HangprinterKinematics::WriteCalibrationParameters(FileStore *f) const noexc
533547
}
534548
}
535549

550+
if (numAnchors > 5)
551+
{
552+
scratchString.printf(" F%.3f:%.3f:%.3f",
553+
(double)anchors[F_AXIS][X_AXIS], (double)anchors[F_AXIS][Y_AXIS], (double)anchors[F_AXIS][Z_AXIS]);
554+
if (!f->Write(scratchString.c_str()))
555+
{
556+
return false;
557+
}
558+
}
559+
536560
scratchString.printf(" P%.1f\n", (double)printRadius);
537561
if (!f->Write(scratchString.c_str()))
538562
{
@@ -749,8 +773,8 @@ void HangprinterKinematics::PrintParameters(const StringRef& reply) const noexce
749773
HangprinterKinematics::ODriveAnswer HangprinterKinematics::GetODrive3EncoderEstimate(DriverId const driver, bool const makeReference, const StringRef& reply, bool const subtractReference) THROWS(GCodeException)
750774
{
751775
const uint8_t cmd = CANSimple::MSG_GET_ENCODER_ESTIMATES;
752-
static CanAddress seenDrives[HANGPRINTER_MAX_AXES] = { 0, 0, 0, 0, 0 };
753-
static float referencePositions[HANGPRINTER_MAX_AXES] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
776+
static CanAddress seenDrives[HANGPRINTER_MAX_AXES] = { 0, 0, 0, 0, 0, 0 };
777+
static float referencePositions[HANGPRINTER_MAX_AXES] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
754778
static size_t numSeenDrives = 0;
755779
size_t thisDriveIdx = 0;
756780

src/Movement/Kinematics/HangprinterKinematics.h

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

5353
private:
5454
// Basic facts about movement system
55-
static constexpr size_t HANGPRINTER_MAX_AXES = 5;
55+
static constexpr size_t HANGPRINTER_MAX_AXES = 6;
5656
static constexpr size_t A_AXIS = 0;
5757
static constexpr size_t B_AXIS = 1;
5858
static constexpr size_t C_AXIS = 2;
5959
static constexpr size_t D_AXIS = 3;
6060
static constexpr size_t E_AXIS = 4;
61+
static constexpr size_t F_AXIS = 5;
6162

6263
void Init() noexcept;
6364
void Recalc() noexcept;

0 commit comments

Comments
 (0)