gokul/macro-six-usbc

USB-powered ATmega32U4 controller board with protected/switched 5 V power, six tactile keys, rotary encoder, reset/boot/ISP interfaces, power LED, and six daisy-chained SK6812 RGB LEDs driven through MOSFETs.

Version
0.1.6
License
MIT
Stars
0

enclosure/hardware.py

"""Nominal purchased screw/nut CAD, positioned in the existing case holes."""
import math
import cadquery as cq
import trimesh


def screw(spec):
    x,y=spec['xy']
    z=spec['seat_z']
    shaft=(cq.Workplane('XY').circle(spec['diameter']/2).extrude(spec['length'])
           .edges('<Z').chamfer(.12).translate((x,y,z-spec['length'])))
    head=(cq.Workplane('XY').circle(spec['head_diameter']/2).extrude(spec['head_height'])
          .edges('>Z').fillet(spec['head_height']/3).translate((x,y,z)))
    result=shaft.union(head)
    for width,height in [(spec['diameter'],.5),(.5,spec['diameter'])]:
        recess=(cq.Workplane('XY').box(width,height,.9,centered=(True,True,False))
                .translate((x,y,z+spec['head_height']-.7)))
        result=result.cut(recess)
    return result


def add_hardware(ctx):
    solids=[]
    for i,xy in enumerate(ctx['mounts']):
        spec={'xy':xy,'seat_z':20,'diameter':3,'length':16,'head_diameter':6,'head_height':2.4}
        solids.append((f'case-M3x16-{i+1}',screw(spec)))
    for i,(x,y) in enumerate(ctx['plate_mounts']):
        spec={'xy':(x,y),'seat_z':20,'diameter':2,'length':10,'head_diameter':4,'head_height':1.6}
        solids.append((f'plate-M2x10-{i+1}',screw(spec)))
        nut=(cq.Workplane('XY').polygon(6,4/math.cos(math.pi/6)).extrude(1.6)
             .cut(cq.Workplane('XY').circle(1).extrude(1.6)).translate((x,y,10.1)))
        solids.append((f'plate-M2-nut-{i+1}',nut))
    for name,solid in solids:
        assert solid.val().isValid(),name
        ctx['assembly'].add(solid,name=name,color=cq.Color(.67,.69,.72))
        vertices,faces=solid.val().tessellate(.1,.25)
        m=trimesh.Trimesh(vertices=[v.toTuple() for v in vertices],faces=faces,process=True)
        m.visual.face_colors=[171,176,184,255]
        ctx['scene'].add_geometry(m,node_name=name)
    return [name for name,solid in solids]