Repository navigation
Expand file tree
/
Copy pathREADME.html
More file actions
1186 lines (1186 loc) · 57.7 KB
/
Copy pathREADME.html
File metadata and controls
1186 lines (1186 loc) · 57.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Arco Unleashed — README</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
border: none;
border-top: 1px solid #1a1a1a;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<style>
/* Arco Unleashed — branded theme for pandoc-generated docs (README.html / MANUAL.html).
Mirrors the hand-built QUICKSTART.html look (gradient banner, card, styled headings, callouts).
Applied via: pandoc … --include-in-header image-toolbox/pandoc-dark-header.html
Uses !important to override pandoc's default light template. */
:root{
--blue:#2E74F2; --blue-hi:#5B97FF; --navy:#0E2247; --ink:#070E1F;
--page:#10254a; --outer:#081832; --muted:#9db0cc; --line:#24406e;
}
html{ background:var(--outer) !important; }
body{
max-width:880px !important; margin:26px auto !important; padding:34px 40px 42px !important;
background:var(--page) !important; color:#dfe8f5 !important;
border-radius:12px !important; box-shadow:0 2px 22px rgba(0,0,0,.45) !important;
font:15px/1.6 -apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif !important;
}
/* Title banner — pandoc's title block, pulled full-bleed via negative margins (like QUICKSTART <header>) */
#title-block-header{
margin:-34px -40px 26px !important; padding:30px 40px !important;
background:linear-gradient(135deg,var(--ink),var(--navy)) !important;
border-radius:12px 12px 0 0 !important;
}
#title-block-header .title{ margin:0 !important; color:#fff !important; font-size:27px !important;
font-weight:700 !important; letter-spacing:.3px; border:0 !important; padding:0 !important; }
#title-block-header .subtitle{ color:#cdd9f2 !important; font-size:15px !important; font-weight:400 !important; }
h1,h2,h3,h4,h5,h6{ color:#fff !important; line-height:1.25 !important; }
h1{ font-size:23px !important; margin:1.5em 0 .5em !important; }
h2{ font-size:19px !important; margin:1.7em 0 .5em !important; padding-bottom:6px !important;
border-bottom:2px solid var(--line) !important; }
h3{ font-size:16px !important; color:#cfe0ff !important; margin:1.3em 0 .4em !important; }
a{ color:var(--blue-hi) !important; text-decoration:none !important; }
a:hover{ text-decoration:underline !important; }
p,li,td,dd,dt,figcaption{ color:#dfe8f5 !important; }
strong,b{ color:#fff !important; }
em,i{ color:#cdd9ef !important; }
code{ background:#0b1a33 !important; color:#cfe0ff !important; padding:1.5px 5px !important;
border-radius:4px !important; font:13px/1.4 Consolas,Menlo,monospace !important; }
pre{ background:var(--ink) !important; color:#e8f0ff !important; padding:13px 16px !important;
border-radius:8px !important; border-left:3px solid var(--blue) !important; overflow:auto !important; }
pre code{ background:none !important; color:inherit !important; padding:0 !important; }
blockquote{ margin:14px 0 !important; padding:11px 16px !important;
background:rgba(46,116,242,.09) !important; color:#c7d4ec !important;
border:0 !important; border-left:4px solid var(--blue) !important; border-radius:0 8px 8px 0 !important; }
blockquote p{ margin:.3em 0 !important; color:#c7d4ec !important; }
table{ border-collapse:collapse !important; margin:14px 0 !important; }
th,td{ border:1px solid var(--line) !important; padding:6px 11px !important; }
th{ background:#12294d !important; color:#fff !important; }
tr:nth-child(even) td{ background:rgba(255,255,255,.03) !important; }
hr{ border:0 !important; border-top:1px solid var(--line) !important; margin:24px 0 !important; }
img{ max-width:100% !important; height:auto !important; border-radius:8px !important; }
ul,ol{ padding-left:24px !important; }
li{ margin:4px 0 !important; }
</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Arco Unleashed — README</h1>
</header>
<p align="center">
<img src="assets/logo.png" alt="Arco Unleashed — Bookworm Edition" width="680">
</p>
<p align="center">
<a href="https://github.com/solutionphil/arco-unleashed/actions/workflows/ci.yml"><img alt="CI status" src="https://img.shields.io/github/actions/workflow/status/solutionphil/arco-unleashed/ci.yml?branch=main&label=CI"></a>
<a href="https://solutionphil.github.io/arco-unleashed/"><img alt="Documentation" src="https://img.shields.io/badge/docs-manual%20%C2%B7%20quickstart-2f52d6"></a>
<img alt="Klipper v0.13" src="https://img.shields.io/badge/Klipper-v0.13-2f52d6">
<img alt="Debian Bookworm, kernel 6.18" src="https://img.shields.io/badge/Debian-Bookworm%20%C2%B7%20kernel%206.18-a81d33">
<a href="LICENSE"><img alt="Licence: AGPL-3.0" src="https://img.shields.io/badge/licence-AGPL--3.0-2f52d6"></a>
<a href="https://ko-fi.com/solutionphil"><img alt="Support on Ko-fi" src="https://img.shields.io/badge/Ko--fi-feed%20the%20bookworm-2f52d6?logo=kofi&logoColor=white"></a>
</p>
<h1 id="arco-unleashed-bookworm-edition">Arco Unleashed — Bookworm
Edition</h1>
<p>Take the <strong>Phrozen Arco</strong> off the stock <strong>Debian
Buster / Klipper v0.11</strong> stack — frozen at the factory version,
with Buster now end-of-life — and onto a modern, fully self-hosted
setup: <strong>armbian-mkspi (Debian Bookworm, kernel 6.18) · Klipper
v0.13</strong>. All your factory hardware and features carry over — the
serial touch display, both MCUs, chamber light, input shaper, the
optional AMS and the PhrozenGo app — now running on a current,
maintained and fully open system.</p>
<h2 id="why-move-off-buster-klipper-v0.11">Why move off Buster + Klipper
v0.11?</h2>
<ul>
<li><strong>Security & longevity</strong> — Debian Buster is
<strong>end-of-life</strong> (no more security updates). Bookworm is
Debian’s oldstable release and still gets them, with modern Python and
packages.</li>
<li><strong>Klipper v0.13</strong> — years of fixes and features over
the frozen factory v0.11 (improved input shaper,
<code>exclude_object</code>, <code>danger_options</code>, faster) — and,
crucially, <strong>you can keep updating it</strong> instead of being
locked to the version Phrozen shipped.</li>
<li><strong>Modern add-on ecosystem</strong> — current Klipper /
Moonraker / Python means today’s tools just work:
<strong>Spoolman</strong> (filament tracking), <strong>Obico</strong>
(remote monitoring) — neither of which runs on the frozen factory stack.
Adaptive bed meshing you already have: it is built into this Klipper
(<code>BED_MESH_CALIBRATE ADAPTIVE=1</code>), so no add-on is needed for
it.</li>
<li><strong>Both web interfaces, like the stock printer</strong> —
<strong>Mainsail</strong> on <code>http://unleashed.local/</code> (and
<code>:81</code>) and <strong>Fluidd</strong> on
<code>unleashed.local:8808</code>, the ports your Arco came with. Both
current, both themed.</li>
<li><strong>It’s your printer</strong> — full SSH / root access,
Obico-ready, no cloud lock-in.</li>
</ul>
<h2 id="what-the-addon-layer-adds">What the AddOn layer adds</h2>
<p><strong>AMS auto-mode — one OrcaSlicer profile for
everything.</strong> Slice single-colour or multicolour with the same
profile; the printer works out which AMS mode to start in, at print
start, on its own. No second profile, no switching in the slicer, no
hand-edited G-code. And nothing to set: the printer sees the AMS on its
own and keeps its own flag in step, so attaching or removing the unit
needs no command and no menu. The flag and your slice are all the
printer needs. See <a
href="#orcaslicer--multicolor--ams-auto-mode">OrcaSlicer</a>.</p>
<p><strong>When something goes wrong.</strong> These four entries come
first in the setup menu. They are the reason you can try this at
all:</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr>
<td><strong>Save the whole system</strong></td>
<td>Every file, as one image, onto a USB stick. The same menu restores
an image, or takes the printer back to Buster.</td>
</tr>
<tr>
<td><strong>Save / restore your settings</strong></td>
<td>The numbers <em>your</em> machine measured — configuration,
calibration, the web interface’s own settings, your WiFi. Quick, no
reboot, and it writes to a USB stick: the copy that survives a
reflash.</td>
</tr>
<tr>
<td><strong>Emergency repair</strong></td>
<td>One action, no diagnosis required, for a printer that is halted, has
no display, or whose update is failing. Fixes what it can, then says
what broke.</td>
</tr>
<tr>
<td><strong>Check self-heal guards</strong></td>
<td>Everything this project patches heals itself — but only if a service
still carries the guard that does it. A kit update adds none, so a
printer that has run a while can be missing one, and nothing else says
so.</td>
</tr>
</tbody>
</table>
<p><strong>Printing, calibration and comfort.</strong> Every line here
is a switch in the setup menu, except the one marked <em>always
on</em>:</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr>
<td><code>G30</code></td>
<td>loads your saved bed mesh — <strong>the mesh fix</strong>, the
factory behaviour that never stuck</td>
</tr>
<tr>
<td><code>Z_TILT_ADJUST</code> · <code>Z_TILT_LEVEL</code></td>
<td>dual-Z alignment, homes first — the second name is the one Mainsail
will show as a button</td>
</tr>
<tr>
<td><code>SCREWS_TILT_CALCULATE</code></td>
<td>manual screw bed levelling</td>
</tr>
<tr>
<td><code>CALIBRATE_SHAPER_NEW</code></td>
<td>input-shaper calibration, sweeping to 130 Hz</td>
</tr>
<tr>
<td><code>PID_BED</code> · <code>PID_NOZZLE</code></td>
<td>PID tuning</td>
</tr>
<tr>
<td><code>BELT_TENSION</code></td>
<td>parks where both belt spans are equal — <a
href="#belts-and-idlers">details</a></td>
</tr>
<tr>
<td><code>BELT_WARMUP</code></td>
<td>belt and stepper warm-up before tensioning</td>
</tr>
<tr>
<td><code>CLEAN_IDLERS</code></td>
<td>turns the idlers in fixed steps, with a Mainsail dialog</td>
</tr>
<tr>
<td><code>M600</code> · <code>M601</code></td>
<td>filament change and pause, two-stage</td>
</tr>
<tr>
<td><code>LOAD_FILAMENT</code> · <code>UNLOAD_FILAMENT</code></td>
<td>manual, with priming — single-colour or no AMS</td>
</tr>
<tr>
<td><code>FILA_STATUS</code> <em>(always on)</em></td>
<td>is filament present, and is runout protection actually armed</td>
</tr>
<tr>
<td><code>ARCO_FILA_EMPTY</code></td>
<td>what happens when a print runs with an empty toolhead —
<code>M600</code> standalone, <code>PAUSE</code> with an AMS, and yours
to rewrite</td>
</tr>
<tr>
<td><code>TOGGLE_LIGHT</code></td>
<td>chamber light — also a real toggle switch in Mainsail, and it
follows the display</td>
</tr>
<tr>
<td><code>AMS_SETUP</code></td>
<td>one dialog: which slot serves which tool, and the refeed switch</td>
</tr>
<tr>
<td><code>AMS_SLOTS</code> · <code>AMS_REFEED</code></td>
<td>the same two settings as plain commands</td>
</tr>
<tr>
<td>board fan (PA2)</td>
<td>PID-controlled instead of always-on</td>
</tr>
<tr>
<td>piezo beeper (PB2)</td>
<td>short startup chime</td>
</tr>
</tbody>
</table>
<p>Plus <code>exclude_object</code> and <code>[respond]</code>, a
branded <strong>Mainsail theme</strong> (light / dark),
<strong>Fluidd</strong> on <code>:8808</code>, <code>ARCO_UPDATE</code>
from the Mainsail console with an entry in Moonraker’s update manager,
and one switch that turns <strong>PhrozenGo and the cloud tunnel
off</strong> if you would rather run Obico.</p>
<details>
<summary>
<b>Three of those differ from the factory macros on purpose</b>
</summary>
<p><strong>They home first</strong>, which the factory equivalents do
not: a calibration run from an assumed position measures the wrong
thing.</p>
<p><strong><code>CALIBRATE_SHAPER_NEW</code> stops the sweep at 130
Hz.</strong> The stock macro runs to 150, and on this machine nothing
above 130 adds anything worth having — the extra range is only time on
the accelerometer. It is not a typo, and it should not be “fixed”.</p>
<p><strong><code>FILA_STATUS</code> reports what the stock firmware
keeps to itself:</strong> whether filament is present, and whether
runout protection is actually armed. Those are two different questions,
and the factory display answers neither.</p>
</details>
<p><strong>Optional: Unleashed × KAOS.</strong> Chris Sanders’ <a
href="https://gitlab.com/sanders.chris/phrozenarco">KAOS</a> — a
motion-safety and multicolour layer for the Arco — has a
<strong>sideloader built into the kit</strong>, sitting dormant until
you ask for it. <code>KAOS_ON</code> clones KAOS from Chris’s own GitLab
repository, verifies it, and wires it in; <code>KAOS_OFF</code> puts the
printer back exactly as it was and keeps the download cached for an
instant switch back; <code>KAOS_STATUS</code> says which commit is
installed and whether it is active. So the printer needs internet the
first time, and <strong>KAOS itself is never redistributed here</strong>
— you get it from its author, like Phrozen’s module. KAOS and this kit
each replace some of Phrozen’s macros, and running them naively together
breaks homing. That is why the sideloader exists: it wires the two
together so both keep working. See <a href="MANUAL.html#step-10">MANUAL ›
Step 10</a>.</p>
<p>Install the <strong>easy way</strong>: flash the pre-built image, set
WiFi, flash your MCUs — running in minutes.</p>
<blockquote>
<p><strong>Disclaimer.</strong> Arco Unleashed is an independent,
community-made project. It is <strong>not</strong> developed, supported,
sponsored, endorsed by, or affiliated with Phrozen Tech Co., Ltd. or
ThroughTek Co., Ltd. <strong>No proprietary Phrozen/ThroughTek software
is bundled, hosted or mirrored</strong> by this project. Phrozen’s parts
reach the printer in one of two ways. The owner supplies their own
<code>Arco_FW_V*.zip</code>, obtained from official Phrozen sources and
provided on a USB stick. Or, only after the owner confirms, the
<code>phrozen_dev</code> module is downloaded from <strong>Phrozen’s own
public repository</strong> (<a
href="https://github.com/phrozen3d/klipper">phrozen3d/klipper</a>,
GPL-3.0), pinned to a fixed commit and checksum-verified.
<em>Phrozen</em>, <em>Arco</em> and <em>PhrozenGo</em> are trademarks of
their respective owners, used here only for identification (nominative
fair use).</p>
<p>⚠️ <strong>Hardware-specific:</strong> Phrozen Arco with MKS board
(RK3328, STM32F407 + MKS_THR STM32F103), AP6212 WiFi. Not a generic
Klipper kit.</p>
<p>⚠️ <strong>Warranty:</strong> replacing the factory OS/firmware and
opening the printer will very likely <strong>void your Phrozen
warranty</strong>. You do this to your own machine at your own risk.
Keep a backup of the original eMMC (or the stock image) so you can
restore it if you ever need to return the printer to stock.</p>
</blockquote>
<hr />
<h2 id="flash-run-the-pre-built-image">🟢 Flash & Run — the
pre-built image</h2>
<p>You get a finished image (a <code>.img.gz</code>, or a pre-flashed
spare eMMC module). The whole software stack is already on it — you only
need to flash it, set WiFi, and flash your printer’s MCUs.</p>
<blockquote>
<p>🛑 <strong>Phrozen’s gateway is rescued for you — but only if the
printer flashes itself.</strong> It saves <code>phrozen_master</code>,
<code>phrozen_slave_ota</code>, <code>device_table</code> and
<code>~/hdlDat</code>, which live only in Phrozen’s original OS — the
display talks to that gateway, and the AMS work mode lives beside it.
You cannot download them, and no Phrozen package contains them. The
flash then erases them for good. Without them the display spams
<em>connect to the server fail</em> about eleven times a minute, stops
returning to its home screen after calibration, and AMS detection
hangs.</p>
<p>The self-flash tool collects them itself, while the old system is
still there, and refuses to flash if it cannot. There is one route where
it never runs: pulling the eMMC and writing it from a PC. On that route,
<strong><a href="MANUAL.html#appendix-a0">MANUAL › A0</a></strong> has the
command to collect the two files by hand.</p>
<p>It is <strong>not</strong> a backup of the printer. For a way back to
the factory system, image the whole eMMC onto the stick first — <a
href="MANUAL.html#step-1">MANUAL › Step 1</a>, no teardown needed.</p>
</blockquote>
<h3 id="installing">Installing</h3>
<p><strong>The printer flashes itself.</strong> You put the image on a
USB stick, run one command over SSH, and the printer overwrites its own
eMMC on the next boot. No teardown, no PC, nothing to unplug.</p>
<p>Taking the eMMC module out is <strong>not</strong> part of that. It
is there for recovery if a flash ever fails, for setting up a spare
module, or for keeping an untouched copy of the factory system — <a
href="MANUAL.html#appendix-a">MANUAL › Appendix A</a>.</p>
<h4 id="which-guide">Which guide</h4>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr>
<td><strong><a href="QUICKSTART.html">QUICKSTART</a></strong></td>
<td>the condensed checklist — start here if you have done this kind of
thing before</td>
</tr>
<tr>
<td><strong><a href="MANUAL.html">MANUAL</a></strong></td>
<td>every screen and screwdriver step pictured, 1 → 10 in order</td>
</tr>
<tr>
<td><strong><a
href="INSTALL-FLOWCHARTS.md">INSTALL-FLOWCHARTS</a></strong></td>
<td>the same paths as diagrams, including the base-image and revert
routes</td>
</tr>
</tbody>
</table>
<p>Those three are the install instructions. Everything below on this
page is <strong>reference</strong> — the menu, the slicer profile, the
optional features — not a fourth copy of the procedure.</p>
<h4 id="the-three-things-people-miss">The three things people miss</h4>
<blockquote>
<p>⚠️ <strong>Bring the printer to Phrozen V199 first.</strong> That
firmware carries the touch-panel firmware this project expects, and the
panel is the one part Arco Unleashed never touches or ships. Start from
something older and the display can misbehave — on a machine where the
display is how you follow the install.</p>
<p>⚠️ <strong><code>arco-phrozen-ams.tar.gz</code> exists nowhere
else.</strong> The installer collects it for you while your printer is
still the original one, and refuses to flash if it cannot. Only one case
needs your hand: if you pull the eMMC and flash it from a PC, collect
the file yourself (<a href="MANUAL.html#appendix-a">Appendix A</a>). It is
in no download and in none of Phrozen’s packages. Everything else on the
stick comes out of <strong><a
href="https://github.com/solutionphil/arco-unleashed/releases"><code>Arco-Unleashed-USB.zip</code></a></strong>
— extract it to the top level and you are done.</p>
<p>⚠️ <strong>Flashing the MCUs is not optional.</strong> It is the one
step that opens the printer (two buttons inside the toolhead), and until
it is done Klipper cannot start and the display sits on an error screen.
That is expected, not a fault.</p>
</blockquote>
<h4 id="reaching-the-printer-afterwards">Reaching the printer
afterwards</h4>
<p>Once it is installed, the printer answers to
<strong><code>unleashed.local</code></strong> —
<code>ssh mks@unleashed.local</code>, or
<code>http://unleashed.local/</code> for the web interface. If your
network blocks mDNS, the address is also written to
<strong><code>ip.txt</code></strong> on the USB stick at every boot.</p>
<h2 id="menu-reference">Menu reference</h2>
<p>The setup menu runs an update check on start (if the kit is a git
clone) and only prompts y/n when an update exists.</p>
<pre><code> ESSENTIAL: Flash MCUs (Katapult toolhead + F407 DFU)
MAINTENANCE: Save / restore SETTINGS (the numbers you measured — quick, no reboot)
Save the WHOLE SYSTEM (every file, as one image — reboots)
also: restore an image · go back to Buster
Check self-heal guards (all wired? a kit update adds none)
SOMETHING BROKE: Emergency repair (halted, no display, update failing)
EXTRAS: PhrozenGo / Cloud · AddOn.cfg + Features
Beacon probe (experimental) · Sensorless XY homing (alternative)
UPDATE: check GitHub for a newer version</code></pre>
<details>
<summary>
What each entry does, in full
</summary>
<ul>
<li><strong>Phrozen-update protection</strong> — pressing
<em>Update</em> on the Phrozen display overwrites the Klipper core +
<code>printer.cfg</code> and halts the printer (Katapult keeps the F103
safe). The smart way is to <strong>stay ahead of it</strong> — this
option has three parts:
<ul>
<li><strong>Back up once, right after setup</strong>
<em>(recommended)</em> — a “golden” snapshot of your patched stack +
config.</li>
<li><strong>Pre-patch USB — before <em>every</em> Phrozen
update</strong> <em>(recommended)</em> — it bakes your fixes (from that
backup) onto the update stick, so Phrozen’s update <strong>installs them
along with itself</strong>. Each new update incrementally carries the
fixes — nothing gets clobbered and <strong>you never need to
recover</strong>.</li>
<li><strong>Restore</strong> — the fallback <em>only</em> if an update
ever slips through un-patched: one click puts back the v0.13 core,
patched module and your config (calibration preserved) and the printer
comes back up.</li>
</ul></li>
<li><strong>Save / restore SETTINGS</strong> — the guards restore the
Klipper core and the phrozen_dev module on their own, so the software
needs no preparation any more. What no guard can do is give back the
numbers <strong>your</strong> machine measured. <code>Backup</code>
captures your printer configuration and calibration, the web interface’s
own settings (theme, presets, macro groups, history — none of it in
<code>printer.cfg</code>), your WiFi and the phrozen_dev module;
<code>Restore</code> puts them back. It can also write the backup to a
<strong>USB stick</strong>, which is the copy that survives a reflash —
the local one lives on the very eMMC it is protecting.
<code>Pre-patch</code> additionally writes your config onto a Phrozen
update stick, so the installer deploys <em>your</em>
<code>printer.cfg</code> instead of Phrozen’s.</li>
<li><strong>Emergency repair</strong> — the one to reach for when the
printer halted, the display is dead, or an update button keeps failing.
It runs every repair in order without asking what went wrong, because at
that moment nobody knows whether Phrozen’s firmware, a Klipper update, a
Moonraker update or a “hard recover” caused it. Every step is
idempotent, so it is a no-op on a healthy printer, and it reports what
actually needed fixing. It also covers two things no automatic guard
catches. First: an <code>AddOn.cfg</code> that lost its
<code>[arco_mcu_timing]</code> section, which silently stops the MCU
timing from being applied. Second: root-owned files in
<code>~/klipper</code> or <code>~/moonraker</code>, which make
Moonraker’s update button fail with a git error that points nowhere near
the actual cause.</li>
<li><strong>Check self-heal guards</strong> — the entry that replaced
<em>“Re-apply Klipper patches”</em>, which had become redundant: those
patches are re-applied by a guard on every Klipper start and by
Emergency repair. What nothing checked is whether the guards are wired
at all. Guards are installed when the image is built, not when the kit
updates itself. So a printer that has been running a while can be
missing a guard the current kit assumes is there, and there is no
symptom until the failure that guard exists to catch. This compares
<code>klipper.service</code> against what the kit’s own installer
writes, so the expected list cannot drift, and offers to install
anything missing. <strong>You do not have to do anything about
that:</strong> <code>klipper.service</code> runs a series of
<code>ExecStartPre</code> guards before klippy loads, so the restart
that follows any update puts everything straight back. This menu option
is the manual equivalent, idempotent and safe anytime. >
<strong>Moonraker’s three actions are not equally harmless.</strong>
<em>Update</em> refuses outright on a modified repo > and otherwise
just pulls. <em>Soft recover</em> resets tracked files and leaves
untracked ones alone. > <strong>Hard recover</strong> runs
<code>git reset --hard</code> + <code>git clean -d -f</code>, so
everything untracked is deleted — > <code>phrozen_dev</code> and our
modules with it. Slow and unnecessary, but not fatal: the guards put our
modules > back automatically, and a copy of <em>your</em> phrozen_dev
is kept outside the Klipper tree for exactly this > case. If it ever
does go wrong, <strong>Emergency repair</strong> above is the one action
to run. > Klipper is <strong>not</strong> pinned: it sits on
<code>master</code> with HEAD attached, the repository is clean and
valid, > and Moonraker offers new versions normally — nothing is
greyed out or held back. >
(<code>scripts/pin-klipper-updates.sh</code> can hold a version
deliberately, if you want that.)</li>
<li><strong>PhrozenGo / Cloud</strong>
(<code>scripts/phrozengo.sh</code>) — <em>Privacy</em> closes the frpc
<strong>SSH tunnel</strong> to the vendor’s server; the app still works
via TUTK. <em>OTA</em> toggles Phrozen’s auto-update — turn it
<strong>OFF</strong> to protect your v0.13 from a hostile Phrozen
firmware update. <em>Disable</em> stops the cloud app entirely (no
phone-home), frees the webcam + resources, and stops Phrozen from
deleting <strong>Obico</strong> on boot. Defaults are as Phrozen ship
them (all on); local display + light always stay. > ⚠️
<strong>Installing Obico? Turn PhrozenGo off first.</strong> Phrozen’s
own KlipperScreen launcher runs >
<code>rm -rf ~/moonraker-obico</code> and
<code>~/moonraker-obico-env</code> on <strong>every boot</strong>, and
PhrozenGo ships > <strong>on</strong>, so those lines are live on a
fresh printer. Obico installs cleanly, works until the next >
restart, and is then simply gone — with nothing in any log to explain
it. <em>Disable</em> here comments > the lines out. Other Moonraker
add-ons (Spoolman, Mobileraker) are not touched.</li>
<li><strong>AMS</strong> — nothing to switch. The unit enumerates as a
USB serial device, so the printer detects it and keeps a macro-readable
<code>ams</code> flag in step, within seconds of plugging in or
unplugging. That flag <strong>steers OrcaSlicer</strong> automatically —
the print mode is picked at print start, see <a
href="#orcaslicer--multicolor--ams-auto-mode">OrcaSlicer</a>. Note: a
factory-NEW AMS additionally needs one-time provisioning (firmware
flash/pairing).</li>
</ul>
</details>
<p><a id="beacon-as-new-probing-device-for-meshing--experimental"></a></p>
<h2 id="beacon-as-new-probing-device-for-meshing-experimental">Beacon as
new probing device for meshing 🧪 <em>experimental</em></h2>
<details>
<summary>
Show the Beacon section
</summary>
<p><code>scripts/beacon_toggle.sh status|on|off</code> · setup menu →
<strong>b</strong></p>
<p>Swaps Phrozen’s piezo probe for a <strong>Beacon</strong>
eddy-current probe: Z is homed by a virtual endstop, the bed mesh is
<em>scanned</em> instead of poked, and a 15×15 mesh costs less time than
the stock 6×6 did. The config comes from a real conversion contributed
by <strong>Philippe Humeau</strong> (unPhrozen) — including the gotchas
he paid for, which are written into <code>beacon.cfg</code> where you
need them.</p>
<p>Toggling is reversible: <code>off</code> puts the piezo probe
sections back exactly as they were (verified) and keeps your calibrated
<code>beacon.cfg</code>. It edits only the lines it marked as its own,
so the rest of <code>printer.cfg</code> survives both directions
untouched. <code>on</code> walks five gates before it changes anything,
and each one aborts cleanly:</p>
<ol type="1">
<li><strong>Not mid-print</strong> — switching restarts Klipper.
Checked, not asked.</li>
<li><strong>Is the machine physically ready?</strong> — Beacon mounted,
wired and plugged in; rigid mount; bed clear. Asked <em>before</em>
anything is downloaded, so declining leaves no half-finished
conversion.</li>
<li><strong>Is a Beacon actually on USB?</strong> — the one thing the
script can verify by itself. No probe, no change.</li>
<li><strong>The module.</strong> Klipper does <strong>not</strong> ship
one: mainline v0.13 has generic eddy-current support
(<code>probe_eddy_current</code> + <code>ldc1612</code>, for LDC1612
probes like BTT Eddy), but Beacon speaks its own protocol over its own
MCU, so it needs the vendor’s out-of-tree module. If it is missing, you
are told what will be downloaded, from where, under which licence and to
which path — and asked. Nothing is redistributed by this kit.</li>
<li><strong>The config change</strong> — type <code>BEACON</code>. A
backup is written, and it rolls back if Klipper does not come up.</li>
</ol>
<blockquote>
<h3 id="read-this-before-switching">⚠️ Read this before switching</h3>
<p><strong>1. It is experimental in the literal sense.</strong> No Arco
Unleashed developer has run it on a machine. Every number in
<code>beacon.cfg</code> — <code>y_offset</code>,
<code>z_positions</code>, mesh bounds — is <em>one other printer’s</em>
value, not an Arco constant. Treat them as a starting point and verify
each one.</p>
<p><strong>2. Do not use the Arco display for anything Z-related
afterwards.</strong> Not Z-calibration, not auto-levelling, not “probe”
or mesh from the touchscreen. Its calibration flow was written for the
piezo probe: it declares Z positions instead of measuring them
(<code>SET_KINEMATIC_POSITION</code>), and it loads a stored mesh that
was probed against a different Z reference. On a Beacon machine that can
drive Z out of safe bounds — it was tested, and it did. <strong>Use
Mainsail or Fluidd</strong> for homing, probing, mesh and Z-offset.
Printing from the display is unaffected.</p>
<p><strong>3. Verify <code>z_positions</code> before you trust
<code>Z_TILT_ADJUST</code>.</strong> The order must match the
<em>physical</em> Z motors, not the order of the config sections.
Swapped, z_tilt <strong>diverges</strong> instead of converging and the
retries make it worse. Check with
<code>STEPPER_BUZZ STEPPER=stepper_z</code> / <code>stepper_z1</code>
and watch which side of the gantry moves.</p>
</blockquote>
<p><strong>What it changes.</strong> Four things have to
<em>disappear</em> from <code>printer.cfg</code>, which no include can
do. They are: <code>[probe]</code> (claims the same <code>!PB9</code>);
<code>[homing_override]</code> (claims <code>G28</code> and drives Z
against the piezo); <code>stepper_z</code>’s
<code>position_endstop</code> (Klipper rejects it as unused once the
endstop is virtual); and <code>stepper_z1</code>’s
<code>endstop_pin</code> (a second endstop on a probe-homed rail). Each
is commented with a <code>#:beacon:</code> marker, so <code>off</code>
is a prefix strip. Everything additive lives in <code>beacon.cfg</code>,
included <strong>last</strong> so its section merges win.</p>
<p><strong>Update safety.</strong> The Beacon module is untracked in
Klipper’s tree, so Klipper updates leave it alone; Moonraker is not
involved. A <strong>Phrozen update is the dangerous one</strong> — it
replaces <code>printer.cfg</code> wholesale, which would put the piezo
config back while a Beacon sits on the toolhead, and the next
<code>G28</code> would drive Z down waiting for a trigger that cannot
come. So Beacon mode is re-applied by the <code>ExecStartPre</code>
config guard on every Klipper start, keyed off a marker file, before
klippy parses anything. A copy of your <code>beacon.cfg</code> is kept
outside <code>printer_data/</code> for the same reason.</p>
<p><strong>First steps after switching</strong> (in Mainsail/Fluidd, not
on the display): <code>STEPPER_BUZZ</code> both Z steppers →
<code>G28</code> → <code>Z_TILT_ADJUST</code> → <code>BEACON_CAL</code>
(contact auto-calibration) → <code>BEACON_MESH</code> (re-scan the mesh
— the saved one was probed with the piezo).</p>
</details>
<p><a id="sensorless-xy-homing--a-repair-option-not-an-upgrade"></a></p>
<h2 id="sensorless-xy-homing-a-repair-option-not-an-upgrade">Sensorless
XY homing — a repair option, not an upgrade</h2>
<details>
<summary>
Show how sensorless homing works, and when to use it
</summary>
<p><code>scripts/sensorless_toggle.sh status|on|off</code> · setup menu
→ <strong>s</strong></p>
<p>X and Y stop by detecting motor load (Trinamic StallGuard) instead of
by a microswitch. Z is untouched and keeps its load-cell probe.</p>
<p><strong>The microswitches remain the default and the
recommendation.</strong> They stop at the same physical place every
time, for free, with nothing to tune. If your switches work, leave this
off.</p>
<p>What makes it worth shipping is one specific failure: X’s microswitch
hangs off the <strong>toolhead</strong> MCU while the driver’s DIAG line
goes to the <strong>main</strong> MCU. A broken toolhead cable therefore
kills the switch but not the sensorless path — the printer homes again
without waiting for a spare part.</p>
<p>Proven on hardware here: <code>G28 X</code>, <code>G28 Y</code> and a
full <code>G28</code> all home on StallGuard, and the disconnected
switches still <strong>click</strong> at the end of the move. Note that
<code>G28 X</code> brings Y to its endstop and clear first, on switches
and on StallGuard alike — see <em>Homing a single axis</em> below. The
click is the point — the stall happens <em>at</em> the mechanical stop,
so the zero does not shift and the filament cutter (X=319), the wipe
position (Y=322) and any saved mesh stay valid.</p>
<p><code>on</code> equalises the two homing speeds, installs a
<code>sensorless.cfg</code> that gates StallGuard by velocity, and rolls
everything back if Klipper does not come up. It levels the speeds
<em>down</em>, never up: StallGuard’s reading is velocity-dependent, so
two axes at different speeds cannot share one sensitivity.
<code>off</code> puts the endstop and homing-speed lines back exactly as
they were, and removes the include — verified against the toggle’s own
backup. It edits those lines and nothing else, so anything else in
<code>printer.cfg</code> is carried through both directions untouched. A
Phrozen update replaces <code>printer.cfg</code>. So while sensorless
mode is enabled, the kit re-applies it before every Klipper start.
Otherwise the update would hand you back the dead switch you switched
away from.</p>
<blockquote>
<h3 id="read-this-before-switching-1">⚠️ Read this before switching</h3>
<p><strong>1. Watch the first few homings, with <code>M112</code> in
reach.</strong> Wrong sensitivity means the carriage grinds into the
rail instead of stopping, and on CoreXY that drags the other axis along.
Listen for the switch to click: Klipper reports position <code>0</code>
whether it reached the wall or tripped 2 mm in, so the sound is the only
honest signal you have.</p>
<p><strong>2. Sensitivity is <code>driver_SGT</code>, and the scale is
backwards from intuition — LOWER is MORE sensitive.</strong> Grinds
without stopping → lower it. Stops early with no click → raise it. The
shipped <code>1</code> is what this hardware wanted at 30 mm/s and 1.2
A.</p>
<p><strong>3. Calibrate at your running current.</strong> A value found
at a reduced current does not transfer. With too little current the
motor <em>slips</em> instead of building the load StallGuard measures,
so nothing triggers at all — which looks exactly like “sensorless does
not work on this machine”.</p>
</blockquote>
</details>
<h2 id="homing-a-single-axis">Homing a single axis</h2>
<details>
<summary>
Show the single-axis homing detail
</summary>
<p><code>G28 X</code> moves Y first. That is deliberate, and it is worth
knowing before it surprises you: Y travels to its endstop and then 50 mm
clear, and only then does X home. <code>G28 Y</code> homes Y alone and
leaves X where it is. A plain <code>G28</code> is unchanged — same full
sequence, same probe.</p>
<p>The reason is a crash reported from a printer. Park the toolhead at
the back, restart the firmware, send <code>G28 X</code>, and the head is
dragged sideways through the wipe unit at Y=322 on its way to the X
endstop — confirmed on the machine it happened to. Two things make that
possible. Phrozen’s homing section is declared <code>axes: z</code>, so
Klipper never routed a single-axis home through it and the Y-first order
it already contained was skipped. And a firmware restart leaves the
printer looking homed. Instead of clearing the position, it declares
one, so Klipper believes the head sits at the middle of the bed no
matter where it really is, and nothing refuses the move.</p>
<p>Y is <em>homed</em> rather than nudged forward a fixed distance
because a homing move watches the endstop while it travels. A plain move
does not, and no fixed distance can know how far back the head
started.</p>
<p>Same behaviour on microswitches and on StallGuard.</p>
<p><strong>One thing this does not fix:</strong> Z. After a firmware
restart the declared height is an assumption, not a measurement, so
<strong>home before you move Z</strong>. The declaration is deliberately
set to the bottom of the travel, so Klipper refuses anything more than 5
mm downward until a real home. It gives you no protection upward: a
large upward move is still yours to get wrong. <code>G28</code> works
from anywhere and settles it.</p>
</details>
<h2 id="themes-optional">Themes (optional)</h2>
<details>
<summary>
Show the theme options
</summary>
<p>An electric-cobalt comic theme matching the Arco Unleashed branding —
navy glass panels, halftone-burst background, the bookworm logo + a
Burst “U” favicon.</p>
<ul>
<li><strong>Mainsail</strong> — <a
href="mainsail-theme/"><code>mainsail-theme/</code></a>, light / dark +
a switcher. Full details in its <a
href="mainsail-theme/README.md">README</a>.</li>
<li><strong>Fluidd</strong> — <a
href="fluidd-theme/"><code>fluidd-theme/</code></a>, the same look
ported (both apps are Vuetify, so it is the same design, not a
lookalike). Install with
<code>bash fluidd-theme/setup-fluidd-theme.sh</code>, then reload with
<strong>Ctrl+F5</strong> and pick the dark theme. Fluidd has no hook for
a custom logo or favicon, so those stay its own.</li>
</ul>
<p>Mainsail can’t add <em>named</em> themes to its dropdown (that needs
a Mainsail fork/rebuild, which breaks on every update), so the kit ships
<strong>two <code>.theme</code> variants + a switcher</strong> instead —
update-safe:</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>Variant</th>
<th>Base</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Voron Light</strong></td>
<td>navy <code>#070E1F</code> (default)</td>
</tr>
<tr>
<td><strong>Voron Dark</strong></td>
<td>near-black <code>#02050c</code> (same accents / logo / favicon)</td>
</tr>
<tr>
<td><strong>Stock</strong></td>
<td>theme off (plain Mainsail)</td>
</tr>
</tbody>
</table>
<p>Switch over SSH with
<code>sh ~/printer_data/config/unleashed-theme.sh next</code>, which
cycles light → dark → stock. Or switch with one click in the
<strong>Macros panel</strong> via <code>SWITCH_THEME</code> (needs the
<code>gcode_shell_command</code> extension;
<code>setup-theme-macros.sh</code> wires it up). Hard-reload after
switching (<strong>Ctrl+F5</strong>). The active state is kept in
<code>.theme-state</code> and survives reboots. Note: the
<code>.theme</code> overlay is global, so it also tints the built-in
themes — keeping those pristine would need a Mainsail fork (out of
scope, not update-safe).</p>
<p><a id="orcaslicer--multicolor--ams-auto-mode"></a></p>
</details>
<h2 id="orcaslicer-multicolor-ams-auto-mode">OrcaSlicer — multicolor
& AMS auto-mode</h2>
<details>
<summary>
Show how the auto-mode works, and the one thing to watch
</summary>
<p>The Arco is a single-nozzle multicolor printer (filament-swap, like a
Bambu AMS).</p>
<p><strong>You need exactly one OrcaSlicer profile.</strong> Not one for
AMS and one without, and nothing to switch before you slice. Slice
single-colour or multicolour as the model needs, send it, and the
printer picks the right AMS mode at print start by itself.</p>
<p>That works because the printer makes the decision, not the slicer. It
decides from two things: <strong>what you sliced</strong> — one filament
or several, which the start G-code passes through — and <strong>whether
an AMS is attached</strong>, which the printer remembers.</p>
<p><strong>Nothing to set, not even when the hardware changes.</strong>
Attaching or removing the AMS used to need a command; it does not any
more. The unit is a USB serial device, the printer watches for it, and
the flag OrcaSlicer reads follows within seconds — no restart, no menu,
nothing to remember. <code>FILA_STATUS</code> shows what the printer
currently thinks, if you want to check.</p>
<p>The flag lives in <code>[save_variables]</code>, so it survives
reboots and updates, and <code>arco_tool_gate</code> keeps it honest:
<code>T1</code>–<code>T15</code> are registered exactly while an AMS is
attached. There is one case it will not act on: a running print. If a
unit drops off the bus mid-job, the tools and the flag stay as they are
until the job has finished. Taking either away underneath a multicolour
print is worse than a stale reading.</p>
<p><strong>Profile.</strong> Stock OrcaSlicer already ships the official
<strong>Phrozen Arco</strong> profile (vendor <code>Phrozen</code>, no
fork needed). The kit adds an enhanced variant in <a
href="orca/"><code>orca/</code></a> with the Machine G-code already
filled in — import it via <em>File → Import → Import Configs…</em>. To
set the fields by hand instead, or to check an older profile against the
current one, go to <strong><a href="MANUAL.html#machine-gcode">MANUAL ›
Step 9</a></strong>. It gives all four G-code fields in full, with a
screenshot of the tab each belongs in.</p>
<p>All of that happens inside the start G-code:
<code>PHROZEN_AMS_START</code> reads the flag and the print begins in
the right mode. Nothing to pick, nothing to remember — and if you slice
multicolour with no AMS attached, it stops and says so rather than
starting something it cannot finish.</p>
<p>One thing does <strong>not</strong> announce itself, though: with the
AMS fitted and a single-colour slice, the printer runs an
<strong>endless spool</strong> and refills from the other slots when one
runs out. <strong>Load them with the same colour</strong> — otherwise a
long print changes shade partway through, and nothing warns you.</p>
<p>The start G-code heats the <strong>bed straight to print
temperature</strong> and holds the <strong>nozzle at a probe-safe 140
°C</strong> through home and probe, so it cannot ooze onto the load
cell. <strong><code>G30</code></strong> then loads your saved
<code>phrozen</code> mesh instantly — calibrating and saving it the
first time, if none exists yet. Homing is automatic. It needs the
<code>auto_mode</code> and <code>ams</code> features in
<code>AddOn.cfg</code>, both on by default, and the
<code>gcode_shell_command</code> extension.</p>
</details>
<h3 id="adaptive-bed-mesh-optional">Adaptive bed mesh (optional)</h3>
<details>
<summary>
Show what it costs and what it leaves behind
</summary>
<p>Instead of loading the saved full-bed mesh, Klipper can probe
<strong>only the print area</strong> on each print. You trade the
instant <code>G30</code> load for <strong>30–60 s of probing per
print</strong>, and get a mesh measured where the part actually sits.