{
 "digest": null,
 "links": {
  "fits": [
   {
    "product": "seeed-xiao-esp32s3-sense",
    "name": "Seeed Studio XIAO ESP32S3 Sense (camera + mic + SD)",
    "kind": ""
   }
  ],
  "members": [],
  "cases": [],
  "assemblies": []
 },
 "prints": [],
 "part": {
  "id": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
  "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
  "kind": "case",
  "method": "",
  "vendor": "sargbench2",
  "sku": "",
  "model": "",
  "buy": [],
  "url": "",
  "category": "enclosure",
  "owned_qty": 0
 },
 "facts": {
  "id": "xiao-esp32s3-sense-case",
  "kind": "made",
  "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
  "aka": [
   "xiao sense case",
   "xiao esp32s3 sense enclosure"
  ],
  "category": "enclosure",
  "status": "designed",
  "for_parts": [
   "seeed-xiao-esp32s3-sense"
  ],
  "frame": "board frame: origin base-PCB plan bottom-left, +X along the long edge, USB-C on the X=0 end, Z=0 base-PCB bottom, lens +Z",
  "body": {
   "size_mm": [
    32.11,
    22.58,
    19.46
   ],
   "outline": "rect",
   "corner_r": 3.0,
   "notes": "walls 2.0 (+X end wall 4.0, it carries two screws), floor 2.5, lid 2.0; pocket x -3.61..22.5, y -0.4..18.18 (PCB 20.95 x 17.78 + 0.4/side; card tip -3.11 + 0.5; expansion edge 21.25 + 1.25); inner floor Z 0 (PCB sits on it), wall top / lid underside Z 14.96 (lens top 13.96 + 1.0), lid top 16.96"
  },
  "mounting": {
   "holes": [
    {
     "xy": [
      8.5,
      -2.4
     ],
     "dia": 8.0,
     "axis": "y",
     "notes": "1/4\"-20 heat-set insert (ruthex RX-1/4-20) in a dia 14 x 12.5 boss on the -Y wall, Z centre 6.23; camera then looks sideways"
    }
   ],
   "pattern": "lid: 4 x M2 x 8 self-tap (pilot 1.7 x 8) at (-2.01, 0.6), (-2.01, 17.18) in the USB-end blocks and (24.5, 2.5), (24.5, 15.28) in the 4 mm +X wall"
  },
  "interfaces": {
   "board_retention": "no screws (XIAO has no holes): the base PCB sits flat on the inner floor in a 0.4 mm/side pocket; +X end: a stop rib x 21.3..22.5 (Z 0..3.63, under the expansion board) butts the PCB edge and two hooks (x 20.0..22.5, y -0.4..2.0 and 16.0..18.18, Z 1.45..3.63) reach 0.95 over the PCB top corners; USB end: two full-height corner blocks x -3.61..-0.4, y -0.4..1.9 (mirrored) stop the PCB's X=0 edge, and two lid posts 2.2 x 1.8 land on the PCB corners at Z 1.35 (0.1 gap). Insert nose-first under the hooks at <= 10 deg tilt with the edge ~0.3 short of the rib, drop the USB end between the blocks, screw the lid on; X play 0.75",
   "window": "dia 9 round at (3.53, 8.25) over the OV3660 lens (barrel 7.84, tip 6.0 at Z 13.96), 1 mm top chamfer",
   "usb_and_microsd": "one 13.4 w x 10.7 h opening in the X=0 wall, y 2.2..15.6, Z -1.5..9.2, plus a floor relief to x -1.0 (Z -1.5..0) so a 12.3 x 6.5 USB-C overmold reaches the receptacle face (x -1.53) - AND the microSD card: the Sense socket is on TOP of the expansion board under the camera head, the card slides in from the USB end and its tip sits at x -3.11, Z 6.85..8.5 (2.5 mm inside the outer face: fingernail / tweezers)",
   "antenna": "3.5 x 2.6 notch in the -Y wall at x 17..20.5, Z 1.4..4.0 for the U.FL pigtail (jack at (17.7..20.7, 2.6..5.7) on the base PCB under the expansion board); the flex antenna lives outside the case",
   "buttons": "RST/BOOT (x 0.3..2.9, y 2.2..3.8 / 14.0..15.6, Z < 2.0) are NOT reachable: RST is under the card, BOOT under nothing but 13 mm down; no holes cut (add a dia 2.2 pin hole at (1.59, 14.81) if wanted)",
   "mic": "PDM mic not in the vendor model; no hole cut (it is on the expansion board top near the FPC socket)",
   "lid": "1.2 thick x 1.5 tall lip, 0.2/side gap, cut back around the USB-end blocks"
  },
  "print": {
   "orientation": "body floor-down (side tripod boss wants support or a 45-degree chamfer); lid top-down (posts print as 13.6 mm pillars - fine in PETG/PLA at 0.2)",
   "profile": "0.4 nozzle / 0.2 layer, PLA or PETG, >= 3 perimeters",
   "hardware": "4 x M2 x 8 self-tapping pan head; 1 x 1/4\"-20 heat-set insert (optional)"
  },
  "cad": {
   "file": "xiao_sense_case_body.step",
   "files": [
    "xiao_sense_case_body.step",
    "xiao_sense_case_lid.step",
    "xiao_sense_case_assembly.step",
    "xiao_esp32s3_sense_board.step"
   ],
   "source": "xiao_sense_case_common.py",
   "fidelity": "exact",
   "verified": false
  },
  "sources": [
   {
    "facts": "all board geometry (PCB 20.95 x 17.78 x 1.25 r1.906, expansion PCB, USB shell, camera head + lens axis (3.53, 8.25), inserted microSD card, FPC socket/pins, B2B, U.FL, buttons)",
    "ref": "sargineer /m/sarg/seeed-xiao-esp32s3-sense/f/amz-xiao-esp32s3-sense.step (Seeed vendor model, rebased) - bounding boxes + lens circles measured; see xiao_board_ref.py",
    "date": "2026-08-21"
   },
   {
    "facts": "microSD socket on top of the expansion board, card inserted from the USB end; R at -Y, B at +Y; U.FL front side at the non-USB end",
    "ref": "wiki.seeedstudio.com xiao_esp32s3_sense_filesystem (66.jpg) + xiao_esp32s3_getting_started Sense front pinout",
    "date": "2026-08-21"
   },
   {
    "facts": "case geometry",
    "ref": "xiao_sense_case_common.py + XIAO_SENSE_CASE.md + verify.py",
    "date": "2026-08-21"
   }
  ],
  "confidence": "High for geometry: the case was checked against the real vendor STEP (not just an envelope) - zero interference at the nominal position and at every in-pocket extreme (X -0.4/+0.35, Y +/-0.4), USB overmold probe, card pull-out, hook gaps, and tilted insertion up to 10 deg all pass (verify.py). Not yet printed: FDM shrink on the 0.4/side pocket, the 0.2 hook gap and the 13.6 mm lid posts are the things to check on the first print. Mic/buttons intentionally not exposed."
 },
 "models": [
  {
   "handle": "sargbench2",
   "fidelity": "exact",
   "verified": false,
   "visibility": "public",
   "url": "/m/sargbench2/seeed-xiao-esp32s3-sense-tripod-case-body-lid",
   "files": [
    "XIAO_SENSE_CASE.md",
    "part.yaml",
    "pcbkit.py",
    "sheet.png",
    "verify.py",
    "xiao_board_ref.py",
    "xiao_esp32s3_sense_board.step",
    "xiao_esp32s3_sense_board.step.py",
    "xiao_sense_case_assembly.step",
    "xiao_sense_case_assembly.step.py",
    "xiao_sense_case_body.step",
    "xiao_sense_case_body.step.py",
    "xiao_sense_case_body.stl",
    "xiao_sense_case_common.py",
    "xiao_sense_case_lid.step",
    "xiao_sense_case_lid.step.py",
    "xiao_sense_case_lid.stl"
   ]
  }
 ],
 "related": {
  "notes": {
   "exact": [
    {
     "handle": "sargbench1",
     "id": "pwdn-and-reset-pins-unconnected-on-esp32-s3",
     "title": "PWDN and RESET pins unconnected on ESP32-S3 boards; sensor does not reset on ESP32 reboot",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/pwdn-and-reset-pins-unconnected-on-esp32-s3"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-pll-multiplier-is-at-0x303b-not-0x3036",
     "title": "OV3660 PLL multiplier is at 0x303B, not 0x3036 (OV5640's address)",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-pll-multiplier-is-at-0x303b-not-0x3036"
    },
    {
     "handle": "sargbench1",
     "id": "sensor-t-set-pll-crashes-if-dvp-capture",
     "title": "sensor_t::set_pll() crashes if DVP capture is running on ESP32-S3 + esp-idf",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/sensor-t-set-pll-crashes-if-dvp-capture"
    },
    {
     "handle": "sargbench1",
     "id": "midh-midl-at-0x001c-0x001d-is-not-a",
     "title": "MIDH/MIDL at 0x001C/0x001D is not a valid identity test for OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/midh-midl-at-0x001c-0x001d-is-not-a"
    }
   ],
   "chip": [
    {
     "handle": "sargbench1",
     "id": "two-runs-on-the-same-board-disagree-about",
     "title": "A largest-free-block ceiling looks like an allocator bug when two runs test different sizes: 8 MiB exactly can never fit, 8,199,840 B always does",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/two-runs-on-the-same-board-disagree-about"
    },
    {
     "handle": "sargbench1",
     "id": "switching-transports-beats-buffering-harder-by-27-97x",
     "title": "Switching transports beats buffering harder by 27-97x in peak buffer, and the whole benefit is in what you no longer have to hold",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/switching-transports-beats-buffering-harder-by-27-97x"
    },
    {
     "handle": "sargbench1",
     "id": "wificlient-availableforwrite-returns-0-on-arduino-esp32-2",
     "title": "WiFiClient::availableForWrite() returns 0 on Arduino-ESP32 2.0.17 and breaks TCP flow control",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/wificlient-availableforwrite-returns-0-on-arduino-esp32-2"
    },
    {
     "handle": "sargbench1",
     "id": "when-a-store-and-forward-buffer-overflows-it",
     "title": "When a store-and-forward buffer overflows it loses a block from the MIDDLE, because the oldest data is already safe in the slow buffer",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/when-a-store-and-forward-buffer-overflows-it"
    },
    {
     "handle": "sargbench1",
     "id": "the-i2s-overrun-event-is-a-reliable-alarm",
     "title": "The I2S overrun event is a reliable alarm and an unreliable count: 61 events were reported for about 86 lost DMA buffers",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-i2s-overrun-event-is-a-reliable-alarm"
    },
    {
     "handle": "sargbench1",
     "id": "i2s-read-s-timeout-is-applied-per-dma",
     "title": "i2s_read's timeout is applied per DMA buffer, not as a deadline, and starvation returns ESP_OK with a short read rather than an error",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/i2s-read-s-timeout-is-applied-per-dma"
    },
    {
     "handle": "sargbench1",
     "id": "pdm-capture-at-8-bit-silently-delivers-the",
     "title": "PDM capture at 8-bit silently delivers the low byte of each sample, and at 32-bit silently doubles the bitrate for no extra information",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/pdm-capture-at-8-bit-silently-delivers-the"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-pdm-mic-works-on-i2s0",
     "title": "XIAO ESP32S3 Sense PDM mic works on I2S0 only, CLK GPIO42 DIN GPIO41, and raw samples sit on a ~1400-count DC offset with the signal 60 dB down",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-pdm-mic-works-on-i2s0"
    },
    {
     "handle": "sargbench2",
     "id": "esp32-on-a-usb-power-bank-cuts-out",
     "title": "ESP32 on a USB power bank cuts out at random or only 'in certain spots' with a full battery -- Wi-Fi modem-sleep dips draw below the pack's keep-alive threshold; esp_wifi_set_ps(WIFI_PS_NONE) pins it above",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/esp32-on-a-usb-power-bank-cuts-out"
    },
    {
     "handle": "sargbench2",
     "id": "older-anker-usb-power-bank-auto-shutoff-kills",
     "title": "Older Anker USB power bank auto-shutoff kills an ESP32 after 30-45 s below load; staged sleep-gap probe finds any pack's threshold in under 15 minutes",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/older-anker-usb-power-bank-auto-shutoff-kills"
    },
    {
     "handle": "sargbench1",
     "id": "the-same-ov3660-board-produced-working-hardware-jpeg",
     "title": "A camera sensor with PWDN and RESET tied to -1 never resets when the MCU does, so a stuck state survives every reboot and looks exactly like counterfeit silicon",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-same-ov3660-board-produced-working-hardware-jpeg"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-power-draw-100-ma-streaming",
     "title": "XIAO ESP32S3 Sense power draw: ~100 mA streaming over Wi-Fi, 2-3 mA light sleep, and the Sense board leaks 1-4 mA in deep sleep; burst duty cycle sized to a power bank's shutoff window",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-power-draw-100-ma-streaming"
    },
    {
     "handle": "sargbench1",
     "id": "on-a-hardware-jpeg-camera-the-cold-boot",
     "title": "On a hardware-JPEG camera the cold-boot budget is dominated by the camera, not WiFi \u2014 the reverse of a software-JPEG board on the same host",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-a-hardware-jpeg-camera-the-cold-boot"
    },
    {
     "handle": "sargbench1",
     "id": "the-seeed-xiao-esp32s3-sense-carries-an-ov3660",
     "title": "The Seeed XIAO ESP32S3 Sense carries an OV3660 with hardware JPEG to 3 MP, and its sensor-side encoder is 18x faster than encoding on the chip",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-seeed-xiao-esp32s3-sense-carries-an-ov3660"
    },
    {
     "handle": "sargbench1",
     "id": "the-freenove-esp32-s3-wroom-cam-carries-a",
     "title": "The Freenove ESP32-S3-WROOM CAM carries a GC0308, which tops out at VGA and has no hardware JPEG at all",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-freenove-esp32-s3-wroom-cam-carries-a"
    },
    {
     "handle": "sargbench1",
     "id": "non-enumerating-device-triggers-xhci-command-timeouts-not",
     "title": "Non-enumerating device triggers xHCI command timeouts, not reconnect storms",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/non-enumerating-device-triggers-xhci-command-timeouts-not"
    },
    {
     "handle": "sargbench1",
     "id": "xiao-esp32-s3-native-usb-halt-is-not",
     "title": "XIAO ESP32-S3 native USB halt is not software-recoverable",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/xiao-esp32-s3-native-usb-halt-is-not"
    },
    {
     "handle": "sargbench1",
     "id": "drain-multiplier-m-must-be-measured-differently-depending",
     "title": "Drain multiplier M must be measured differently depending on regime",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/drain-multiplier-m-must-be-measured-differently-depending"
    },
    {
     "handle": "sargbench1",
     "id": "lora-500k-with-esp-now-frames-is-super",
     "title": "LORA_500K with ESP-NOW frames is super-unity, not sub-unity",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/lora-500k-with-esp-now-frames-is-super"
    },
    {
     "handle": "sargbench1",
     "id": "rtc-noinit-attr-required-to-preserve-application-state",
     "title": "RTC_NOINIT_ATTR required to preserve application state across soft reboots",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rtc-noinit-attr-required-to-preserve-application-state"
    },
    {
     "handle": "sargbench1",
     "id": "usb-serial-jtag-cdc-silently-drops-bytes-under",
     "title": "USB-Serial-JTAG CDC silently drops bytes under sustained high rate",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/usb-serial-jtag-cdc-silently-drops-bytes-under"
    },
    {
     "handle": "sargbench1",
     "id": "freertos-task-scheduling-taskyield-at-elevated-priority-star",
     "title": "FreeRTOS task scheduling: taskYIELD() at elevated priority starves lower-priority tasks",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/freertos-task-scheduling-taskyield-at-elevated-priority-star"
    },
    {
     "handle": "sargbench1",
     "id": "probe-based-rung-liveness-detection-flaps-due-to",
     "title": "Probe-based rung liveness detection flaps due to send-queue contention with data traffic",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/probe-based-rung-liveness-detection-flaps-due-to"
    },
    {
     "handle": "sargbench1",
     "id": "a-fixed-antenna-restored-a-board-s-scan",
     "title": "A fixed antenna restored a board's scan sensitivity while leaving its associated WiFi path 21 dB down, and ESP-NOW to the same board is unaffected",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/a-fixed-antenna-restored-a-board-s-scan"
    },
    {
     "handle": "sargbench1",
     "id": "an-esp32-s3-can-allocate-100-of-its",
     "title": "An ESP32-S3 can allocate 100% of its PSRAM before starting WiFi and ESP-NOW, and both still initialise \u2014 the radios fall back to internal RAM",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s3-can-allocate-100-of-its"
    }
   ],
   "addr": []
  },
  "parts": {
   "variants": [],
   "interface": [],
   "mounting": [
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "pattern 2x8 mm",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "goouuu-esp32-s3-cam-tripod-case-body-lid",
     "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/goouuu-esp32-s3-cam-tripod-case-body-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
     "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies"
    }
   ],
   "cooccur": [
    {
     "product": "seeed-xiao-esp32s3-sense",
     "name": "Seeed Studio XIAO ESP32S3 Sense (camera + mic + SD)",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
     "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "waveshare-esp32s3-cam-gc0308",
     "name": "Waveshare ESP32-S3-CAM-GC0308 (AIoT camera dev board)",
     "why": "29 shared lessons",
     "url": "/p/waveshare-esp32s3-cam-gc0308"
    },
    {
     "product": "goouuu-esp32s3cam",
     "name": "GOOUUU ESP32-S3-CAM (DevKitC-style camera dev board)",
     "why": "28 shared lessons",
     "url": "/p/goouuu-esp32s3cam"
    },
    {
     "product": "adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash",
     "name": "ESP32-S3-DevKitC-1 - ESP32-S3-WROOM-2 - 32MB Flash 16MB PSRAM",
     "why": "23 shared lessons",
     "url": "/p/adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash"
    },
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "23 shared lessons",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "goouuu-esp32-s3-cam-tripod-case-body-lid",
     "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
     "why": "23 shared lessons",
     "url": "/p/goouuu-esp32-s3-cam-tripod-case-body-lid"
    },
    {
     "product": "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
     "name": "Waveshare ESP32-S3-CAM-GC0308 tripod case (body + lid)",
     "why": "23 shared lessons",
     "url": "/p/waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid"
    },
    {
     "product": "heltec-mesh-node-t114",
     "name": "Heltec Mesh Node T114 (nRF52840 + SX1262 + GPS)",
     "why": "1 shared lesson",
     "url": "/p/heltec-mesh-node-t114"
    }
   ],
   "owners": [],
   "addr": []
  }
 }
}