abse/museair-usb
USB-C–powered ESP32-C3 controller board with AP63203 buck conversion, AP2112K 3.3V regulation, I²C SEN62 sensor interface, status LED, buttons, UART/I²C headers, and extensive decoupling.
- Version
- 0.5.7
- License
- unset
- Stars
- 0
scripts/check-top-service-mechanics.py
from pathlib import Path
exec((Path(__file__).resolve().parent/'horizontal-cad-support.py').read_text())
exec((Path(__file__).resolve().parent/'horizontal-layout.py').read_text())
from OCP.TopAbs import TopAbs_SOLID
h=OUT;parts={}
for n in ['sensor','carrier','case-base','case-lid','ask-button']:
r=STEPControl_Reader();assert r.ReadFile(str(h/'enclosure'/f'{n}.step'))==1;r.TransferRoots();parts[n]=r.OneShape();assert BRepCheck_Analyzer(parts[n]).IsValid(),n
checks={};pcb=block(-35+PCB_X_SHIFT_MM,-23,37,70,46,1.6)
for a,b in [('sensor','carrier'),('sensor','case-base'),('sensor','case-lid'),('carrier','case-base'),('carrier','case-lid'),('case-base','case-lid')]:
v=volume(BRepAlgoAPI_Common(parts[a],parts[b]).Shape());checks[a+'/'+b]=v;assert v<.01,(a,b,v)
for n in ['case-base','case-lid','carrier']:
v=volume(BRepAlgoAPI_Common(parts[n],pcb).Shape());checks[n+'/pcb-envelope']=v;assert v<.01,(n,v)
ex=TopExp_Explorer(parts['case-base'],TopAbs_SOLID);solids=0
while ex.More():solids+=1;ex.Next()
assert solids==1,('base not one solid',solids)
mounts=[(-y+PCB_X_SHIFT_MM,x) for x in [-18,18] for y in [-24,19]];tools=[]
for kind,xy,z in [('PCB',mounts,40.7),('holder',[(-18,4),(18,4)],9.5)]:
for x,y in xy:
tool=cylinder(x,y,z,1.5,50)
cs={n:volume(BRepAlgoAPI_Common(tool,sh).Shape()) for n,sh in parts.items() if n!='case-lid' and (kind!='PCB' or n not in ['ask-button'])}
assert all(v<.01 for v in cs.values()),(kind,x,y,cs)
tools.append({'mount':kind,'xy':[x,y],'driver_diameter_mm':3,'clearance_intersections_mm3':cs,'access':'lid removed' if kind=='PCB' else 'lid and PCB removed'})
# No PCB screw access holes anywhere in the lid; blind floor insert cavities.
for x,y in mounts:assert abs(volume(BRepAlgoAPI_Common(parts['case-lid'],cylinder(x,y,45,.9,2)).Shape())-np.pi*.9**2*2)<.01
for x in [-18,18]:assert abs(volume(BRepAlgoAPI_Common(parts['case-base'],cylinder(x,4,3,1.5,.5)).Shape())-np.pi*1.5**2*.5)<.01
report={'status':'pass','base_solid_count':solids,'parts_brep_valid':True,'sensor_gap_mm':4,'solid_intersections_mm3':checks,'tool_access':tools,'pcb_screws':'4 internal M2 x 5 with 0.5mm insulating washers into 3mm insert envelopes','holder_screws':'2 internal M2 x 4 with 0.5mm washers into captive M2 nuts; 0.6mm closed floor backing','lid_screws':'4 external recessed M2-compatible closure screws','enclosure_base_underside_has_mount_through_holes':False,'lid_has_pcb_screw_holes':False,'hardware_threads_modeled':False,'insert_installation_and_fit_physically_verified':False,'hardware_lengths_and_inserts_require_supplier_selection':True}
(h/'top-service-fit-audit.json').write_text(json.dumps(report,indent=2)+'\n');print('PASS: one-piece base, separate lid, 4 PCB and 2 low holder mounts; access and clearances')