docs: sync control source to AK60 RPi5 BiSS-C

This commit is contained in:
Nick Hermes
2026-07-06 10:21:23 +00:00
parent edb8648f78
commit 5883620f73
18 changed files with 32083 additions and 31969 deletions

View File

@@ -19,7 +19,7 @@ Normand can operate the polisher manually from the touchscreen, with:
- safe force/table/spindle control, including clockwise/counter-clockwise toolhead rotation selection; - safe force/table/spindle control, including clockwise/counter-clockwise toolhead rotation selection;
- KWR75B-CAN force/torque sensor integration; - KWR75B-CAN force/torque sensor integration;
- ODrive S1 + M8325s spindle drive integration; - CubeMars AK60-6 V1.1 KV80 spindle actuator integration;
- Teensy-side fast safety and setpoint/telemetry loop; - Teensy-side fast safety and setpoint/telemetry loop;
- host-side state machine, logs, status, and data export; - host-side state machine, logs, status, and data export;
- synchronized telemetry at **>=100 Hz**; - synchronized telemetry at **>=100 Hz**;
@@ -60,7 +60,7 @@ tests/ Host-side contract/state-machine tests
## Current source alignment ## Current source alignment
Generated: 2026-05-26. This foundation is a repo scaffold and implementation aid, Generated: 2026-05-26. Source-refresh: 2026-07-06 for Raspberry Pi 5, AK60, and ordered BiSS-C encoders. This foundation is a repo scaffold and implementation aid,
not a replacement for the approved P11 source specifications. If this repo and not a replacement for the approved P11 source specifications. If this repo and
the source specs disagree, ask Antoine before changing architecture, safety, the source specs disagree, ask Antoine before changing architecture, safety,
telemetry contracts, or scope. telemetry contracts, or scope.

View File

@@ -22,7 +22,7 @@
- [ ] Host↔Teensy serial link with ACK/NACK and CRC. - [ ] Host↔Teensy serial link with ACK/NACK and CRC.
- [ ] KWR75B-CAN receive path with measured sample rate and stale-frame watchdog. - [ ] KWR75B-CAN receive path with measured sample rate and stale-frame watchdog.
- [ ] Encoder acquisition for table and arm. - [ ] Encoder acquisition for table and arm.
- [ ] ODrive command/telemetry interface selected and documented, including sign mapping for `cw`/`ccw` physical tool rotation. - [ ] AK60 command/telemetry interface selected and documented, including direction mapping for `cw`/`ccw` physical tool rotation.
- [ ] Force actuator command path selected and documented. - [ ] Force actuator command path selected and documented.
## Phase 3 — Manual mode MVP ## Phase 3 — Manual mode MVP

View File

@@ -11,7 +11,7 @@ Build the machine-side control stack for the Fullum swing-arm polisher so Norman
3. Stable host↔Teensy setpoint + telemetry protocol. 3. Stable host↔Teensy setpoint + telemetry protocol.
4. KWR75B-CAN force/torque acquisition and stale-frame detection. 4. KWR75B-CAN force/torque acquisition and stale-frame detection.
5. Table/arm encoder acquisition and synchronized timestamps. 5. Table/arm encoder acquisition and synchronized timestamps.
6. ODrive spindle command/telemetry path. 6. AK60 spindle command/telemetry path, including CAN topology and safety power-removal assumptions.
7. Run/manual logs and `/data/` file layout. 7. Run/manual logs and `/data/` file layout.
8. Controller-job intake dry-run for future program execution. 8. Controller-job intake dry-run for future program execution.

View File

@@ -7,7 +7,7 @@
- Host↔Teensy command/telemetry protocol. - Host↔Teensy command/telemetry protocol.
- KWR75B-CAN force/torque sensor integration. - KWR75B-CAN force/torque sensor integration.
- Table and arm encoder acquisition. - Table and arm encoder acquisition.
- ODrive S1 + M8325s spindle control/telemetry path. - CubeMars AK60-6 V1.1 KV80 spindle control/telemetry path.
- Force actuator command path and tool-weight compensation. - Force actuator command path and tool-weight compensation.
- Synchronized telemetry at >=100 Hz. - Synchronized telemetry at >=100 Hz.
- Manual-session logs and raw telemetry CSV. - Manual-session logs and raw telemetry CSV.

View File

@@ -43,7 +43,7 @@ Requirements:
- `cw` — clockwise - `cw` — clockwise
- `ccw` — counter-clockwise - `ccw` — counter-clockwise
Physical convention: direction is observed from above the toolhead looking down toward the mirror/tool contact. The ODrive sign mapping is a commissioning item and must be configured so UI/protocol values match physical rotation. Direction changes are explicit setpoint changes; do not infer direction from a signed RPM. RPM remains a non-negative magnitude. Physical convention: direction is observed from above the toolhead looking down toward the mirror/tool contact. The AK60 direction mapping is a commissioning item and must be configured so UI/protocol values match physical rotation. Direction changes are explicit setpoint changes; do not infer direction from a signed RPM. RPM remains a non-negative magnitude.
## v1 production subset ## v1 production subset

View File

@@ -19,14 +19,18 @@
## Drive bring-up ## Drive bring-up
- [ ] ODrive runtime interface selected and documented. - [ ] AK60 runtime interface selected and documented.
- [ ] ODrive enable/disable/fault reset path verified. - [ ] AK60 enable/disable/fault reset path verified.
- [ ] Spindle RPM command and actual feedback verified. - [ ] Spindle RPM command, actual feedback, direction mapping, and safe ramp/stop behavior verified.
- [ ] Z force actuator command path verified with safe limits. - [ ] Z force actuator command path verified with safe limits.
- [ ] Brake engaged feedback verified if installed. - [ ] Brake engaged feedback verified if installed.
## Safety ## Safety
- [ ] STO channels wired as independent safety channels per SV2A and safety relay manuals.
- [ ] Z brake engages on E-stop, STO/drive fault, controller crash, and power loss with no software dependency.
- [ ] AK60 power removal through the safety-controlled post-contactor bus verified; CAN stop is not treated as safety-rated.
- [ ] E-stop hard circuit tested independent of software state. - [ ] E-stop hard circuit tested independent of software state.
- [ ] Force over-limit response tested. - [ ] Force over-limit response tested.
- [ ] Encoder-loss response tested. - [ ] Encoder-loss response tested.

View File

@@ -3,16 +3,16 @@
## Table interface ## Table interface
- Confirm KBSI-240D opto-isolated interface or replacement. - Confirm KBSI-240D opto-isolated interface or replacement.
- Confirm table encoder transport and transceiver. - Confirm ordered BiSS-C table/arm encoder frame timing, CRC/status bits, RS422 transceiver/pinout, shielding, and startup/error handling.
- Confirm whether the table drive or command path changes electrically. - Confirm whether the table drive or command path changes electrically.
## Spindle / ODrive ## Spindle / AK60
- Define ODrive runtime command and telemetry path; CAN 2.0B at 1 Mbps is preferred unless replaced. - Define AK60 runtime command and telemetry path; freeze CAN topology, IDs, frame rates, stale-frame timeout, startup behavior, and error isolation.
- Define command scaling for velocity, enable/disable, fault reset, and safe stop. - Define command scaling for velocity, direction mapping, enable/disable, fault reset, ramp-to-zero / live-reversal policy, and safe stop behavior.
- Define telemetry subset: actual RPM, drive state/error, DC bus voltage, q-axis current, motor temperature if available. - Define telemetry subset: actual RPM, actuator state/error, bus/supply voltage, torque/current if available, motor/drive temperature if available.
- Export final ODrive config with release. - Export final AK60 commissioning parameters with each machine software release.
- Define spindle enable/fault I/O into HOA + safety chain. - Define spindle enable/fault I/O and the hardwired AK60 power-removal path through HOA + safety chain; prove E-stop/power-loss behavior on bench.
## Z-axis / force actuator ## Z-axis / force actuator

View File

@@ -7,6 +7,7 @@ project: P11-Polisher-Fullum
repo: polisher-control repo: polisher-control
source_truth: false source_truth: false
created: 2026-06-02 created: 2026-06-02
updated: 2026-07-06
privacy: technical-only privacy: technical-only
--- ---
@@ -32,7 +33,7 @@ If this file conflicts with the source specs or with Antoine's explicit directio
- Force setpoint execution and closed-loop Fz control. - Force setpoint execution and closed-loop Fz control.
- Table/spindle/arm-drive command interfaces. - Table/spindle/arm-drive command interfaces.
- KWR75B-CAN force/torque acquisition. - KWR75B-CAN force/torque acquisition.
- ODrive S1 + M8325s spindle integration. - CubeMars AK60-6 V1.1 KV80 spindle actuator integration.
- State machine, pause/resume/abort, faults, alarms, interlocks. - State machine, pause/resume/abort, faults, alarms, interlocks.
- Telemetry, event logs, manual-session logs, run artifacts, and `/data/` layout. - Telemetry, event logs, manual-session logs, run artifacts, and `/data/` layout.
- Conservative machine capability descriptor. - Conservative machine capability descriptor.
@@ -134,7 +135,7 @@ Program execution exists as a contract scaffold and future path, but the v1 prod
3. Stable host ↔ Teensy setpoint and telemetry protocol. 3. Stable host ↔ Teensy setpoint and telemetry protocol.
4. KWR75B-CAN force/torque acquisition and stale-frame detection. 4. KWR75B-CAN force/torque acquisition and stale-frame detection.
5. Table/arm encoder acquisition and synchronized timestamps. 5. Table/arm encoder acquisition and synchronized timestamps.
6. ODrive S1 + M8325s spindle command/telemetry path. 6. AK60 spindle command/telemetry path.
7. Run/manual logs and `/data/` file layout. 7. Run/manual logs and `/data/` file layout.
8. Controller-job intake dry-run for future program execution. 8. Controller-job intake dry-run for future program execution.
@@ -164,11 +165,11 @@ Program execution exists as a contract scaffold and future path, but the v1 prod
These are current project facts unless Antoine/source specs supersede them: These are current project facts unless Antoine/source specs supersede them:
- Real-time controller: **Teensy 4.1**. - Real-time controller: **Teensy 4.1**.
- Host: **Raspberry Pi 4 + touchscreen**. - Host: **Raspberry Pi 5 + touchscreen**.
- Primary process force sensor: **Kunwei KWR75B-CAN**, dedicated CAN link to Teensy through isolated transceiver. - Primary process force sensor: **Kunwei KWR75B-CAN**, dedicated CAN link to Teensy through isolated transceiver.
- Table encoder: **RLS Artos DHR 162 mm**, 20-bit absolute, SSI/RS422 basis. - Table encoder: **RLS Artos DHR 162 mm**, 20-bit absolute, ordered BiSS-C/RS422 basis.
- Arm encoder: **RLS Orbis BR10**, 14-bit absolute, SSI/RS422 basis. - Arm encoder: **RLS Orbis BR10**, 14-bit absolute, ordered BiSS-C/RS422 basis.
- Spindle: **ODrive S1 + M8325s 100KV**, v1 velocity control, CAN 2.0B at 1 Mbps preferred. - Spindle: **CubeMars AK60-6 V1.1 KV80**, v1 velocity control, CAN working basis pending final topology/IDs/rates.
- Z/force actuator: counterweight-biased **AutomationDirect SV2L-210B** servo with **SV2A-2150** drive, torque/current mode to confirm. - Z/force actuator: counterweight-biased **AutomationDirect SV2L-210B** servo with **SV2A-2150** drive, torque/current mode to confirm.
- Z brake: NC 24 VDC electromagnetic brake; engages on E-stop or power loss. - Z brake: NC 24 VDC electromagnetic brake; engages on E-stop or power loss.
- Safety relay: Pilz PNOZ X1 or Banner XS26-2 still needs final selection. - Safety relay: Pilz PNOZ X1 or Banner XS26-2 still needs final selection.
@@ -418,8 +419,8 @@ Use `docs/11-feature-request-intake.md` as the template.
Current control/firmware-facing questions include: Current control/firmware-facing questions include:
- Confirm KBSI-240D / table drive command path or replacement. - Confirm KBSI-240D / table drive command path or replacement.
- Confirm table encoder transport and transceiver choice. - Confirm ordered BiSS-C table/arm encoder frame timing, CRC/status bits, RS422 transceiver/pinout, shielding, and startup/error handling.
- Define ODrive runtime command/telemetry path, scaling, fault reset, safe stop, and config export. - Define AK60 runtime command/telemetry path, scaling, fault reset, ramp/stop policy, safety power-removal behavior, and commissioning parameter export.
- Confirm SV2A-2150 torque/current command mapping, enable/fault wiring, current/Iq monitor path. - Confirm SV2A-2150 torque/current command mapping, enable/fault wiring, current/Iq monitor path.
- Confirm Z limit-switch / hard-stop wiring into safety chain. - Confirm Z limit-switch / hard-stop wiring into safety chain.
- Confirm NC brake coil driver and brake-engaged diagnostic feedback. - Confirm NC brake coil driver and brake-engaged diagnostic feedback.

View File

@@ -40,7 +40,7 @@ Rationale: the controller is not deciding polishing strategy. It is executing/lo
## 4. Affected layers ## 4. Affected layers
- Host controller: normalize/validate direction aliases and include direction in manual setpoints/log events. - Host controller: normalize/validate direction aliases and include direction in manual setpoints/log events.
- Teensy firmware: accept direction in `MANUAL_START`, `SETPOINT`, and future `SEGMENT_START`; map to ODrive command sign. - Teensy firmware: accept direction in `MANUAL_START`, `SETPOINT`, and future `SEGMENT_START`; map to AK60 command direction/sign convention.
- Host ↔ Teensy protocol: add `spindle_direction` / `commanded_spindle_direction` enum values `cw` / `ccw`. - Host ↔ Teensy protocol: add `spindle_direction` / `commanded_spindle_direction` enum values `cw` / `ccw`.
- Telemetry channels: add `spindle_direction_setpoint` and `spindle_direction_actual` as recommended channels. - Telemetry channels: add `spindle_direction_setpoint` and `spindle_direction_actual` as recommended channels.
- Run/manual-session logs: record direction separately from RPM; RPM remains a non-negative magnitude. - Run/manual-session logs: record direction separately from RPM; RPM remains a non-negative magnitude.
@@ -51,8 +51,8 @@ Rationale: the controller is not deciding polishing strategy. It is executing/lo
## 5. Safety implications ## 5. Safety implications
- Direction must not be inferred from signed RPM; use explicit enum plus non-negative RPM magnitude. - Direction must not be inferred from signed RPM; use explicit enum plus non-negative RPM magnitude.
- Direction reversal while spindle is moving should be ramped/handled safely by firmware/ODrive implementation. The scaffold currently defines the contract; Cédric should decide whether live reversal is allowed directly or requires ramp-to-zero before applying the new direction. - Direction reversal while spindle is moving should be ramped/handled safely by firmware/AK60 implementation. The scaffold currently defines the contract; Cédric should decide whether live reversal is allowed directly or requires ramp-to-zero before applying the new direction.
- ODrive sign mapping is a commissioning item: firmware must be configured so UI `cw`/`ccw` matches physical observed tool rotation. - AK60 direction mapping is a commissioning item: firmware must be configured so UI `cw`/`ccw` matches physical observed tool rotation.
Safety decision: Safety decision:
@@ -72,14 +72,14 @@ Safety decision:
- [x] Host contract tests for enum values and alias normalization. - [x] Host contract tests for enum values and alias normalization.
- [x] Schema field test for `commanded_spindle_direction`. - [x] Schema field test for `commanded_spindle_direction`.
- [x] Telemetry channel test for direction channels. - [x] Telemetry channel test for direction channels.
- [ ] Firmware compile/build check once Cédric maps this into Teensy/ODrive code. - [ ] Firmware compile/build check once Cédric maps this into Teensy/AK60 code.
- [ ] Bench test confirms UI `cw` physically rotates clockwise by the documented convention. - [ ] Bench test confirms UI `cw` physically rotates clockwise by the documented convention.
- [ ] Bench test confirms UI `ccw` physically rotates counter-clockwise by the documented convention. - [ ] Bench test confirms UI `ccw` physically rotates counter-clockwise by the documented convention.
- [ ] Bench test confirms live reversal behavior is safe or blocked until spindle reaches zero. - [ ] Bench test confirms live reversal behavior is safe or blocked until spindle reaches zero.
## 8. Open questions ## 8. Open questions
- Cédric: confirm the ODrive command/sign mapping and whether live direction reversal requires ramp-to-zero. - Cédric: confirm the AK60 command/direction mapping and whether live direction reversal requires ramp-to-zero.
- Antoine/Normand: confirm the physical viewing convention: current draft uses “viewed from above the toolhead looking down toward the mirror/tool contact.” - Antoine/Normand: confirm the physical viewing convention: current draft uses “viewed from above the toolhead looking down toward the mirror/tool contact.”
## 9. Implementation notes ## 9. Implementation notes

View File

@@ -0,0 +1,44 @@
---
title: AK60 / Raspberry Pi 5 / BiSS-C Source Sync
status: draft
requested_by: Antoine Letarte
generated_by: Nick / Hermes
project: P11-Polisher-Fullum
repo: polisher-control
source_truth: false
created: 2026-07-06
privacy: technical-only
---
# AK60 / Raspberry Pi 5 / BiSS-C Source Sync
## Purpose
Align the repo foundation with Antoine's accepted hardware corrections before Cédric writes firmware against stale assumptions.
## Source references
- P11 firmware source: `software-suite/control/firmware/Fullum-Polisher-Machine-Control-Firmware-Spec-v1.md`
- Repo mirror: `docs/reference/fullum-control-firmware-spec/Fullum-Polisher-Machine-Control-Firmware-Spec-v1.md`
- Electrical audit TLDR: `2026-07-06-Polisher-Control-Electrical-Audit-TLDR.md`
- Change gate: `CEDRIC-PROP-20260609-001`
## Accepted corrections now reflected here
1. Host computer is **Raspberry Pi 5 + touchscreen**, not Raspberry Pi 4.
2. Toolhead spindle path is **CubeMars AK60-6 V1.1 KV80**, not ODrive S1 + M8325s.
3. Table encoder order is `DHR162DB20BAAS30DA02` + `SAR162C143AF14WAP00`, which means **BiSS-C / RS422**.
4. Arm encoder order is `BR10DCD14B12DH00` + `BM120A190A1ABA00`, which means **BiSS-C / RS422**.
## Cédric implementation cautions
- Do not treat CAN stop/disable as a safety-rated AK60 stop. The safety basis must remove AK60 power through the hardwired safety-controlled post-contactor path and be bench-tested.
- Freeze AK60 CAN topology before firmware lock: IDs, frame rates, stale-frame timeouts, fault handling, startup behavior, and whether AK60 shares a CAN bus with KWR75B.
- Freeze BiSS-C implementation details before encoder firmware lock: frame timing, CRC/status bits, RS422 transceiver/pinout, shielding, and error handling.
- Preserve `cw` / `ccw` as explicit direction enums separate from non-negative RPM; bench-map them to physical rotation.
## Acceptance checks
- Firmware source and repo mirror no longer name ODrive/M8325s as the current spindle basis.
- Repo start docs, LLM context, roadmap, commissioning checklist, open questions, and machine capability profile now use AK60/RPi5/BiSS-C language.
- Host-side tests and JSON validation should still pass after this docs/source refresh.

View File

@@ -2,13 +2,13 @@
#show: atomaste-report.with( #show: atomaste-report.with(
title: "Fullum Polisher Machine Control and Firmware Specification", title: "Fullum Polisher Machine Control and Firmware Specification",
subtitle: "Cédric implementation reference - Draft v1.2", subtitle: "Cédric implementation reference - Draft v1.3",
project: "Polisher Software Suite", project: "Polisher Software Suite",
client: "Optiques Fullum", client: "Optiques Fullum",
doc-number: "ATM-2026-POL-CTRL-001", doc-number: "ATM-2026-POL-CTRL-001",
date: "2026-05-19", date: "2026-07-06",
author: "Antoine Letarte, Eng., M.A.Sc.", author: "Antoine Letarte, Eng., M.A.Sc.",
revision: "Draft v1.2 - telemetry retention contract", revision: "Draft v1.3 - AK60/RPi5/BiSS-C source sync",
show-toc: true, show-toc: true,
show-list-of-figures: true, show-list-of-figures: true,
show-list-of-tables: true show-list-of-tables: true
@@ -58,8 +58,8 @@
columns: 2, columns: 2,
[Field], [Value], [Field], [Value],
[Document number], [ATM-2026-POL-CTRL-001], [Document number], [ATM-2026-POL-CTRL-001],
[Revision], [Draft v1.2 - telemetry retention contract], [Revision], [Draft v1.3 - AK60/RPi5/BiSS-C source sync],
[Date], [2026-05-19], [Date], [2026-07-06],
[Author], [Antoine Letarte (Atomaste)], [Author], [Antoine Letarte (Atomaste)],
[Recipient], [Cédric Leclerc], [Recipient], [Cédric Leclerc],
[Status], [For Cédric's review comments requested before lock], [Status], [For Cédric's review comments requested before lock],
@@ -70,10 +70,11 @@
*Changes since previous internal draft:* *Changes since previous internal draft:*
- _2026-07-06 source sync:_ promotes Antoine-confirmed Raspberry Pi 5 host, AK60 spindle path, and ordered Renishaw/RLS BiSS-C encoders into the firmware source/report package.
- _Hardware sync with Cédric's current BOM:_ primary F/T sensor updated from the retired SRI M3703C + M8228S1 path to the selected *Kunwei KWR75B-CAN* integrated 6-axis load cell. The transport section is now CAN-based and the telemetry status channel is generalized to `ft_status`. - _Hardware sync with Cédric's current BOM:_ primary F/T sensor updated from the retired SRI M3703C + M8228S1 path to the selected *Kunwei KWR75B-CAN* integrated 6-axis load cell. The transport section is now CAN-based and the telemetry status channel is generalized to `ft_status`.
- _Toolhead spindle drive update:_ Zone 2 now treats the selected full *ODrive S1 + M8325s 100KV* toolhead spindle system as finalized mechanical input, and documents only firmware-facing items: ODrive control mode, CAN/interface options, onboard MA702 encoder use, motor electrical constants, current/thermal limits, fault mapping, and telemetry fields. - _Toolhead spindle drive source sync:_ Zone 2 now treats the selected *CubeMars AK60-6 V1.1 KV80* integrated actuator as the current spindle path, replacing ODrive S1 + M8325s. Firmware-facing work is now AK60 command/telemetry mapping, CAN topology, limits, fault mapping, and safety power-removal validation.
- _Z-axis drive selection update:_ Zone 4 now reflects Cédric's selected *AutomationDirect SV2L-210B / SV2A-2150* servo package, with remaining work focused on torque/current command scaling, enable/fault wiring, and current/Iq monitor mapping. - _Z-axis drive selection update:_ Zone 4 now reflects Cédric's selected *AutomationDirect SV2L-210B / SV2A-2150* servo package, with remaining work focused on torque/current command scaling, enable/fault wiring, and current/Iq monitor mapping.
- _Open questions refreshed:_ removed SRI UDP and generic spindle-vector-drive questions; replaced them with KWR75B-CAN frame-map confirmation, ODrive command/telemetry interface confirmation, and SV2A-2150 control mapping. - _Open questions refreshed:_ replaced stale ODrive and SSI encoder questions with AK60 CAN/telemetry/safety-stop items and ordered Renishaw/RLS BiSS-C encoder frame/pinout items.
- _Formatting:_ ToC / figure lists enabled; exec summary expanded; Excalidraw architecture diagram retired, Mermaid is now the sole source of truth for all three diagrams (delivery-scope, control-stack, runtime-split). - _Formatting:_ ToC / figure lists enabled; exec summary expanded; Excalidraw architecture diagram retired, Mermaid is now the sole source of truth for all three diagrams (delivery-scope, control-stack, runtime-split).
- _Structure:_ §5.1 Three-Truths duplicate removed (canonical definition in §2.3); schema references cleaned up to logical names; §18.1 v1 scope and §19 acceptance criteria cross-referenced; §21 open-questions list audited. - _Structure:_ §5.1 Three-Truths duplicate removed (canonical definition in §2.3); schema references cleaned up to logical names; §18.1 v1 scope and §19 acceptance criteria cross-referenced; §21 open-questions list audited.
@@ -82,13 +83,25 @@
- _Telemetry retention contract added:_ raw \>=100 Hz capture remains the machine-side audit source, while a host-side post-run routine derives compressed/downsampled telemetry, segment statistics, dwell/work maps, anomaly windows, hashes, and retention status after each run or manual session. - _Telemetry retention contract added:_ raw \>=100 Hz capture remains the machine-side audit source, while a host-side post-run routine derives compressed/downsampled telemetry, segment statistics, dwell/work maps, anomaly windows, hashes, and retention status after each run or manual session.
- _Figure readability update:_ The tall in-body safety and segment-lifecycle figures are reduced to clear the footer. Figures 4, 5, and 6 now point to Appendix A, where landscape large-format copies are provided for review. - _Figure readability update:_ The tall in-body safety and segment-lifecycle figures are reduced to clear the footer. Figures 4, 5, and 6 now point to Appendix A, where landscape large-format copies are provided for review.
- _Open questions closed:_ arm encoder (Orbis), Z force actuator architecture (counterweight+servo), force-actuator feedback method (Iq), table motor retention (Baldor DC kept). - _Open questions closed:_ arm encoder (Orbis), Z force actuator architecture (counterweight+servo), force-actuator feedback method (Iq), table motor retention (Baldor DC kept).
- _Normand operator request added:_ toolhead spindle rotation direction is now an explicit operator/job setpoint (`cw` / `ccw`) logged separately from non-negative spindle RPM; ODrive sign mapping is a commissioning item. - _Normand operator request preserved:_ toolhead spindle rotation direction remains an explicit operator/job setpoint (`cw` / `ccw`) logged separately from non-negative spindle RPM; AK60 physical direction mapping is a commissioning item.
#line(length: 100%) #line(length: 100%)
// --- Embedded from: Fullum-Polisher-Machine-Control-Firmware-Spec-v1 --- // --- Embedded from: Fullum-Polisher-Machine-Control-Firmware-Spec-v1 ---
= Fullum Polisher - Machine Control & Firmware Specification v1 = Fullum Polisher - Machine Control & Firmware Specification v1
== Revision history
#figure(
table(
columns: 3,
[Date], [Revision], [Update],
[2026-07-06], [Draft v1.3 - AK60/RPi5/BiSS-C source sync], [Promotes Antoine's accepted hardware corrections into the firmware source: Raspberry Pi 5 host, CubeMars AK60-6 V1.1 KV80 spindle path replacing ODrive/M8325s, ordered Renishaw/RLS BiSS-C encoder part numbers, and AK60 safety/CAN commissioning items.],
),
kind: table,
caption: [Source document revision history.]
)
== Purpose and Context == Purpose and Context
This document is the *implementation target* for the machine-side stack of the Fullum swing-arm polisher. It tells you exactly: This document is the *implementation target* for the machine-side stack of the Fullum swing-arm polisher. It tells you exactly:
@@ -388,26 +401,26 @@ Use the status terms below consistently:
==== Table encoder ==== Table encoder
- *Current basis:* Absolute rotary encoder, *RLS Artos DHR 162 mm*, 20-bit, P/N `DHR162SC20BAAS30DF00` with SAR162 ring for the 143 mm table shaft. - *Current basis:* Absolute rotary encoder, *RLS Artos DHR 162 mm*, 20-bit, P/N `DHR162DB20BAAS30DA02`, with SAR162 ring P/N `SAR162C143AF14WAP00` for the 143 mm table shaft.
- *Status:* Fixed (BOM 2026-04-24). - *Status:* Fixed (actual Renishaw/RLS order validated 2026-06-18; source sync 2026-07-06).
- *Required capability / notes:* High angular fidelity, deterministic absolute readout for modulation phase reference. Large-bore OEM ring-kit mount on the existing table shaft. - *Required capability / notes:* High angular fidelity, deterministic absolute readout for modulation phase reference. Large-bore OEM ring-kit mount on the existing table shaft. The ordered `DB` output code is *BiSS-C bidirectional*, replacing the stale `SC` / SSI assumption.
- *Interface expectation:* SSI (SC) over RS422 into Teensy via an appropriate transceiver (MAX3490-class working basis). - *Interface expectation:* *BiSS-C over RS422* into Teensy via an appropriate RS422 transceiver/interface. Cédric must confirm frame timing, CRC/status-bit handling, and exact wiring from the ordered RLS documentation before firmware lock.
- *Purpose:* Table angle, derived table RPM, phase reference for force modulation. - *Purpose:* Table angle, derived table RPM, phase reference for force modulation.
==== Arm encoder ==== Arm encoder
- *Current basis:* Absolute rotary encoder on the swing-arm pivot, *RLS Orbis BR10*, 14-bit on-axis (stub-shaft magnet), P/N `BR10SCB14B12DD00` + magnet `BM120A190A1ABA00`. - *Current basis:* Absolute rotary encoder on the swing-arm pivot, *RLS Orbis BR10*, 14-bit on-axis (stub-shaft magnet), P/N `BR10DCD14B12DH00` + magnet `BM120A190A1ABA00`.
- *Status:* Fixed (BOM 2026-04-24). - *Status:* Fixed (actual Renishaw/RLS order validated 2026-06-18; source sync 2026-07-06).
- *Required capability / notes:* ~230 µm radial uncertainty at the encoder bore, sufficient for logging, kinematic linearization, and post-hoc characterization of oscillation amplitude/center (see §3.3, §9.1). SSI protocol for harmonization with the table axis. The earlier Artos DHR option-B path is closed. - *Required capability / notes:* ~230 µm radial uncertainty at the encoder bore, sufficient for logging, kinematic linearization, and post-hoc characterization of oscillation amplitude/center (see §3.3, §9.1). The ordered `DC` output code is *BiSS-C over RS422 at 5 V*, replacing the stale `SC` / SSI assumption. The earlier Artos DHR option-B path is closed.
- *Interface expectation:* SSI (SC) over RS422 into Teensy. - *Interface expectation:* *BiSS-C over RS422* into Teensy; confirm frame format, CRC/status handling, and transceiver/pinout before firmware lock.
- *Purpose:* Swing-arm oscillation position and amplitude, kinematic linearization reference (§9.5), derived amplitude/center statistics (§9.1). - *Purpose:* Swing-arm oscillation position and amplitude, kinematic linearization reference (§9.5), derived amplitude/center statistics (§9.1).
==== Spindle speed feedback ==== Spindle speed feedback
- *Current basis:* *ODrive S1 + M8325s 100KV kit*, using the motor encoder magnet and the ODrive S1 onboard MA702 magnetic encoder. - *Current basis:* *CubeMars AK60-6 V1.1 KV80 integrated actuator*, using the actuator's internal sensing/drive telemetry for commutation and actual speed feedback.
- *Status:* Fixed (Antoine selection, 2026-05-18). - *Status:* Fixed hardware direction (Antoine confirmation 2026-07-05; CEDRIC-PROP-20260609-001 accepted).
- *Required capability / notes:* Must provide stable actual spindle RPM for logging and fault checks. The ODrive closes the motor current/velocity loop locally; the machine controller receives actual RPM and fault state. Firmware must treat the ODrive as the selected spindle servo, not as a candidate or prototype option. - *Required capability / notes:* Must provide stable actual spindle RPM for logging and fault checks. The AK60 closes the motor loop locally; the machine controller receives actual RPM, direction state when available, current/torque/thermal telemetry when available, and fault state. Firmware must treat ODrive S1 + M8325s as obsolete for this machine.
- *Interface expectation:* ODrive local encoder for commutation; controller interface via CAN preferred, or another confirmed ODrive interface. - *Interface expectation:* AK60 runtime command/telemetry via CAN is the current working basis. Final CAN topology, IDs, frame rates, timeouts, and fault handling must be frozen before firmware lock; keep the primary KWR75B-CAN force path isolated unless Cédric explicitly proves a shared-bus design is safe and deterministic.
- *Purpose:* Spindle commutation, speed monitoring, and tool rotation telemetry. - *Purpose:* Spindle commutation, speed monitoring, and tool rotation telemetry.
==== Force actuator feedback ==== Force actuator feedback
@@ -438,10 +451,11 @@ Use the status terms below consistently:
==== Spindle motor ==== Spindle motor
- *Current basis:* *ODrive S1 + M8325s 100KV pancake/outrunner motor kit* as the selected full toolhead spindle system. This replaces the earlier Mosrac U7636 + separate drive/encoder basis. - *Current basis:* *CubeMars AK60-6 V1.1 KV80 integrated actuator* as the selected toolhead spindle system. This replaces the ODrive S1 + M8325s path and earlier Mosrac U7636 / separate-drive assumptions.
- *Status:* Fixed (Antoine selection, 2026-05-18). - *Status:* Fixed hardware direction (Antoine confirmation 2026-07-05; CEDRIC-PROP-20260609-001 accepted).
- *Required capability / notes:* From the controller's perspective: an ODrive-controlled BLDC spindle that accepts speed/enable commands, accepts explicit clockwise/counter-clockwise direction selection, closes the motor loop locally, and exposes actual RPM plus fault state. ODrive S1 supports torque, velocity, position, and trajectory modes; v1 uses velocity control for commanded spindle RPM. Direction is represented separately from RPM; RPM remains a non-negative magnitude. - *Required capability / notes:* From the controller's perspective: an AK60 spindle actuator that accepts speed/enable commands, accepts explicit clockwise/counter-clockwise direction selection, closes the motor loop locally, and exposes actual RPM plus fault state. Direction is represented separately from RPM; RPM remains a non-negative magnitude. Preserve sizing caveats: the AK60-6 KV80 path is acceptable for the documented normal polishing torque basis and transient aggressive cases, but sustained high-torque duty, gearbox ripple/backlash, wet/slurry protection, output interface, and thermal/current telemetry must be validated before commissioning sign-off.
- *Drive expectation:* ODrive S1 local FOC velocity loop; controller command/telemetry path via CAN or confirmed ODrive interface. - *Drive expectation:* AK60 integrated drive/controller. Runtime command/telemetry via CAN is the current working basis; if Cédric selects a different supported AK60 interface, update this spec and the machine capability profile before firmware lock.
- *Safety expectation:* AK60 has no safety-rated STO in the current plan. Firmware CAN stop/disable commands are normal-control actions only; the safety model must remove AK60 power through the safety-controlled post-contactor power path and bench-test coast-down/fault behavior.
- *Purpose:* Tool rotation. - *Purpose:* Tool rotation.
==== Arm oscillation motor ==== Arm oscillation motor
@@ -460,40 +474,27 @@ Use the status terms below consistently:
- *Drive expectation:* 010 V isolated analog speed reference from the Teensy; run/stop and fault I/O into the HOA and safety chain. - *Drive expectation:* 010 V isolated analog speed reference from the Teensy; run/stop and fault I/O into the HOA and safety chain.
- *Purpose:* Swing-arm motor drive. - *Purpose:* Swing-arm motor drive.
==== ODrive S1 + M8325s Firmware-Facing Facts ==== CubeMars AK60-6 V1.1 Firmware-Facing Facts
The toolhead/spindle mechanical design is finalized outside this firmware document. The firmware/control scope is only the electrical interface, configuration, command path, telemetry path, and fault handling for the selected ODrive kit. The toolhead/spindle mechanical design is finalized outside this firmware document. The firmware/control scope is the electrical interface, configuration, command path, telemetry path, safety-stop assumptions, and fault handling for the selected AK60 integrated actuator path.
Firmware-facing ODrive S1 facts from the vendor page: Firmware-facing AK60 assumptions to verify before commissioning:
- Single-axis BLDC / PMAC servo drive. - Selected actuator path: *CubeMars AK60-6 V1.1 KV80* integrated actuator.
- Control modes available: torque, velocity, position, trajectory; v1 spindle operation uses velocity mode. - Low-speed polishing preference: KV80 remains preferred over KV140 for the torque-dominated 10-120 RPM use case.
- Supply range: 12-48 V operation, 50.5 V maximum. - Approximate torque envelope to preserve in design notes: about *3 N·m rated / 9 N·m peak*. This is suitable for the documented normal polishing basis and acceptable for short aggressive transients, but not enough margin to treat the aggressive case as sustained duty without thermal/current validation.
- Continuous current: 40 A with heat spreader recommended. - Current generated electrical basis: AK60 powered from a *24 VDC supply downstream of the safety-controlled post-contactor bus*. Confirm final supply rail, fuse/breaker sizing, cable/connector ratings, and voltage/current telemetry before commissioning.
- Control interfaces: USB, isolated UART, isolated STEP/DIR, analog voltage, PWM, and CAN. - Runtime interface: CAN is the working basis. Freeze AK60 command IDs, telemetry IDs, frame rates, stale-frame timeout, startup/fault behavior, and whether AK60 shares a bus with KWR75B or uses a separate Teensy CAN channel.
- CAN: CAN 2.0B at 1 Mbps; CAN-FD 5 Mbps is experimental and is not the v1 baseline. - Direction: `cw` / `ccw` remains an explicit protocol enum separate from non-negative RPM. Cédric must bench-map the enum to the actual physical rotation convention.
- On-board magnetic encoder: MA702, used with the M8325s encoder magnet for the selected package. - Environmental/mechanical checks: gearbox backlash/ripple, non-hollow packaging, wet/slurry protection, output interface, thermal path, and cable strain relief must be verified outside firmware before final commissioning.
- ODrive S1 control-loop rate: 8 kHz; PWM frequency: 24 kHz.
- On-board brake chopper supports brake-energy management with a brake resistor.
- Built-in motor thermistor divider circuit.
Firmware-facing M8325s facts from the vendor page/documentation:
- Motor: M8325s 100KV, 20 pole pairs.
- Torque constant: approximately 0.083 Nm/A.
- Phase resistance: 24 mOhm phase-neutral.
- Phase inductance: 9.9 uH phase-neutral.
- Continuous current: 40 A free air, 60 A forced air.
- Peak current: 80 A for 3 s.
- Thermistor: NTC 10k 3435.
Firmware obligations: Firmware obligations:
- Store the ODrive configuration used for commissioning with the machine software release or machine-capability profile. - Store the AK60 commissioning parameters used with the machine software release or machine-capability profile.
- Configure and log the motor electrical parameters, encoder source, velocity-loop limits, current limits, thermal limits, spindle direction/sign convention, and brake-resistor/chopper settings used on the machine. - Configure and log velocity limits, current/torque limits, thermal limits, acceleration/deceleration/ramp policy, spindle direction mapping, and fault thresholds.
- Expose ODrive fault state to the host and map faults into the normal `DRIVE_FAULT` / spindle fault handling path. - Expose AK60 fault state to the host and map faults into the normal `DRIVE_FAULT` / spindle fault handling path.
- Prefer CAN for runtime command and telemetry if Cédric does not select another ODrive-supported interface. - Log at least actual spindle RPM; strongly recommended AK60 telemetry channels are listed in §9.1.
- Log at least actual spindle RPM; strongly recommended ODrive telemetry channels are listed in §9.1. - Treat CAN stop/disable commands as normal-control actions, not safety-rated stop functions. E-stop safety must rely on the hardwired safety chain and power-removal path, then be bench-tested.
=== Cam Mechanism === Cam Mechanism
@@ -515,7 +516,7 @@ Firmware obligations:
==== Host computer ==== Host computer
- *Current basis:* *Raspberry Pi 4 + touchscreen*. - *Current basis:* *Raspberry Pi 5 + touchscreen*.
- *Status:* Fixed for this revision. - *Status:* Fixed for this revision.
- *Role:* State machine, job management, UI, telemetry logging, operator workflow. - *Role:* State machine, job management, UI, telemetry logging, operator workflow.
@@ -824,7 +825,7 @@ Each segment is a self-contained, machine-executable command block:
- `commanded_force_n`: float, N. Base force setpoint. - `commanded_force_n`: float, N. Base force setpoint.
- `commanded_table_rpm`: float, RPM. Table rotation speed. - `commanded_table_rpm`: float, RPM. Table rotation speed.
- `commanded_spindle_rpm`: float, RPM. Spindle rotation speed as a non-negative magnitude. - `commanded_spindle_rpm`: float, RPM. Spindle rotation speed as a non-negative magnitude.
- `commanded_spindle_direction`: enum, `"cw"` or `"ccw"`. Toolhead spindle rotation direction, viewed from above the toolhead looking down toward the mirror/tool contact. The ODrive sign mapping is a commissioning item and must be configured so these enum values match physical observed rotation. - `commanded_spindle_direction`: enum, `"cw"` or `"ccw"`. Toolhead spindle rotation direction, viewed from above the toolhead looking down toward the mirror/tool contact. The AK60 direction mapping is a commissioning item and must be configured so these enum values match physical observed rotation.
- `commanded_cam_amplitude_deg`: float, degrees. Machine-package representation of the mechanical oscillation amplitude. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_amplitude_deg` in machine-side/manual records. - `commanded_cam_amplitude_deg`: float, degrees. Machine-package representation of the mechanical oscillation amplitude. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_amplitude_deg` in machine-side/manual records.
- `commanded_cam_offset_deg`: float, degrees. Machine-package representation of the mechanical oscillation center/offset. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_center_deg` in machine-side/manual records. - `commanded_cam_offset_deg`: float, degrees. Machine-package representation of the mechanical oscillation center/offset. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_center_deg` in machine-side/manual records.
- `force_modulation`: object/null. Angle-synchronized modulation parameters. - `force_modulation`: object/null. Angle-synchronized modulation parameters.
@@ -1071,17 +1072,17 @@ These channels are characterization, not control: the firmware does not act on t
- `ft_status`: uint32 bitfield, F/T sensor. Raw KWR75B-CAN status word or mapped validity bitfield (validity, saturation, fault bits). - `ft_status`: uint32 bitfield, F/T sensor. Raw KWR75B-CAN status word or mapped validity bitfield (validity, saturation, fault bits).
- `z_servo_iq_v`: float, V, Z servo drive analog out. Quadrature current (Iq) from the Z-axis AC servo drive, linear proxy for belt tension / applied differential force (§3.1, §3.2). - `z_servo_iq_v`: float, V, Z servo drive analog out. Quadrature current (Iq) from the Z-axis AC servo drive, linear proxy for belt tension / applied differential force (§3.1, §3.2).
- `z_brake_engaged`: bool, safety chain. True when the Z-axis NC electromagnetic brake is engaged (de-energized coil). Expected false during normal RUNNING / MANUAL, true in IDLE / FAULTED / E-stop. - `z_brake_engaged`: bool, safety chain. True when the Z-axis NC electromagnetic brake is engaged (de-energized coil). Expected false during normal RUNNING / MANUAL, true in IDLE / FAULTED / E-stop.
- `spindle_drive_state`: enum/string, ODrive S1. ODrive axis state or mapped controller state for the spindle drive. - `spindle_drive_state`: enum/string, AK60 integrated actuator. AK60 state or mapped controller state for the spindle drive.
- `spindle_drive_error`: uint32/string, bitfield/code, ODrive S1. Raw or mapped ODrive error / fault code. - `spindle_drive_error`: uint32/string, bitfield/code, AK60 integrated actuator. Raw or mapped AK60 error / fault code.
- `spindle_bus_voltage_v`: float, V, ODrive S1. DC bus voltage reported by the ODrive. - `spindle_bus_voltage_v`: float, V, AK60 integrated actuator. DC bus / supply voltage reported by the actuator if exposed.
- `spindle_iq_a`: float, A, ODrive S1. Measured q-axis current / torque-producing current, if exposed over the selected interface. - `spindle_iq_a`: float, A, AK60 integrated actuator. Measured torque/current channel, if exposed over the selected interface.
- `spindle_motor_temp_c`: float, degC, ODrive S1 thermistor input. Motor thermistor temperature derived from the M8325s NTC 10k 3435, if enabled. - `spindle_motor_temp_c`: float, degC, AK60 integrated actuator. Motor/drive temperature telemetry, if exposed over the selected interface.
- `arm_angle_linearized_deg`: float, deg, Teensy from encoder + geometry. Crank-rocker linearized arm angle (§9.5); NaN if geometry not validated. - `arm_angle_linearized_deg`: float, deg, Teensy from encoder + geometry. Crank-rocker linearized arm angle (§9.5); NaN if geometry not validated.
- `force_setpoint_n`: float, N, setpoint generator. Current target force after modulation; this is the input to the Fz PID, not the PID actuator output. - `force_setpoint_n`: float, N, setpoint generator. Current target force after modulation; this is the input to the Fz PID, not the PID actuator output.
- `table_rpm_setpoint`: float, RPM, host command. Commanded table speed. - `table_rpm_setpoint`: float, RPM, host command. Commanded table speed.
- `spindle_rpm_setpoint`: float, RPM, host command. Commanded spindle speed magnitude. - `spindle_rpm_setpoint`: float, RPM, host command. Commanded spindle speed magnitude.
- `spindle_direction_setpoint`: enum, `cw` / `ccw`, host command. Requested toolhead spindle direction. - `spindle_direction_setpoint`: enum, `cw` / `ccw`, host command. Requested toolhead spindle direction.
- `spindle_direction_actual`: enum, `cw` / `ccw`, ODrive/firmware-derived. Actual observed or drive-reported spindle direction after sign mapping. - `spindle_direction_actual`: enum, `cw` / `ccw`, AK60/firmware-derived. Actual observed or actuator-reported spindle direction after direction mapping.
- `force_actuator_cmd`: float, V or mA, DAC output. Raw actuator command signal. - `force_actuator_cmd`: float, V or mA, DAC output. Raw actuator command signal.
- `estop_active`: bool, hardware. E-stop circuit state. - `estop_active`: bool, hardware. E-stop circuit state.
- `interlock_state`: uint16 bitfield, multiple. Packed interlock status bits. - `interlock_state`: uint16 bitfield, multiple. Packed interlock status bits.
@@ -1856,37 +1857,26 @@ Your controller must expose a static capability profile so upstream software kno
"notes": "Counterweight cancels head static weight; controller modulates residual differential only. Force PID closes on Fz from the Kunwei KWR75B-CAN 6-axis sensor." "notes": "Counterweight cancels head static weight; controller modulates residual differential only. Force PID closes on Fz from the Kunwei KWR75B-CAN 6-axis sensor."
}, },
"spindle_drive": { "spindle_drive": {
"system": "ODrive S1 + M8325s 100KV kit", "system": "CubeMars AK60-6 V1.1 KV80 integrated actuator",
"status": "selected_final", "status": "selected_final",
"drive": "ODrive S1", "actuator": "CubeMars AK60-6 V1.1 KV80",
"motor": "M8325s 100KV", "controller": "integrated AK-series drive/controller",
"encoder": "ODrive S1 onboard MA702 magnetic encoder with M8325s encoder magnet", "encoder": "integrated actuator sensing / vendor telemetry",
"control_mode_v1": "velocity", "control_mode_v1": "velocity",
"preferred_runtime_interface": "CAN 2.0B 1Mbps", "preferred_runtime_interface": "CAN, topology/IDs/rates/timeouts to freeze before firmware lock",
"supported_drive_modes": ["torque", "velocity", "position", "trajectory"], "supply_voltage_v_working_basis": 24,
"odrive_supply_range_v": [12, 48], "safety_stop_basis": "remove actuator power through safety-controlled post-contactor bus; CAN stop is not safety-rated",
"odrive_abs_max_v": 50.5, "rated_torque_nm_approx": 3,
"odrive_continuous_current_a": 40, "peak_torque_nm_approx": 9,
"odrive_control_loop_hz": 8000,
"odrive_pwm_hz": 24000,
"motor_kv_rpm_per_v": 100,
"motor_torque_constant_nm_per_a": 0.083,
"motor_pole_pairs": 20,
"motor_phase_resistance_ohm": 0.024,
"motor_phase_inductance_h": 0.0000099,
"motor_continuous_current_a_free_air": 40,
"motor_continuous_current_a_forced_air": 60,
"motor_peak_current_a_3s": 80,
"motor_thermistor": "NTC 10k 3435",
"required_firmware_items": [ "required_firmware_items": [
"saved_odrive_configuration", "saved_ak60_commissioning_parameters",
"velocity_command_scaling", "velocity_command_scaling",
"spindle_direction_sign_mapping", "spindle_direction_mapping",
"actual_rpm_telemetry", "actual_rpm_telemetry",
"drive_fault_mapping", "drive_fault_mapping",
"current_limit_configuration", "current_torque_limit_configuration",
"thermal_limit_configuration", "thermal_limit_configuration",
"brake_chopper_resistor_configuration_if_used" "safety_power_removal_bench_test"
] ]
}, },
"safety_limits": { "safety_limits": {
@@ -1911,7 +1901,7 @@ Your controller must expose a static capability profile so upstream software kno
"unknowns": [ "unknowns": [
"Z-axis drive control mapping pending confirmation on the SV2A-2150", "Z-axis drive control mapping pending confirmation on the SV2A-2150",
"Measured force loop bandwidth pending commissioning", "Measured force loop bandwidth pending commissioning",
"ODrive S1 + M8325s spindle package is selected; firmware command/telemetry mapping still to be documented" "AK60 command/telemetry mapping, CAN topology, safety power-removal behavior, and thermal/current limits still to be documented and bench-tested"
] ]
} }
``` ```
@@ -2324,16 +2314,16 @@ Every item flagged *"Preferred, confirm in detailed design"* or *"Open, Cédric
=== Zone 1 — Table (Control Interface) === Zone 1 — Table (Control Interface)
- Confirm the KBSI-240D opto-isolated interface as the DC-variator command path, or name the replacement. - Confirm the KBSI-240D opto-isolated interface as the DC-variator command path, or name the replacement.
- Confirm the table encoder transport (SSI (SC) / RS422) and the transceiver choice (MAX3490-class working basis). - Confirm BiSS-C frame details for the ordered table and arm encoders: timing, CRC/status bits, RS422 transceiver/pinout, shielding, and startup/error handling.
- Confirm whether the table drive or its command path changes electrically as part of the overhaul. - Confirm whether the table drive or its command path changes electrically as part of the overhaul.
=== Zone 2 — Spindle / Toolhead Drive (Control Interface) === Zone 2 — Spindle / Toolhead Drive (Control Interface)
- Define the ODrive runtime command and telemetry path to the controller. CAN 2.0B at 1 Mbps is the preferred baseline unless Cédric selects another ODrive-supported interface. - Define the AK60 runtime command and telemetry path to the controller. CAN is the working basis, but Cédric must freeze CAN topology, IDs, frame rates, stale-frame timeout, startup behavior, and error isolation before firmware lock.
- Define command scaling for spindle velocity setpoint, clockwise/counter-clockwise sign mapping, enable/disable, fault reset, and safe stop. - Define command scaling for spindle velocity setpoint, clockwise/counter-clockwise direction mapping, enable/disable, fault reset, ramp-to-zero / live-reversal policy, and safe stop behavior.
- Define the ODrive telemetry subset mapped into the host logs: actual RPM, drive state, drive error, DC bus voltage, q-axis current if available, and motor temperature if the thermistor is enabled. - Define the AK60 telemetry subset mapped into the host logs: actual RPM, actuator state, actuator error, bus/supply voltage, torque/current if available, and motor/drive temperature if available.
- Store/export the final ODrive configuration file or parameter dump with the machine software release. - Store/export the final AK60 commissioning parameter set with the machine software release.
- Define the spindle enable/fault I/O wired into the HOA + safety chain. - Define the spindle enable/fault I/O and the hardwired AK60 power-removal path through the HOA + safety chain; prove with a bench E-stop/power-loss test.
=== Zone 4 — Z-Axis / Force Actuator (Control Interface) === Zone 4 — Z-Axis / Force Actuator (Control Interface)

View File

@@ -8,10 +8,12 @@ tags:
- Interface - Interface
- Cedric - Cedric
- Engineering/Specification - Engineering/Specification
date: 2026-05-18 date: 2026-07-06
status: status:
- draft - draft
title: "Fullum Polisher - Machine Control & Firmware Specification v1" title: "Fullum Polisher - Machine Control & Firmware Specification v1"
revision: "Draft v1.3 - AK60/RPi5/BiSS-C source sync"
last_source_sync: 2026-07-06
author: Antoine Letarte author: Antoine Letarte
abstract: > abstract: >
Machine-side technical specification for the Fullum swing-arm polisher. Machine-side technical specification for the Fullum swing-arm polisher.
@@ -24,6 +26,12 @@ abstract: >
# Fullum Polisher - Machine Control & Firmware Specification v1 # Fullum Polisher - Machine Control & Firmware Specification v1
## Revision history
| Date | Revision | Update |
|---|---|---|
| 2026-07-06 | Draft v1.3 - AK60/RPi5/BiSS-C source sync | Promotes Antoine's accepted hardware corrections into the firmware source: Raspberry Pi 5 host, CubeMars AK60-6 V1.1 KV80 spindle path replacing ODrive/M8325s, ordered Renishaw/RLS BiSS-C encoder part numbers, and AK60 safety/CAN commissioning items. |
## 1. Purpose and Context ## 1. Purpose and Context
This document is the **implementation target** for the machine-side stack of the Fullum swing-arm polisher. It tells you exactly: This document is the **implementation target** for the machine-side stack of the Fullum swing-arm polisher. It tells you exactly:
@@ -316,26 +324,26 @@ Use the status terms below consistently:
#### Table encoder #### Table encoder
- **Current basis:** Absolute rotary encoder, **RLS Artos DHR 162 mm**, 20-bit, P/N `DHR162SC20BAAS30DF00` with SAR162 ring for the 143 mm table shaft. - **Current basis:** Absolute rotary encoder, **RLS Artos DHR 162 mm**, 20-bit, P/N `DHR162DB20BAAS30DA02`, with SAR162 ring P/N `SAR162C143AF14WAP00` for the 143 mm table shaft.
- **Status:** Fixed (BOM 2026-04-24). - **Status:** Fixed (actual Renishaw/RLS order validated 2026-06-18; source sync 2026-07-06).
- **Required capability / notes:** High angular fidelity, deterministic absolute readout for modulation phase reference. Large-bore OEM ring-kit mount on the existing table shaft. - **Required capability / notes:** High angular fidelity, deterministic absolute readout for modulation phase reference. Large-bore OEM ring-kit mount on the existing table shaft. The ordered `DB` output code is **BiSS-C bidirectional**, replacing the stale `SC` / SSI assumption.
- **Interface expectation:** SSI (SC) over RS422 into Teensy via an appropriate transceiver (MAX3490-class working basis). - **Interface expectation:** **BiSS-C over RS422** into Teensy via an appropriate RS422 transceiver/interface. Cédric must confirm frame timing, CRC/status-bit handling, and exact wiring from the ordered RLS documentation before firmware lock.
- **Purpose:** Table angle, derived table RPM, phase reference for force modulation. - **Purpose:** Table angle, derived table RPM, phase reference for force modulation.
#### Arm encoder #### Arm encoder
- **Current basis:** Absolute rotary encoder on the swing-arm pivot, **RLS Orbis BR10**, 14-bit on-axis (stub-shaft magnet), P/N `BR10SCB14B12DD00` + magnet `BM120A190A1ABA00`. - **Current basis:** Absolute rotary encoder on the swing-arm pivot, **RLS Orbis BR10**, 14-bit on-axis (stub-shaft magnet), P/N `BR10DCD14B12DH00` + magnet `BM120A190A1ABA00`.
- **Status:** Fixed (BOM 2026-04-24). - **Status:** Fixed (actual Renishaw/RLS order validated 2026-06-18; source sync 2026-07-06).
- **Required capability / notes:** ~230 µm radial uncertainty at the encoder bore, sufficient for logging, kinematic linearization, and post-hoc characterization of oscillation amplitude/center (see §3.3, §9.1). SSI protocol for harmonization with the table axis. The earlier Artos DHR option-B path is closed. - **Required capability / notes:** ~230 µm radial uncertainty at the encoder bore, sufficient for logging, kinematic linearization, and post-hoc characterization of oscillation amplitude/center (see §3.3, §9.1). The ordered `DC` output code is **BiSS-C over RS422 at 5 V**, replacing the stale `SC` / SSI assumption. The earlier Artos DHR option-B path is closed.
- **Interface expectation:** SSI (SC) over RS422 into Teensy. - **Interface expectation:** **BiSS-C over RS422** into Teensy; confirm frame format, CRC/status handling, and transceiver/pinout before firmware lock.
- **Purpose:** Swing-arm oscillation position and amplitude, kinematic linearization reference (§9.5), derived amplitude/center statistics (§9.1). - **Purpose:** Swing-arm oscillation position and amplitude, kinematic linearization reference (§9.5), derived amplitude/center statistics (§9.1).
#### Spindle speed feedback #### Spindle speed feedback
- **Current basis:** **ODrive S1 + M8325s 100KV kit**, using the motor encoder magnet and the ODrive S1 onboard MA702 magnetic encoder. - **Current basis:** **CubeMars AK60-6 V1.1 KV80 integrated actuator**, using the actuator's internal sensing/drive telemetry for commutation and actual speed feedback.
- **Status:** Fixed (Antoine selection, 2026-05-18). - **Status:** Fixed hardware direction (Antoine confirmation 2026-07-05; CEDRIC-PROP-20260609-001 accepted).
- **Required capability / notes:** Must provide stable actual spindle RPM for logging and fault checks. The ODrive closes the motor current/velocity loop locally; the machine controller receives actual RPM and fault state. Firmware must treat the ODrive as the selected spindle servo, not as a candidate or prototype option. - **Required capability / notes:** Must provide stable actual spindle RPM for logging and fault checks. The AK60 closes the motor loop locally; the machine controller receives actual RPM, direction state when available, current/torque/thermal telemetry when available, and fault state. Firmware must treat ODrive S1 + M8325s as obsolete for this machine.
- **Interface expectation:** ODrive local encoder for commutation; controller interface via CAN preferred, or another confirmed ODrive interface. - **Interface expectation:** AK60 runtime command/telemetry via CAN is the current working basis. Final CAN topology, IDs, frame rates, timeouts, and fault handling must be frozen before firmware lock; keep the primary KWR75B-CAN force path isolated unless Cédric explicitly proves a shared-bus design is safe and deterministic.
- **Purpose:** Spindle commutation, speed monitoring, and tool rotation telemetry. - **Purpose:** Spindle commutation, speed monitoring, and tool rotation telemetry.
#### Force actuator feedback #### Force actuator feedback
@@ -366,10 +374,11 @@ Use the status terms below consistently:
#### Spindle motor #### Spindle motor
- **Current basis:** **ODrive S1 + M8325s 100KV pancake/outrunner motor kit** as the selected full toolhead spindle system. This replaces the earlier Mosrac U7636 + separate drive/encoder basis. - **Current basis:** **CubeMars AK60-6 V1.1 KV80 integrated actuator** as the selected toolhead spindle system. This replaces the ODrive S1 + M8325s path and earlier Mosrac U7636 / separate-drive assumptions.
- **Status:** Fixed (Antoine selection, 2026-05-18). - **Status:** Fixed hardware direction (Antoine confirmation 2026-07-05; CEDRIC-PROP-20260609-001 accepted).
- **Required capability / notes:** From the controller's perspective: an ODrive-controlled BLDC spindle that accepts speed/enable commands, accepts explicit clockwise/counter-clockwise direction selection, closes the motor loop locally, and exposes actual RPM plus fault state. ODrive S1 supports torque, velocity, position, and trajectory modes; v1 uses velocity control for commanded spindle RPM. Direction is represented separately from RPM; RPM remains a non-negative magnitude. - **Required capability / notes:** From the controller's perspective: an AK60 spindle actuator that accepts speed/enable commands, accepts explicit clockwise/counter-clockwise direction selection, closes the motor loop locally, and exposes actual RPM plus fault state. Direction is represented separately from RPM; RPM remains a non-negative magnitude. Preserve sizing caveats: the AK60-6 KV80 path is acceptable for the documented normal polishing torque basis and transient aggressive cases, but sustained high-torque duty, gearbox ripple/backlash, wet/slurry protection, output interface, and thermal/current telemetry must be validated before commissioning sign-off.
- **Drive expectation:** ODrive S1 local FOC velocity loop; controller command/telemetry path via CAN or confirmed ODrive interface. - **Drive expectation:** AK60 integrated drive/controller. Runtime command/telemetry via CAN is the current working basis; if Cédric selects a different supported AK60 interface, update this spec and the machine capability profile before firmware lock.
- **Safety expectation:** AK60 has no safety-rated STO in the current plan. Firmware CAN stop/disable commands are normal-control actions only; the safety model must remove AK60 power through the safety-controlled post-contactor power path and bench-test coast-down/fault behavior.
- **Purpose:** Tool rotation. - **Purpose:** Tool rotation.
#### Arm oscillation motor #### Arm oscillation motor
@@ -388,40 +397,27 @@ Use the status terms below consistently:
- **Drive expectation:** 010 V isolated analog speed reference from the Teensy; run/stop and fault I/O into the HOA and safety chain. - **Drive expectation:** 010 V isolated analog speed reference from the Teensy; run/stop and fault I/O into the HOA and safety chain.
- **Purpose:** Swing-arm motor drive. - **Purpose:** Swing-arm motor drive.
#### 3.2.1 ODrive S1 + M8325s Firmware-Facing Facts #### 3.2.1 CubeMars AK60-6 V1.1 Firmware-Facing Facts
The toolhead/spindle mechanical design is finalized outside this firmware document. The firmware/control scope is only the electrical interface, configuration, command path, telemetry path, and fault handling for the selected ODrive kit. The toolhead/spindle mechanical design is finalized outside this firmware document. The firmware/control scope is the electrical interface, configuration, command path, telemetry path, safety-stop assumptions, and fault handling for the selected AK60 integrated actuator path.
Firmware-facing ODrive S1 facts from the vendor page: Firmware-facing AK60 assumptions to verify before commissioning:
- Single-axis BLDC / PMAC servo drive. - Selected actuator path: **CubeMars AK60-6 V1.1 KV80** integrated actuator.
- Control modes available: torque, velocity, position, trajectory; v1 spindle operation uses velocity mode. - Low-speed polishing preference: KV80 remains preferred over KV140 for the torque-dominated 10-120 RPM use case.
- Supply range: 12-48 V operation, 50.5 V maximum. - Approximate torque envelope to preserve in design notes: about **3 N·m rated / 9 N·m peak**. This is suitable for the documented normal polishing basis and acceptable for short aggressive transients, but not enough margin to treat the aggressive case as sustained duty without thermal/current validation.
- Continuous current: 40 A with heat spreader recommended. - Current generated electrical basis: AK60 powered from a **24 VDC supply downstream of the safety-controlled post-contactor bus**. Confirm final supply rail, fuse/breaker sizing, cable/connector ratings, and voltage/current telemetry before commissioning.
- Control interfaces: USB, isolated UART, isolated STEP/DIR, analog voltage, PWM, and CAN. - Runtime interface: CAN is the working basis. Freeze AK60 command IDs, telemetry IDs, frame rates, stale-frame timeout, startup/fault behavior, and whether AK60 shares a bus with KWR75B or uses a separate Teensy CAN channel.
- CAN: CAN 2.0B at 1 Mbps; CAN-FD 5 Mbps is experimental and is not the v1 baseline. - Direction: `cw` / `ccw` remains an explicit protocol enum separate from non-negative RPM. Cédric must bench-map the enum to the actual physical rotation convention.
- On-board magnetic encoder: MA702, used with the M8325s encoder magnet for the selected package. - Environmental/mechanical checks: gearbox backlash/ripple, non-hollow packaging, wet/slurry protection, output interface, thermal path, and cable strain relief must be verified outside firmware before final commissioning.
- ODrive S1 control-loop rate: 8 kHz; PWM frequency: 24 kHz.
- On-board brake chopper supports brake-energy management with a brake resistor.
- Built-in motor thermistor divider circuit.
Firmware-facing M8325s facts from the vendor page/documentation:
- Motor: M8325s 100KV, 20 pole pairs.
- Torque constant: approximately 0.083 Nm/A.
- Phase resistance: 24 mOhm phase-neutral.
- Phase inductance: 9.9 uH phase-neutral.
- Continuous current: 40 A free air, 60 A forced air.
- Peak current: 80 A for 3 s.
- Thermistor: NTC 10k 3435.
Firmware obligations: Firmware obligations:
- Store the ODrive configuration used for commissioning with the machine software release or machine-capability profile. - Store the AK60 commissioning parameters used with the machine software release or machine-capability profile.
- Configure and log the motor electrical parameters, encoder source, velocity-loop limits, current limits, thermal limits, spindle direction/sign convention, and brake-resistor/chopper settings used on the machine. - Configure and log velocity limits, current/torque limits, thermal limits, acceleration/deceleration/ramp policy, spindle direction mapping, and fault thresholds.
- Expose ODrive fault state to the host and map faults into the normal `DRIVE_FAULT` / spindle fault handling path. - Expose AK60 fault state to the host and map faults into the normal `DRIVE_FAULT` / spindle fault handling path.
- Prefer CAN for runtime command and telemetry if Cédric does not select another ODrive-supported interface. - Log at least actual spindle RPM; strongly recommended AK60 telemetry channels are listed in §9.1.
- Log at least actual spindle RPM; strongly recommended ODrive telemetry channels are listed in §9.1. - Treat CAN stop/disable commands as normal-control actions, not safety-rated stop functions. E-stop safety must rely on the hardwired safety chain and power-removal path, then be bench-tested.
### 3.3 Cam Mechanism ### 3.3 Cam Mechanism
@@ -443,7 +439,7 @@ Firmware obligations:
#### Host computer #### Host computer
- **Current basis:** **Raspberry Pi 4 + touchscreen**. - **Current basis:** **Raspberry Pi 5 + touchscreen**.
- **Status:** Fixed for this revision. - **Status:** Fixed for this revision.
- **Role:** State machine, job management, UI, telemetry logging, operator workflow. - **Role:** State machine, job management, UI, telemetry logging, operator workflow.
@@ -726,7 +722,7 @@ Each segment is a self-contained, machine-executable command block:
- `commanded_force_n`: float, N. Base force setpoint. - `commanded_force_n`: float, N. Base force setpoint.
- `commanded_table_rpm`: float, RPM. Table rotation speed. - `commanded_table_rpm`: float, RPM. Table rotation speed.
- `commanded_spindle_rpm`: float, RPM. Spindle rotation speed as a non-negative magnitude. - `commanded_spindle_rpm`: float, RPM. Spindle rotation speed as a non-negative magnitude.
- `commanded_spindle_direction`: enum, `"cw"` or `"ccw"`. Toolhead spindle rotation direction, viewed from above the toolhead looking down toward the mirror/tool contact. The ODrive sign mapping is a commissioning item and must be configured so these enum values match physical observed rotation. - `commanded_spindle_direction`: enum, `"cw"` or `"ccw"`. Toolhead spindle rotation direction, viewed from above the toolhead looking down toward the mirror/tool contact. The AK60 direction mapping is a commissioning item and must be configured so these enum values match physical observed rotation.
- `commanded_cam_amplitude_deg`: float, degrees. Machine-package representation of the mechanical oscillation amplitude. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_amplitude_deg` in machine-side/manual records. - `commanded_cam_amplitude_deg`: float, degrees. Machine-package representation of the mechanical oscillation amplitude. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_amplitude_deg` in machine-side/manual records.
- `commanded_cam_offset_deg`: float, degrees. Machine-package representation of the mechanical oscillation center/offset. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_center_deg` in machine-side/manual records. - `commanded_cam_offset_deg`: float, degrees. Machine-package representation of the mechanical oscillation center/offset. In v1 this is not actuator-commanded; it is confirmed by the operator through the geometric gate and logged as `configured_arm_center_deg` in machine-side/manual records.
- `force_modulation`: object/null. Angle-synchronized modulation parameters. - `force_modulation`: object/null. Angle-synchronized modulation parameters.
@@ -963,17 +959,17 @@ These channels are characterization, not control: the firmware does not act on t
- `ft_status`: uint32 bitfield, F/T sensor. Raw KWR75B-CAN status word or mapped validity bitfield (validity, saturation, fault bits). - `ft_status`: uint32 bitfield, F/T sensor. Raw KWR75B-CAN status word or mapped validity bitfield (validity, saturation, fault bits).
- `z_servo_iq_v`: float, V, Z servo drive analog out. Quadrature current (Iq) from the Z-axis AC servo drive, linear proxy for belt tension / applied differential force (§3.1, §3.2). - `z_servo_iq_v`: float, V, Z servo drive analog out. Quadrature current (Iq) from the Z-axis AC servo drive, linear proxy for belt tension / applied differential force (§3.1, §3.2).
- `z_brake_engaged`: bool, safety chain. True when the Z-axis NC electromagnetic brake is engaged (de-energized coil). Expected false during normal RUNNING / MANUAL, true in IDLE / FAULTED / E-stop. - `z_brake_engaged`: bool, safety chain. True when the Z-axis NC electromagnetic brake is engaged (de-energized coil). Expected false during normal RUNNING / MANUAL, true in IDLE / FAULTED / E-stop.
- `spindle_drive_state`: enum/string, ODrive S1. ODrive axis state or mapped controller state for the spindle drive. - `spindle_drive_state`: enum/string, AK60 integrated actuator. AK60 state or mapped controller state for the spindle drive.
- `spindle_drive_error`: uint32/string, bitfield/code, ODrive S1. Raw or mapped ODrive error / fault code. - `spindle_drive_error`: uint32/string, bitfield/code, AK60 integrated actuator. Raw or mapped AK60 error / fault code.
- `spindle_bus_voltage_v`: float, V, ODrive S1. DC bus voltage reported by the ODrive. - `spindle_bus_voltage_v`: float, V, AK60 integrated actuator. DC bus / supply voltage reported by the actuator if exposed.
- `spindle_iq_a`: float, A, ODrive S1. Measured q-axis current / torque-producing current, if exposed over the selected interface. - `spindle_iq_a`: float, A, AK60 integrated actuator. Measured torque/current channel, if exposed over the selected interface.
- `spindle_motor_temp_c`: float, degC, ODrive S1 thermistor input. Motor thermistor temperature derived from the M8325s NTC 10k 3435, if enabled. - `spindle_motor_temp_c`: float, degC, AK60 integrated actuator. Motor/drive temperature telemetry, if exposed over the selected interface.
- `arm_angle_linearized_deg`: float, deg, Teensy from encoder + geometry. Crank-rocker linearized arm angle (§9.5); NaN if geometry not validated. - `arm_angle_linearized_deg`: float, deg, Teensy from encoder + geometry. Crank-rocker linearized arm angle (§9.5); NaN if geometry not validated.
- `force_setpoint_n`: float, N, setpoint generator. Current target force after modulation; this is the input to the Fz PID, not the PID actuator output. - `force_setpoint_n`: float, N, setpoint generator. Current target force after modulation; this is the input to the Fz PID, not the PID actuator output.
- `table_rpm_setpoint`: float, RPM, host command. Commanded table speed. - `table_rpm_setpoint`: float, RPM, host command. Commanded table speed.
- `spindle_rpm_setpoint`: float, RPM, host command. Commanded spindle speed magnitude. - `spindle_rpm_setpoint`: float, RPM, host command. Commanded spindle speed magnitude.
- `spindle_direction_setpoint`: enum, `cw` / `ccw`, host command. Requested toolhead spindle direction. - `spindle_direction_setpoint`: enum, `cw` / `ccw`, host command. Requested toolhead spindle direction.
- `spindle_direction_actual`: enum, `cw` / `ccw`, ODrive/firmware-derived. Actual observed or drive-reported spindle direction after sign mapping. - `spindle_direction_actual`: enum, `cw` / `ccw`, AK60/firmware-derived. Actual observed or actuator-reported spindle direction after direction mapping.
- `force_actuator_cmd`: float, V or mA, DAC output. Raw actuator command signal. - `force_actuator_cmd`: float, V or mA, DAC output. Raw actuator command signal.
- `estop_active`: bool, hardware. E-stop circuit state. - `estop_active`: bool, hardware. E-stop circuit state.
- `interlock_state`: uint16 bitfield, multiple. Packed interlock status bits. - `interlock_state`: uint16 bitfield, multiple. Packed interlock status bits.
@@ -1710,37 +1706,26 @@ Your controller must expose a static capability profile so upstream software kno
"notes": "Counterweight cancels head static weight; controller modulates residual differential only. Force PID closes on Fz from the Kunwei KWR75B-CAN 6-axis sensor." "notes": "Counterweight cancels head static weight; controller modulates residual differential only. Force PID closes on Fz from the Kunwei KWR75B-CAN 6-axis sensor."
}, },
"spindle_drive": { "spindle_drive": {
"system": "ODrive S1 + M8325s 100KV kit", "system": "CubeMars AK60-6 V1.1 KV80 integrated actuator",
"status": "selected_final", "status": "selected_final",
"drive": "ODrive S1", "actuator": "CubeMars AK60-6 V1.1 KV80",
"motor": "M8325s 100KV", "controller": "integrated AK-series drive/controller",
"encoder": "ODrive S1 onboard MA702 magnetic encoder with M8325s encoder magnet", "encoder": "integrated actuator sensing / vendor telemetry",
"control_mode_v1": "velocity", "control_mode_v1": "velocity",
"preferred_runtime_interface": "CAN 2.0B 1Mbps", "preferred_runtime_interface": "CAN, topology/IDs/rates/timeouts to freeze before firmware lock",
"supported_drive_modes": ["torque", "velocity", "position", "trajectory"], "supply_voltage_v_working_basis": 24,
"odrive_supply_range_v": [12, 48], "safety_stop_basis": "remove actuator power through safety-controlled post-contactor bus; CAN stop is not safety-rated",
"odrive_abs_max_v": 50.5, "rated_torque_nm_approx": 3,
"odrive_continuous_current_a": 40, "peak_torque_nm_approx": 9,
"odrive_control_loop_hz": 8000,
"odrive_pwm_hz": 24000,
"motor_kv_rpm_per_v": 100,
"motor_torque_constant_nm_per_a": 0.083,
"motor_pole_pairs": 20,
"motor_phase_resistance_ohm": 0.024,
"motor_phase_inductance_h": 0.0000099,
"motor_continuous_current_a_free_air": 40,
"motor_continuous_current_a_forced_air": 60,
"motor_peak_current_a_3s": 80,
"motor_thermistor": "NTC 10k 3435",
"required_firmware_items": [ "required_firmware_items": [
"saved_odrive_configuration", "saved_ak60_commissioning_parameters",
"velocity_command_scaling", "velocity_command_scaling",
"spindle_direction_sign_mapping", "spindle_direction_mapping",
"actual_rpm_telemetry", "actual_rpm_telemetry",
"drive_fault_mapping", "drive_fault_mapping",
"current_limit_configuration", "current_torque_limit_configuration",
"thermal_limit_configuration", "thermal_limit_configuration",
"brake_chopper_resistor_configuration_if_used" "safety_power_removal_bench_test"
] ]
}, },
"safety_limits": { "safety_limits": {
@@ -1765,7 +1750,7 @@ Your controller must expose a static capability profile so upstream software kno
"unknowns": [ "unknowns": [
"Z-axis drive control mapping pending confirmation on the SV2A-2150", "Z-axis drive control mapping pending confirmation on the SV2A-2150",
"Measured force loop bandwidth pending commissioning", "Measured force loop bandwidth pending commissioning",
"ODrive S1 + M8325s spindle package is selected; firmware command/telemetry mapping still to be documented" "AK60 command/telemetry mapping, CAN topology, safety power-removal behavior, and thermal/current limits still to be documented and bench-tested"
] ]
} }
``` ```
@@ -2142,16 +2127,16 @@ Every item flagged **"Preferred, confirm in detailed design"** or **"Open, Cédr
### 21.1 Zone 1 — Table (Control Interface) ### 21.1 Zone 1 — Table (Control Interface)
- Confirm the KBSI-240D opto-isolated interface as the DC-variator command path, or name the replacement. - Confirm the KBSI-240D opto-isolated interface as the DC-variator command path, or name the replacement.
- Confirm the table encoder transport (SSI (SC) / RS422) and the transceiver choice (MAX3490-class working basis). - Confirm BiSS-C frame details for the ordered table and arm encoders: timing, CRC/status bits, RS422 transceiver/pinout, shielding, and startup/error handling.
- Confirm whether the table drive or its command path changes electrically as part of the overhaul. - Confirm whether the table drive or its command path changes electrically as part of the overhaul.
### 21.2 Zone 2 — Spindle / Toolhead Drive (Control Interface) ### 21.2 Zone 2 — Spindle / Toolhead Drive (Control Interface)
- Define the ODrive runtime command and telemetry path to the controller. CAN 2.0B at 1 Mbps is the preferred baseline unless Cédric selects another ODrive-supported interface. - Define the AK60 runtime command and telemetry path to the controller. CAN is the working basis, but Cédric must freeze CAN topology, IDs, frame rates, stale-frame timeout, startup behavior, and error isolation before firmware lock.
- Define command scaling for spindle velocity setpoint, clockwise/counter-clockwise sign mapping, enable/disable, fault reset, and safe stop. - Define command scaling for spindle velocity setpoint, clockwise/counter-clockwise direction mapping, enable/disable, fault reset, ramp-to-zero / live-reversal policy, and safe stop behavior.
- Define the ODrive telemetry subset mapped into the host logs: actual RPM, drive state, drive error, DC bus voltage, q-axis current if available, and motor temperature if the thermistor is enabled. - Define the AK60 telemetry subset mapped into the host logs: actual RPM, actuator state, actuator error, bus/supply voltage, torque/current if available, and motor/drive temperature if available.
- Store/export the final ODrive configuration file or parameter dump with the machine software release. - Store/export the final AK60 commissioning parameter set with the machine software release.
- Define the spindle enable/fault I/O wired into the HOA + safety chain. - Define the spindle enable/fault I/O and the hardwired AK60 power-removal path through the HOA + safety chain; prove with a bench E-stop/power-loss test.
### 21.3 Zone 4 — Z-Axis / Force Actuator (Control Interface) ### 21.3 Zone 4 — Z-Axis / Force Actuator (Control Interface)

View File

@@ -18,4 +18,5 @@ Source-truth rule:
- These repo docs are implementation aids. - These repo docs are implementation aids.
- Approved P11 source specs and schemas outrank generated summaries. - Approved P11 source specs and schemas outrank generated summaries.
- 2026-07-06 source refresh: repo reference copy now reflects Raspberry Pi 5, AK60-6 V1.1 KV80, and ordered Renishaw/RLS BiSS-C encoders.
- If anything here conflicts with a source spec, ask Antoine before changing technical direction. - If anything here conflicts with a source spec, ask Antoine before changing technical direction.

View File

@@ -10,7 +10,7 @@ Core modules to implement:
- KWR75B-CAN decoder via isolated CAN transceiver; - KWR75B-CAN decoder via isolated CAN transceiver;
- table and arm encoder readers; - table and arm encoder readers;
- force PID and actuator output; - force PID and actuator output;
- ODrive command/telemetry path; - AK60 command/telemetry path;
- telemetry packet builder; - telemetry packet builder;
- fast interlocks and watchdogs. - fast interlocks and watchdogs.

View File

@@ -13,7 +13,7 @@ class SpindleDirection(StrEnum):
"""Toolhead spindle rotation direction using stable protocol/schema values. """Toolhead spindle rotation direction using stable protocol/schema values.
Physical convention: clockwise/counter-clockwise are as viewed from above the Physical convention: clockwise/counter-clockwise are as viewed from above the
toolhead looking down toward the mirror/tool contact. ODrive sign mapping is toolhead looking down toward the mirror/tool contact. AK60 direction mapping is
a commissioning item and must be configured so these UI/protocol values match a commissioning item and must be configured so these UI/protocol values match
the observed tool rotation. the observed tool rotation.
""" """

View File

@@ -133,12 +133,21 @@
], ],
"unknowns": [ "unknowns": [
"Exact KWR75B-CAN frame map, scaling, status bits, and update rate.", "Exact KWR75B-CAN frame map, scaling, status bits, and update rate.",
"Final ODrive runtime interface and command scaling.", "Final AK60 runtime interface, CAN topology/IDs/rates, command scaling, safety power-removal behavior, and commissioning parameters.",
"Final SV2A-2150 torque/current command scaling and Iq monitor mapping.", "Final SV2A-2150 torque/current command scaling and Iq monitor mapping.",
"Final safety relay model and wiring details." "Final safety relay model and wiring details."
], ],
"supported_spindle_directions": [ "supported_spindle_directions": [
"cw", "cw",
"ccw" "ccw"
] ],
"hardware_basis": {
"host": "Raspberry Pi 5 + touchscreen",
"real_time_controller": "Teensy 4.1",
"force_sensor": "Kunwei KWR75B-CAN",
"spindle": "CubeMars AK60-6 V1.1 KV80 integrated actuator",
"table_encoder": "RLS Artos DHR162, ordered P/N DHR162DB20BAAS30DA02 + SAR162C143AF14WAP00, BiSS-C/RS422",
"arm_encoder": "RLS Orbis BR10, ordered P/N BR10DCD14B12DH00 + BM120A190A1ABA00, BiSS-C/RS422",
"source_sync": "2026-07-06"
}
} }

View File

@@ -159,7 +159,7 @@
"cw", "cw",
"ccw" "ccw"
], ],
"description": "Toolhead spindle rotation direction, as viewed from above the toolhead looking down toward the mirror/tool contact. ODrive sign mapping is commissioned to match this physical convention." "description": "Toolhead spindle rotation direction, as viewed from above the toolhead looking down toward the mirror/tool contact. AK60 direction mapping is commissioned to match this physical convention."
} }
} }
} }