For Agents
Reverse-chronological session log. Newest entries at top, grouped by date (
## YYYY-MM-DD). Each bullet: one piece of work, short summary, wikilinks to docs touched. Updated byobsidian-documenteron every project doc write. Read byhistorianat bootstrap.
2026-09-03
- ⭐ “Full speed” is a code constant, not a power limit — and it cancelled a purchase.
MAX_RATE_DEG_S = 60.0finsrc/main.cppcaps slew at 60 °/s. An MG996R at 6 V does 0.14 s/60° ≈ ~430 °/s, so the rig runs at roughly 1/7 of the servo’s mechanical capability. The XL4015 at 6.0 V has never browned out and no current draw has ever been measured — there is no evidence of a power problem at all. ✅ Cancelled on the strength of this: a UBEC and a 2200 µF bulk capacitor, which were about to be ordered to fix a limitation that lives in a literal. ⛔ PREREQUISITE, not a follow-up:ANGLE_MIN_DEG/ANGLE_MAX_DEGare still at the untouched0/180defaults. A servo driven into a hard stop stalls at full current and strips its gears in seconds, and faster slew makes hitting a stop MORE likely — so real mechanical limits must be set before the rate is raised, not after. General lesson: before buying hardware to raise a ceiling, check whether the ceiling is a literal in the source — Full Speed Is a Code Constant, Not a Power Limit - ⚠️ Confirmed by exhaustive search: there is NO sender/receiver split in lightaim. It is ONE ESP32-S3, all wired — the joystick is cabin-mounted on a 4-wire run (
W9) back to the same board that drives the servo. There is no sender, no receiver and no radio link anywhere in the project. A battery-powered joystick “sender” is a brand-new idea introduced 2026-09-02 with no transport chosen (not WiFi, not ESP-NOW, not BLE, not LoRa) — recorded as a proposal, not as existing architecture. Any note or agent output describing a lightaim “sender” is describing something that does not exist. Relevant prior decision that happens to help: the joystick was put onGPIO1/ADC1 specifically so WiFi could be added later without re-routing a wire — Receiver Split — and a Proposal That Might Add One
2026-09-02
- Recorded that this project’s Parts Gap — Not Yet Ordered is confirmed against physical stock, in the new vault-level inventory. Two things it settles: (1) the MINI560-5V-5A (
100.423.75, 552 Ft) is wanted independently by the KrakenSDR car rig too — the Pi 5 browns out at 5 V/3 A (2026-08-26-krakensdr-field-test-milestone) — so buy at least 2; this is the first cross-project duplicate an inventory has caught. (2) ⚠️ The single XL4015 in the house is currently set to 6.0 V for this bench and is a configured part, not free stock — anything that borrows it must set the pot back or this servo rail is silently wrong next power-up. Also confirmed genuinely absent and therefore blocking the vehicle build: the SMBJ33A TVS, the 2 A fuse and the reverse-polarity part. ⚠️ Soldering is not a blocker — 3 irons are owned (models unknown, undocumented anywhere until now), correcting four earlier agent runs that concluded otherwise — inventory
2026-08-12
- lightaim is WORKING END TO END ON THE BENCH. Joystick-aimed vehicle light: ESP32-S3-WROOM-1 + CJOY-XYSW (X axis only,
GPIO1/ADC1) + MG996R onGPIO5. The load-bearing decision is velocity control, not position control — stick deflection sets the rotation rate and the angle is integrated (angleDeg += n * MAX_RATE_DEG_S * dt), so releasing the stick leaves the light where you aimed it; position control was rejected because it would snap back to centre. Verifiedcentre=2065, ±2 counts rest noise, full sweepraw 0–4095→x −1.00…+1.00over 96 clean samples — lightaim - Bug found and fixed:
SERVO_RES_BITSmust be 14, not 16. The ESP32-S3’s LEDC peripheral caps duty resolution at 14 bits (classic ESP32 does 20). At 16,ledcSetup()refuses andledc_get_duty(745): LEDC is not initializedfollows — no servo output at all while the rest of the firmware looks perfectly healthy. 14 bits still gives 1.22 µs resolution on a 20 ms frame. Plus three more reusable gotchas:uvx --from platformioneeds--with pip(PlatformIO shells out topip; alsorm -rf ~/.platformio/packages/tool-esptoolpyafter a failed run), the S3 bootloader flashes at0x0not0x1000, and only the CH343 UART port (1a86:55d3) can flash a running S3 — the native USB/OTG port (303a:4001) givesNo serial data received, the same trap as 2026-08-11-ruview-esp32-csi-real-hardware — 2026-08-12-lightaim-bench-bringup - Three hardware hazards documented. ⚠️ The joystick’s
+5Vsilkscreen pad must go to3V3— it’s a resistive divider whose wiper rises to whatever feeds it, so 5 V puts 5 V on a 3.3 V ADC pin and damages it. ⚠️ SetANGLE_MIN/MAX_DEGto the real mechanical limits before bolting anything to the horn — a stalled MG996R strips its gears in seconds. ⚠️ Never power the servo from the board’s 5 V pin (~2.5 A stall browns out the MCU); the split supply is why no bulk cap was needed on the bench. Common ground between rails is mandatory (W4 bench / W10 vehicle) — lightaim - Wiring captured in WireViz (
wiring/bench.yml+wiring/vehicle.yml→ png/svg/html/bom.tsv). Chose WireViz over Fusion Electronics: no Fusion MCP for the electronics workspace, and it’s PCB-oriented EDA needing custom library symbols for the XL4015 / CJOY / MG996R — heavy for six wires. Extends pipeline — lightaim - Parts gap logged + one open decision. The HESTORE order has only one buck (
100.479.44XL4015 ×1); the vehicle config needs a second 5 V converter (recommend MINI560-5V-5A,100.423.75— fixed output, no pot to mis-set) plus 2 A fuse, SMBJ33A TVS and reverse-polarity protection — do not run both rails off the single XL4015. Automotive 12 V is 13.8–14.4 V running, 6–9 V cranking, 35–40 V+ load dump vs the XL4015’s 38 V ceiling. Open: parked vs moving — at speed, wind load makes the servo fight continuously and wants a worm drive or DS5160; cutting PWM when idle is rejected because an unpowered servo has no holding torque — lightaim - Initialized activity log and project folder.