LuxLibre

FlashKa Keychain v0.7 - housing notes

Status: designed and checked in CAD only. Nothing of v0.7 has been made yet; every picture is a render and every number below comes from the model (tools/housing/flashka_housing.py, class P) or from one of its checks (docs/checks/), unless it is marked as a maker’s figure.

1. Files

Where What
tools/housing/flashka_housing.py the parameter table P, every part, all checks; writes the STEP/STL files and cad/housing_interface.json
tools/housing/drawings.py the nine drawing sheets (DXF, PDF, PNG) and the dimension table; every printed number is checked against P and against the solids
tools/housing/key_mould.py the two casting moulds of the side keys - resin (SLA, the default) and aluminium (the durable option) - and their checks; writes the mould STEP / STL files, _ref_mould_*.stl and cad/key_mould_checks.json
tools/housing/fit_pcb.py fit check of the real main board and key board (KiCad STEP exports) in the housing, with the wire paths
tools/housing/assemble.py cad/FlashKa_assembly_reference.step: housing, both boards, keys, TIR optic, the cell with its strips, pads, screws, bought-part stand-ins
tools/housing/render.py, render_anim.py the renders (renders/, README set in assets/v07/) and the two GIFs
tools/housing/laser_label.py optional lid laser label (only for lights sold or given to others)
tools/housing/order_files.py copies the order files (STEP, STL, drawing PDFs) from cad/ into order_files/ and the check files into docs/checks/; flashka_housing.py, key_mould.py and drawings.py call it whenever they write into cad/
cad/ STEP + STL of every part in the housing frame, _ref_*.stl stand-ins for the pictures, the two machining kits (STEP, kit frame), the side key with its stiffener (STEP), the casting moulds, drawings, drawings_dimension_table.txt, housing_interface.json, the assembly STEP; the board STEPs and pcb_placement*.json belong to the PCB tools
order_files/2_JLCCNC/ tray, lid, the PMMA kit and the POM-C kit (for JLCCNC), the single PMMA and POM-C parts (for shops that take small parts): STEP + PDF, README
order_files/3_rubber_keys/ side key (rubber body, stiffener, both together) + drawing; resin mould (two STL for JLC3DP + closed STEP); aluminium mould (closed, cavity half, lid) + drawing; README with the casting steps
order_files/optional_laser_label/ label DXF + preview, README
docs/checks/ housing_v07_build_checks.txt, housing_v07_drawings_dimension_table.txt, key_mould_v07_checks.json, fit_pcb_v07_report.txt/.json

Drawings: FK-H-01 tray (2 sheets), FK-H-02 lid, FK-H-03 main key (PMMA), FK-H-04 side key (cast rubber + glued stiffener), FK-H-05 POM-C parts, FK-H-06 PMMA machining kit, FK-H-07 POM-C machining kit, FK-H-08 casting moulds of the side keys (aluminium, with the resin version beside it). Each title block carries “FlashKa Keychain v0.7” and the file name(s).

Coordinates: X = 0 at the front face of the 99.2 mm body, +X to the tail; Y = 0 on the centre line, -Y control side (USB-C), +Y laser side; Z = 0 on the bottom facet. The KiCad boards keep the coordinates of the first v0.7 layout (a 94.4 mm body): housing X = board X + 2.75 (PCB_DX). cad/housing_interface.json gives pcb_outline, components and key_board in that board frame (entry pcb_frame), everything else in the housing frame.

2. Rebuild

Run in tools/housing/ (CadQuery 2.x, ezdxf, PyMuPDF, VTK 9, trimesh; renders under xvfb-run):

python3 flashka_housing.py ../../cad > ../../docs/checks/housing_v07_build_checks.txt     # parts, kits + checks, about 3 min
python3 key_mould.py ../../cad
python3 drawings.py ../../cad ../../cad --quiet
python3 fit_pcb.py ../../cad/FlashKa_main_pcb.step ../../docs/checks --kb-step ../../cad/FlashKa_keys_pcb.step \
    --kicad-pcb ../../kicad/FlashKa_main/FlashKa_main.kicad_pcb --kb-kicad-pcb ../../kicad/FlashKa_keys/FlashKa_keys.kicad_pcb
python3 assemble.py ../../cad ../../cad/FlashKa_main_pcb.step --kb-step ../../cad/FlashKa_keys_pcb.step \
    --kicad-pcb ../../kicad/FlashKa_main/FlashKa_main.kicad_pcb
xvfb-run -a python3 render.py ../../cad ../../renders --pcb-step ../../cad/FlashKa_main_pcb.step \
    --kb-step ../../cad/FlashKa_keys_pcb.step --kicad-pcb ../../kicad/FlashKa_main/FlashKa_main.kicad_pcb --assets ../../assets/v07
xvfb-run -a python3 render_anim.py --pcb-step ../../cad/FlashKa_main_pcb.step --kb-step ../../cad/FlashKa_keys_pcb.step \
    --kicad-pcb ../../kicad/FlashKa_main/FlashKa_main.kicad_pcb
python3 laser_label.py                                                                    # optional label only

The order folders get copies of the STEP / STL files and drawings (PDF names = STEP base names; the POM-C sheet is FlashKa_pom_parts.pdf, the side key sheet FlashKa_key_side.pdf, the kit sheets FlashKa_pmma_kit.pdf and FlashKa_pom_kit.pdf, the mould sheet FlashKa_key_mould.pdf). flashka_housing.py, key_mould.py and drawings.py refresh these copies, the dimension table and the mould checks in docs/checks/ every time they write into cad/ (order_files.py; run it alone after changing cad/ by hand), so no order file can stay behind its source. render.py and render_anim.py read the copper pads of the key board from ../../kicad/FlashKa_keys/FlashKa_keys.kicad_pcb (option --kb-kicad-pcb).

3. Design

3.1 Exterior: the octagon

Body: a faceted octagon 20 wide x 18 high x 99.2 long (tray + lid), aluminium 6061-T6, bead blast, black anodise, no marking. Eight flat facets with 45 degree legs of 3.4 mm: bottom facet (the key face) and top facet (the lid) 13.2 wide, side facets 11.2 high, four diagonal facets 4.81 wide. The owner chose one 14500 cell and this body in place of the 20 x 16 rectangle with its 1.5 mm chamfer frame and the two pouch cells; length, style and every approved detail stay. Outline perimeter 68.033 mm, section area 336.88 mm2.

Three proportions of the same 20 x 18 octagon were rendered (front and three-quarter views, hero camera): legs 3.0 (facets 14.0 / 12.0 / 4.24), 3.4 (13.2 / 11.2 / 4.81) and 3.8 (12.4 / 10.4 / 5.37). The 3.4 legs were built: with 3.0 the body still reads as a rectangle with chamfered edges; 3.8 reads as an octagon too, but the bottom facet then keeps only 0.4 mm of frame beside the key bezel (11.6 wide at the face) and the chamfer of the USB-C opening ends 0.1 above the lower diagonal facet. The 3.4 legs leave a 0.8 frame on both sides of the bezel, 0.5 of side facet under the USB-C chamfer and diagonal facets wide enough to catch the light.

Length chain (X): head 11.45 + 0.1 gap + main board 24.0 + antenna 5.4 + 0.8 gap + bay 51.6 + tail 5.85 = 99.2.

3.2 Head: TIR optic, LED board, laser

3.3 Cell bay and wire paths

3.4 Keys

All three keys sit on the centre line of the bottom facet at X 18.65 / 25.65 / 32.65 (next / main / previous; board frame 15.9 / 22.9 / 29.9), in one stadium bezel 0.5 deep with 45 degree walls (X 15.75 to 35.55, 11.6 wide at the face, 0.8 of frame to the facet edges).

3.5 Key board (KB) and floor

3.6 Pogo pins and main-board hold-down

3.7 Other parts

3.8 Thermal-model inputs (for the firmware’s thermal simulator)

From the solids (thermal_model_inputs in cad/housing_interface.json): aluminium tray 22.49 g + lid 8.43 g = 30.91 g (6061-T6, 2.70 g/cm3); outer surface of the closed light 7382.1 mm2 (envelope with the facets), of it 6886.3 mm2 aluminium (minus the optic, laser, key, RF window, USB-C, S2 and lanyard openings); the panel texture adds 625.2 mm2 of face area; head block (tray X 0 to 11.45) 6.34 g, the lid over it 1.05 g, the solid behind the LED board (X 8.83 to 11.45) 1.72 g; LED board to head contact 78.51 mm2 (d10 board on the bore floor, 0.1 mm paste); copper DTP board 1.13 g. The LED board’s edge is 1.175 from the -Y side facet, 2.619 from the lower -Y diagonal facet, 3.0 from the bottom facet, 1.6 under the head-block top (the lid lies on it) and 5.0 under the top facet. Cell: about 22 g (maker), axis Y 0, Z 8.712, X 42.15 to 91.15; two line contacts along the rails (|Y| 3.5, X 44.75 to 90.35) through 0.05 polyimide, foam to the lid, strips and wires to the board: weakly coupled.

3.9 Machining kits (JLCCNC)

JLCCNC machines plastic parts only from 30 x 20 x 8 mm (rotary parts: longer than 20 mm, more than 6 mm in diameter); the PMMA main key and every POM-C part are smaller. Two kits carry them, each one solid piece: a frame with one through-pocket per part, every part hanging on small tabs in one tab plane. The single-part files stay for shops that take small parts.

3.10 Casting moulds of the side keys (key_mould.py, FK-H-08)

A vacuum-casting mould would cost more than two small keys justify, so the builder casts them at home, 4 keys per pour (2 + 2 spares), in a mould that is a tool and not a part of the light (one per builder). Both versions have the same cavities: the cavity half holds the keys face down, so the chevron is a groove in the cavity floor (R0.3, the smallest internal radius) and bubbles rise away from the visible face; the parting plane is the inner face, and the lid’s plateaus form the plate recesses. Per cavity a pour hole, a runner and a gate on the near flange end, a vent groove at the far end and a vent hole through the plateau: every stub lands on the flange end or the hidden inner face. Walls with 1 degree of draft; the cap sits 0.04 per side under nominal, so the cast cap stays inside its -0.05/-0.15 tolerance at every height (4.086 / 4.12 wide, 9.886 / 9.92 long near the face / at the flange step). The keys and the moulds did not change with the octagon body.

4. Check results

Check Result Margin / limit
Interference, stand-in boards (3 main-board poses, KB, KB vs main board, part to part) none -
Cell with its strips and joints in the bay (F15 at its lower / nominal / upper limits, K10 at its lower / upper limits, largest flat-top 14500 14.5 x 50.4) vs tray, lid, RF insert, antenna spacer 0 mm3 each gap under the lid 1.004 to 0.251, length left for the tail pad 2.1 to 0.4, side gap 1.6 to 1.25
Optic seat front face X 0.2 (0.0 to 0.4), LED board X 7.13 to 8.73, bore floor X 8.83, 2.62 solid behind it 2.0 required; exit clear to 61.9 degrees
LED wire paths (d1.05 wire along groove + hole) 0 mm3 with the tray; 0.125 (upper) / 0.088 (lower) to the tray, 0.175 to the LED board and the optic holder radial play 0.3, hole play 0.225
Cell wires far-end channel: free radius 1.046 round a d1.05 wire; rebate 3.9 x 4.4 (3.6 under the board), 2.66 wide at the spacer front two wires side by side 2.1 x 1.05: margins 0.56 / 2.55
Metal under texture and grooves min 1.0 under every panel, 1.076 under the tray tail grooves, 1.2 under the lid tail grooves, 1.352 under the head grooves limits 0.9 over the cell bay, 1.0 elsewhere
Key free play at rest 0.15 main, 0.25 side; no contact before full travel (0.4 / 0.5) main: pocket floor 0.25 below a full-height switch box at full travel; side: doubler top 0.15, plate top 0.45 below the switch body
Key free play over the tolerance stack main worst case -0.07 to 0.37 (RSS 0.033 to 0.267); side -0.05 to 0.55 (RSS 0.119 to 0.381) a negative worst case is a small preload, below the 0.20 click travel
LED gap to the main key 0.6 at rest, 0.2 at full travel; RSS minimum 0.051, worst case -0.08 with the 0.85 mm worst-case LED height
Side key pressed 2 mm from its end (plate + doubler glued in) 1.035 N at the click, 0.729 key travel (0.806 at full travel); near end rises 0.9, 1.55 below the KB (1.45 at full travel, 1.21 at the RSS-maximum free play); key end shifts 0.082-0.113 in its 0.15 end gap; no contacts rubber only (no plate): 3.933 travel, 5.09 rise, would touch the KB
Pogo working height / force see 3.6 0.06 / 0.06 to the 3.7-4.2 range
Hold-down see 3.6 ledge lift limit 0.02 mm
Insertion of the main board (tilted about X, S2 side first) no collisions; the board meets the plunger tips from 9 degrees and compresses them -
Walls (every metal wall >= 0.5, JLCCNC’s absolute minimum) front lid taps: 0.51 to the optic bore floor and 0.51 to the head rear face at the thread root (3D, thread cut to its root), 0.685 at the tap drill; upper LED wire groove to the head-block top 0.751, hole 0.914; lower groove / hole to the lower -Y diagonal facet 1.304 / 1.363; optic bore to the -Y side facet 1.125, to the lower -Y diagonal 2.569, to the laser bore 1.8; laser bore to the +Y side facet 1.1, to the lower +Y diagonal 1.652; side walls, floor, diagonal walls and lid plate 1.5; lid over the head and tail blocks 3.4; RF pocket to the upper diagonal facets 0.919, to the top 0.9; front corner relief to the side facet 1.1; floor under the bezel 1.0, floor webs 1.3, KB boss wall 0.9, KB tap to bezel 1.254, bezel edge to floor RF window 0.8; tail front wall 0.8, lanyard bridge 1.45, slot to rear tap 1.4 at the thread crest; laser set-screw thread to the front lid tap 3.05; on the lid’s top face 0.3 between a rear countersink and the slot chamfer all from min_walls in the build log
Laser set screw and the closed light M1.6 x 5 from the head-block top under the lid: hole 0.5 behind the lid edge, screw top 0.771 below the head-block top, thread 5.836; ray scan of the closed light (10873 rays from below, 11798 from above): no hole deeper than 0.6 outside the key openings, the joints of the two RF plugs, the tail window and the four lid screws laser_retention in the build log
RF windows lid 6.9 x 10.8 (X 34.55 to 41.45), floor 5.1 x 10.8 (X 36.35 to 41.45); the antenna end of the module (X 35.55 to 40.95) lies under both; across it, Y -5.4 to 5.2 of the module’s -8.0 to 5.2 is free of metal rf_windows in the build log
Machining kits bounding boxes 52.8 x 22.0 x 8.5 and 45.4 x 39.3 x 17.0 (minimum 30 x 20 x 8); one valid solid each; gap part to frame 3.0 (4.917 at the antenna spacer); volume balance exact; parts identical to the single files; two-setup reach: 652 + 786 points on 210 + 243 faces, 0 blocked machining_kit_checks in the build log
Casting moulds aluminium: cavity half and lid one valid solid each, 48 x 28 x 8.0 / 8.47; two-setup reach 0 blocked. Resin: one valid solid each, 48 x 28 x 8.5 (with the pins) / 5.47; 2.002 of resin between a cavity and the back pockets, 1.25 round the holes. Both: closed, the halves overlap 0; no undercut (rays from 448 points on 132 cavity faces and 112 points on 36 plateau faces, 0 blocked); cast key = model key, cap inside its tolerance key_mould_v07_checks.json
Drawings 574 entries, 441 distinct numbers on nine sheets, 0 differ from P; 74 ray probes into the solids, 0 differ; 0 layout findings tolerance 6e-4

5. Real boards (fit_pcb_v07_report.txt)

Both boards from the PCB tools (FlashKa_main_pcb.step, FlashKa_keys_pcb.step), moved 2.75 along X from their board frame, unchanged: main board 58 solids + stand-ins for U4, J1, L1; key board 20 solids, lifted by 4.4 mm; the pogo pins (one solid each, free height) are split into barrel and plunger. The boards fit the octagon body without any change to them: the board zone keeps the old inside width (17.0 between straight walls up to Z 14.6).

6. Deviations from the specification

7. Open points and risks