Using my Python
CSG and
Gear libraries, I've been able to start parametrically designing parts. This can sort of be done with OpenSCAD, but the lack of proper variables and functions makes it difficult. Recently I tried designing a full gearbox. The script is shown below: it's a bit messy, but you get the idea:
import gears
import pyPolyCSG as csg
def make_clamp_hub( B ):
thickness = 9
hub = csg.cylinder( B/2.0+6, thickness, True )
hub = hub + csg.cylinder( 4.0, B+10, True ).rotate( 90.0, 0.0, 0.0 ).translate( B/2+3, 0, 0 )
hub = hub - csg.cylinder( 2.0, 100, True ).rotate( 90.0, 0.0, 0.0 ).translate( B/2+3, 0, 0 )
hub = hub - csg.box( B/2+6, thickness, 2, True ).translate( B/2+3.5, 0, 0 )
return hub.rotate(90,0,0).translate( 0, 0, thickness/2-0.01 )
def make_gear( pressure_angle, pitch, teeth, thickness, bore ):
px, py = gears.gears_make_gear( pressure_angle, teeth, pitch )
coords = []
for i in range( 0, len(px) ):
coords.append( ( px[i], py[i] ) )
gear = csg.extrusion( coords, thickness ) + make_clamp_hub( bore ).translate( 0, 0, thickness )
gear = gear - csg.cylinder( bore/2.0, thickness*100, True ).rotate( 90.0, 0.0, 0.0 )
return gear
pressure_angle = 20.0
pitch = 0.8
N1 = 12
B1 = 8.0+0.7
T1 = 10.0
N2 = 36
B2 = 5.0+0.7
T2 = 5.0
backlash = 1.0
dp1 = gears.gears_pitch_diameter( pressure_angle, N1, pitch )
dp2 = gears.gears_pitch_diameter( pressure_angle, N2, pitch )
do1 = gears.gears_outer_diameter( pressure_angle, N1, pitch )
do2 = gears.gears_outer_diameter( pressure_angle, N2, pitch )
dc = ( dp1 + dp2 )/2.0 + backlash
gear1 = make_gear( pressure_angle, pitch, N1, T1, B1 )
gear1.save_mesh("gear_%gdeg_P%g_%d_tooth.obj" % ( pressure_angle, pitch, N1 ))
gear2 = make_gear( pressure_angle, pitch, N2, T2, B2 )
gear2.save_mesh("gear_%gdeg_P%g_%d_tooth.obj" % ( pressure_angle, pitch, N2 ))
def hole_xy( x, y, radius, height ):
return csg.cylinder( radius, height, True ).rotate( 90.0, 0.0, 0.0 ).translate( x, y, height/2.0 )
B1s = 10.0
B1p = 22
B2p = 10
box_pad = 5.0
screw_diam = 4.0
box_thick = 4.0
nema_offset = 31.0/2.0
box_height = max( (do1, do2 ) ) + box_pad*2.0
box_width = max( ( dc + (max( ( B1p, do1 ) )+do2)/2.0 + box_pad*2.0, nema_offset+dc+dp1/2 + screw_diam*2.0 + box_pad*2.0 ) )
screw_x_off = box_width/2.0-screw_diam
screw_y_off = box_height/2.0-screw_diam
g1_coords = ( box_pad+max((do1,B1p))/2.0, box_height/2.0 )
g2_coords = ( g1_coords[0]+dc, g1_coords[1] )
plate = csg.box( box_width, box_height, box_thick )
plate = plate - hole_xy( box_pad, box_pad, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( box_width-box_pad, box_pad, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( box_width-box_pad, box_height-box_pad, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( box_pad, box_height-box_pad, screw_diam/2.0, box_thick*2.0 )
plate = plate + hole_xy( g1_coords[0], g1_coords[1], B1p/2.0+4.0, box_thick ).translate( 0, 0, box_thick/2+3 )
plate = plate - hole_xy( g1_coords[0], g1_coords[1], B1p/2.0, box_thick ).translate( 0, 0, box_thick/2+3 )
plate = plate - hole_xy( g1_coords[0], g1_coords[1], B1s/2.0, box_thick*2.0 )
plate = plate - hole_xy( g2_coords[0], g2_coords[1], B2p/2.0, box_thick*2.0 )
plate = plate - hole_xy( g2_coords[0]-nema_offset, g2_coords[1]-nema_offset, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( g2_coords[0]+nema_offset, g2_coords[1]-nema_offset, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( g2_coords[0]+nema_offset, g2_coords[1]+nema_offset, screw_diam/2.0, box_thick*2.0 )
plate = plate - hole_xy( g2_coords[0]-nema_offset, g2_coords[1]+nema_offset, screw_diam/2.0, box_thick*2.0 )
#plate = plate + gear1.translate( g1_coords[0], g1_coords[1], -10.0 )
#plate = plate + gear2.translate( g2_coords[0], g2_coords[1], -10.0 )
plate.save_mesh( "gearbox_plate.obj" )
This generates two gears and two gearbox plates that are mounted together using M3 screws. The printed gearbox is shown below, although I'm missing some bearings and hardware. Each plate has a recess into which a 608ZZ bearing can be press-fit. Depending on the orientation it can either serve as a fixed or floating end.
I hope to use gearboxes like this to increase the speed that I can drive leadscrews at for
my CNC project, which currently has pretty limited feedrates. This would allow the use of cheap hardware store threaded rods, rather than expensive leadscrews, while still being a self-locking drive.