Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Firmware/simulator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ One row per day, in short; the details are in the sections of this file (the lin

| Date | What changed |
|---|---|
| 13 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.7): the measured noses of the Maxxum (1 m), the Farmall (0.85 m) and the Puma (1.1 m), the boom 2.1 m ahead, Renato's one-axle manure spreader ([the page](#set-up-agopenweb-from-your-measures)). |
| 13 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.8): measured noses (Maxxum 1 m, Farmall 0.85 m, Puma 1.1 m), the boom 2.1 m ahead, Renato's one-axle manure spreader, his centre-pivot mower ([the page](#set-up-agopenweb-from-your-measures)). |
| 12 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.5): buttons for Renato's Farmall 115C, Maxxum 135 and Puma 180; a drawbar implement takes the tractor's pin ([the page](#set-up-agopenweb-from-your-measures)). [Action](#how-it-is-built) on `ubuntu-26.04`. |
| 11 Nov 2026 | `build.py` leaves the pages' own build date (`PAGE_BUILT`) empty, so the pages' new "is this the running firmware's page" check stays off here. The pretend Keya reports its current in amps, the kickout sensor. |
| 10 Nov 2026 | Teensy page: the pretend UM982 reports its temperature (59 °C, from `HWSTATUSA`) and the module's name on the network reads `AiO-3F2A`, as the firmware now does. |
Expand Down Expand Up @@ -65,7 +65,7 @@ To run it on your own computer: `python3 Firmware/simulator/build.py` and open `

## Set up AgOpenWeb from your measures

**https://renatorgr.github.io/Boards/aow-settings/** is not a module page: a calculator. Choose the machine (a tractor, an articulated one that bends at its joint, a harvester steered from the back, each with its own turning geometry), type its wheelbase, the angle on the stop and the overhang, and the implement as AgOpenWeb's Tool page has it (front fixed, rear fixed, trailing or TBT, the sections and their width, the overlap, the tool offset, the hitch, trailing hitch and pivot distances, the implement length), and it suggests what to put in AgOpenWeb's Vehicle & Tool page, each value with its reason, and draws the turn from above: the U-turn radius, the turn style and the rows to skip, the distance from boundary, the headland width, the extension, the Go around radius and the tramline passes. Three tractor buttons, by power, fill in Renato's Case IH Farmall 115C (2.3 m, about 45°, 540/65 R34 tyres, its drawbar pin 0.74 m behind the rear axle), his Maxxum 135 (2.7 m, 42°) and his Puma 180 CVX (2.88 m and 33° from its manual's turning circle, 2 m track, 650/65 R42 tyres, its pin 0.9 m back, its front quick hitch 1.1 m ahead of the front axle); an implement on the drawbar moves to the chosen tractor's pin. It opens on the Maxxum with his 8 m sprayer on the front linkage, the boom 2.1 m ahead of the front axle; a second button fills in his semi-mounted 3 m no-till drill (its pivot behind the lower links, its wheels behind the discs). Renato's manure spreader has one axle 4.2 m behind the drawbar pin and its body ends 1.5 m past the axle. Two more buttons have typical measures: a trailed disc harrow and a 4-furrow reversible plough on the 3-point linkage, drawn with a K-turn since a plough skips no rows. A long implement's rear corner (its length) is followed through the turn too: a K-turn backs it towards the edge first. A trailed implement's drawbar must stay off the rear tyres: from the hitch pin, the drawbar's width, the rear track and the tyres' width and height, the page finds the angle where the drawbar touches a tyre and keeps the turn 5° under it; the tyre counts at the drawbar's height (a field, 0.5 m by default), where it is shorter than at its axle, so the drawbar touches it later than the whole wheel would say. A drawbar pin inside the tyres' back edge touches them long before 90° and then sets the radius; a semi-mounted implement's pivot, further back, does not, but its own stop may: a field takes the most the drawbar may turn to each side, from its stop or from what the farmer knows. Two more buttons hold Renato's quick disc harrow on the 3-point linkage and his semi-mounted roller (120° of swing in all), their measures guessed until he takes them. A rigid implement is measured with a tape from the axle nearest to it (a front sprayer from the front axle); AgOpenWeb measures it from the pivot, so for a front implement on a tractor the page adds the wheelbase and shows the hitch length to type in.
**https://renatorgr.github.io/Boards/aow-settings/** is not a module page: a calculator. Choose the machine (a tractor, an articulated one that bends at its joint, a harvester steered from the back, each with its own turning geometry), type its wheelbase, the angle on the stop and the overhang, and the implement as AgOpenWeb's Tool page has it (front fixed, rear fixed, trailing or TBT, the sections and their width, the overlap, the tool offset, the hitch, trailing hitch and pivot distances, the implement length), and it suggests what to put in AgOpenWeb's Vehicle & Tool page, each value with its reason, and draws the turn from above: the U-turn radius, the turn style and the rows to skip, the distance from boundary, the headland width, the extension, the Go around radius and the tramline passes. Three tractor buttons, by power, fill in Renato's Case IH Farmall 115C (2.3 m, about 45°, 540/65 R34 tyres, its drawbar pin 0.74 m behind the rear axle), his Maxxum 135 (2.7 m, 42°) and his Puma 180 CVX (2.88 m and 33° from its manual's turning circle, 2 m track, 650/65 R42 tyres, its pin 0.9 m back, its front quick hitch 1.1 m ahead of the front axle); an implement on the drawbar moves to the chosen tractor's pin. It opens on the Maxxum with his 8 m sprayer on the front linkage, the boom 2.1 m ahead of the front axle; a second button fills in his semi-mounted 3 m no-till drill (its pivot behind the lower links, its wheels behind the discs). Renato's manure spreader has one axle 4.2 m behind the drawbar pin and its body ends 1.5 m past the axle. His 3.2 m centre-pivot mower conditioner, on the lower links with its swivel between the rear tyres and swung in the turn, presses the Farmall it works with. Two more buttons have typical measures: a trailed disc harrow and a 4-furrow reversible plough on the 3-point linkage, drawn with a K-turn since a plough skips no rows. A long implement's rear corner (its length) is followed through the turn too: a K-turn backs it towards the edge first. A trailed implement's drawbar must stay off the rear tyres: from the hitch pin, the drawbar's width, the rear track and the tyres' width and height, the page finds the angle where the drawbar touches a tyre and keeps the turn 5° under it; the tyre counts at the drawbar's height (a field, 0.5 m by default), where it is shorter than at its axle, so the drawbar touches it later than the whole wheel would say. A drawbar pin inside the tyres' back edge touches them long before 90° and then sets the radius; a semi-mounted implement's pivot, further back, does not, but its own stop may: a field takes the most the drawbar may turn to each side, from its stop or from what the farmer knows. Two more buttons hold Renato's quick disc harrow on the 3-point linkage and his semi-mounted roller (120° of swing in all), their measures guessed until he takes them. A rigid implement is measured with a tape from the axle nearest to it (a front sprayer from the front axle); AgOpenWeb measures it from the pivot, so for a front implement on a tractor the page adds the wheelbase and shows the hitch length to type in.

The rules are AgOpenWeb's own (its `SagittaTurnGeometry`, `YouTurnCreationService` and `VehicleToolLimits`): the turn is drawn by the tractor's pivot, which must stay inside the field edge pulled in by the distance from boundary; a pass closer than twice the radius needs a loop (Sagitta or Keyhole), skipped rows or a K-turn (AgOpenWeb drives a 126° arc and a straight tail; as soon as the tractor reverses the turn is over for AgOpenWeb and its guidance is on the next pass, backing up too, so the tractor backs up until it is on that pass and straight; a trailed implement that would jackknife backing up gets no K-turn), a pass at twice the radius or more gets a plain semicircle. The radius is 1.2 × the tightest the machine can do (wheelbase ÷ tan of the steering angle; an articulated machine (wheelbase ÷ 2) ÷ tan of half the articulation angle), never under 4 m; the distance from boundary keeps what sweeps the widest in the turn, the outer corner of the tractor's nose (half the machine's width, from its rear track and tyres, out from the centre line) or the implement's outer end, a safety margin inside the edge (1 m by default, a field of the page: more where the edge is irregular); each turn is followed step by step every 10 cm, with the implement (a trailed one following its hitch without side slip) and the machine's far end, and the headland is the turn's depth plus that distance plus how far back into the field anything not yet straight on a pass reaches (the implement finishing its pass, a front implement or a trailed one until it is straight on the next pass, a K-turn's tail), in whole passes. The drawing shows the pivot's path, both ends of the implement and the outer corner of the machine's far end. What is not geometry (the section timing, the steering gains, the antenna position) is not suggested.

Expand Down
19 changes: 13 additions & 6 deletions Firmware/simulator/aow-settings/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="dark light">
<title>Set up AgOpenWeb from your measures</title>
<script src="settings.js?v=1.7"></script> <!-- the version in the address: a browser that kept the old file fetches the new one -->
<script src="settings.js?v=1.8"></script> <!-- the version in the address: a browser that kept the old file fetches the new one -->
<style>
:root{color-scheme:dark;--bg:#121511;--card:#1b1f1a;--ink:#e7ebe3;--mute:#9aa395;--line:#2e352b;--warn:#ffb74d;--acc:#8cc068;--accInk:#10140f;--soft:#232a21;--pass:#4a5a44;--fence:#e06c5a;--tool:#6aa4d9}
@media (prefers-color-scheme:light){:root{color-scheme:light;--bg:#f2f4ef;--card:#ffffff;--ink:#1c2318;--mute:#5f6b5a;--line:#d4dbcf;--warn:#b45309;--acc:#4c7d2a;--accInk:#ffffff;--soft:#e9eee5;--pass:#b9c7b1;--fence:#c0392b;--tool:#2f6fb0}}
Expand Down Expand Up @@ -97,6 +97,7 @@
<button type="button" data-name="sprayer" onclick="preset('sprayer')">8 m sprayer, front</button>
<button type="button" data-name="drill" onclick="preset('drill')">3 m no-till drill, semi-mounted</button>
<button type="button" data-name="spreader" onclick="preset('spreader')">10 m manure spreader, one axle</button>
<button type="button" data-name="mower" onclick="preset('mower')">3.2 m centre-pivot mower conditioner</button>
<button type="button" data-name="harrow" onclick="preset('harrow')">4 m disc harrow, trailed</button>
<button type="button" data-name="plough" onclick="preset('plough')">4-furrow reversible plough</button>
<button type="button" data-name="quickHarrow" onclick="preset('quickHarrow')">2.7 m quick disc harrow, 3-point</button>
Expand Down Expand Up @@ -132,6 +133,7 @@ <h2>Implement</h2>
<div class="row" data-for="trailed"><label for="drawbar" id="drawbarLabel">Trailing hitch (m)<small>hitch pin (or pivot) to the implement's wheels; with two axles close together, to the middle between them</small></label><input id="drawbar" type="number" step="0.1" min="0.1" value="2"></div>
<div class="row" data-for="trailed"><label for="drawbarWidth">Drawbar width (m)<small>its widest in the first metre behind the hitch, where it can reach the rear tyres</small></label><input id="drawbarWidth" type="number" step="0.05" min="0" value="0.3"></div>
<div class="row" data-for="trailed"><label for="swingDeg">Most the drawbar may turn (°)<small>to each side, against the tractor: a semi-mounted pivot's stop (half its whole swing), or what you know your drawbar takes; 0 = from the rear tyres only</small></label><input id="swingDeg" type="number" step="1" min="0" max="180" value="0"></div>
<div class="row" data-for="trailed"><label for="turnSwingDeg">Swing in the turn (°)<small>a centre-pivot implement, such as a mower: how far you swing it against its drawbar in the turn, so the drawbar folds less; 0 = held straight</small></label><input id="turnSwingDeg" type="number" step="1" min="0" max="60" value="0"></div>
<div class="row" data-for="trailed"><label for="foldClearanceDeg">Room kept before it touches (°)<small>the turn's circle folds the drawbar this much less than the angle where it touches a tyre or its stop: 5° is about 5 to 8 cm at the tyre</small></label><input id="foldClearanceDeg" type="number" step="1" min="0" max="45" value="5"></div>
<div class="row" data-for="trailed"><label for="pivotToTool">Pivot distance (m)<small>the implement's wheels to the working line; behind them = positive, ahead (wheels at the back) = negative</small></label><input id="pivotToTool" type="number" step="0.1" value="0"></div>
<div class="row" data-for="notFront"><label for="length">Implement length (m)<small>from its attachment (the 3-point hitch, or its own axle when trailed) to its rearmost point; 0 = not known</small></label><input id="length" type="number" step="0.1" min="0" value="0"></div>
Expand Down Expand Up @@ -160,7 +162,7 @@ <h3>Every turn AgOpenWeb can make here, the smallest headland first</h3>
"use strict";
const $ = id => document.getElementById(id);
const F = ["machine", "wheelbase", "steer", "overhang", "mount", "sections", "sectionWidth", "width", "overlap", "offset", "axleToTool", "hitch", "tankHitch", "drawbar", "pivotToTool", "length", "sprayerWidth", "margin",
"trackWidth", "tyreWidth", "wheelDiameter", "drawbarHeight", "drawbarWidth", "swingDeg", "foldClearanceDeg"];
"trackWidth", "tyreWidth", "wheelDiameter", "drawbarHeight", "drawbarWidth", "swingDeg", "turnSwingDeg", "foldClearanceDeg"];
const LABELS = { // what the angle and the overhang are on each machine, and which axle is the pivot
tractor: ["Maximum steering angle (°)", "the front wheels on the stop, what the steer wizard measured", "Front overhang (m)", "front axle to the nose, weights included"],
articulated: ["Maximum articulation angle (°)", "how far the machine bends at its joint, on the stop", "Front overhang (m)", "front axle to the nose"],
Expand All @@ -184,14 +186,16 @@ <h3>Every turn AgOpenWeb can make here, the smallest headland first</h3>
note: "Renato's Case IH Farmall 115C: 2.3 m wheelbase, 1.7 m rear track, 540/65 R34 rear tyres, the drawbar pin 0.74 m behind the rear axle, its nose 0.85 m ahead of the front axle. About 45° of steering, by eye until a wheel angle sensor measures it: any angle over 35° gives the same turn, AgOpenWeb's 4 m floor."}
};
const PRESETS = {
// the example buttons: Renato's sprayer, drill and manure spreader, measured; a disc harrow and a plough with typical measures; his quick harrow and roller, guessed. `note`: shown under the buttons;
// the example buttons: Renato's sprayer, drill and manure spreader, measured; his centre-pivot mower conditioner (`tractor`: the button pressed with it), measured; a disc harrow and a plough with typical measures; his quick harrow and roller, guessed. `note`: shown under the buttons;
// `turn`: the turn option drawn first (a plough cannot skip rows); `onDrawbar`: its hitch is the tractor's drawbar pin
sprayer: {mount: "front", sections: 8, sectionWidth: 100, width: 8, overlap: 0, offset: 0, axleToTool: 2.1, hitch: 1, length: 0, sprayerWidth: 8,
note: "Measured on Renato's sprayer: the 8 m boom on the front quick hitch (1.1 m ahead of the front axle), 2.1 m ahead of the front axle."},
drill: {mount: "trailed", sections: 19, sectionWidth: 15.8, width: 3, overlap: -0.05, offset: 0, hitch: 1.54, drawbar: 4.15, pivotToTool: -1.6, drawbarWidth: 0.3, swingDeg: 0, length: 0, sprayerWidth: 8,
note: "Measured on Renato's no-till drill: semi-mounted, its pivot 1.54 m behind the rear axle, its wheels 4.15 m behind the pivot and the discs 1.6 m ahead of the wheels. Its pivot is behind the rear tyres' back edge, so the tyres do not limit its turn; its own headstock or stop does: watch how far it folds and type that in 'Most the drawbar may turn'. It never backs up in the ground: no K-turn."},
spreader: {mount: "trailed", onDrawbar: true, sections: 1, sectionWidth: 1000, width: 10, overlap: 0, offset: 0, drawbar: 4.2, pivotToTool: 1.5, drawbarWidth: 0.3, swingDeg: 0, length: 1.5, sprayerWidth: 0,
note: "Renato's manure spreader: one axle 4.2 m behind the drawbar pin, the body 1.5 m past the axle with the beaters at its back; it spreads 10 m wide. On the tractor's drawbar, its pin (the tractor button's) near the rear tyres' back edge: the drawbar touches a tyre before 90° (at the drawbar's height, where the tyre is shorter than at its axle), and that sets the radius."},
mower: {mount: "trailed", tractor: "farmall", sections: 1, sectionWidth: 320, width: 3.2, overlap: 0.1, offset: 0, hitch: 0.5, drawbar: 6.5, pivotToTool: -2, drawbarWidth: 0.3, swingDeg: 0, turnSwingDeg: 20, length: 0, sprayerWidth: 0,
note: "Renato's centre-pivot mower conditioner, used with the Farmall (its button is pressed with it), on the lower links. Measured: its swivel 0.5 m behind the rear axle, between the rear tyres, the wheels 6.5 m behind the swivel, the discs 2 m ahead of the wheels. Held straight, the tongue would touch a tyre at 54.5° and need a 9.1 m radius; swung against the tongue in the turn (20° guessed until he measures it), the tongue folds less and its own length sets the radius. 10 cm of overlap so no strip is left standing. Mowing back and forth it swings to the uncut side, the other side of the tractor every pass: leave the tool offset at 0 (it is drawn in the middle)."},
harrow: {mount: "trailed", onDrawbar: true, sections: 1, sectionWidth: 400, width: 4, overlap: 0.2, offset: 0, drawbar: 3.5, pivotToTool: 0, drawbarWidth: 0.3, swingDeg: 0, length: 1.5, sprayerWidth: 0,
note: "Typical measures, change them to yours: on the tractor's drawbar, its pin (the tractor button's) near the rear tyres' back edge; the wheels between the front and the rear gangs, 20 cm of overlap so no strip is missed. With its wheels at the back (a roller), the discs are ahead of them: a negative pivot distance. A semi-mounted harrow's hitch is its pivot, further back."},
plough: {mount: "rear", sections: 1, sectionWidth: 160, width: 1.6, overlap: 0, offset: 0, axleToTool: 3, hitch: 1, length: 4.5, sprayerWidth: 0, turn: "kturn0",
Expand All @@ -207,9 +211,12 @@ <h3>Every turn AgOpenWeb can make here, the smallest headland first</h3>

function preset(name) {
const p = PRESETS[name];
for (const [k, v] of Object.entries(p)) if (k !== "turn" && k !== "note" && k !== "onDrawbar") $(k).value = v;
for (const [k, v] of Object.entries(p)) if (!["turn", "note", "onDrawbar", "tractor"].includes(k)) $(k).value = v;
$("turnSwingDeg").value = p.turnSwingDeg || 0; // only a centre-pivot implement is swung in the turn
implementName = name; $("presetNote").textContent = p.note || ""; chosen = p.turn || "";
if (p.tractor && p.tractor !== tractorName) return tractor(p.tractor); // the tractor it works with: tractor() puts it on that drawbar
if (p.onDrawbar) $("hitch").value = TRACTORS[tractorName].pin;
implementName = name; $("presetNote").textContent = p.note || ""; chosen = p.turn || ""; marks(); update();
marks(); update();
}
function tractor(name) {
const t = TRACTORS[name];
Expand All @@ -229,7 +236,7 @@ <h3>Every turn AgOpenWeb can make here, the smallest headland first</h3>
sections: n("sections") || 0, sectionWidth: n("sectionWidth") || 0, overlap: n("overlap") || 0, offset: n("offset") || 0, axleToTool: n("axleToTool"), hitchLength: n("hitch"),
tankHitch: n("tankHitch"), drawbar: n("drawbar"), pivotToTool: n("pivotToTool"), length: n("length") || 0, sprayerWidth: n("sprayerWidth") || 0, margin: n("margin"),
trackWidth: n("trackWidth"), tyreWidth: n("tyreWidth"), wheelDiameter: n("wheelDiameter"), drawbarHeight: n("drawbarHeight") || 0, drawbarWidth: n("drawbarWidth") || 0, swingDeg: n("swingDeg") || 0,
foldClearanceDeg: n("foldClearanceDeg")};
turnSwingDeg: n("turnSwingDeg") || 0, foldClearanceDeg: n("foldClearanceDeg")};
}
function update() {
labels();
Expand Down
Loading