From 47aae659abc5de85a296dc627663211365427e46 Mon Sep 17 00:00:00 2001 From: Kenneth Barbour Date: Sun, 9 Jun 2024 10:44:10 -0400 Subject: [PATCH] Initial commit --- .gitignore | 3 + README.md | 18 +++++ balun.scad | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 237 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 balun.scad diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56092b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.stl +*.swp +*.zip diff --git a/README.md b/README.md new file mode 100644 index 0000000..54de8bc --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Dipole Antenna Balun Enclosure + +This is a printable enclosure and cover to build a balun for a Dipole. The +parametric design allows you to specify the dimensions of the box and the +clearances for various hardware components. + +## Hardware + +* M3 Heat-press inserts (x4) +* M3 screws (x4) +* SO-239 connector +* M4 Bolt for binding posts (x2) +* M4 washers +* M4 nuts (x4) +* Optional Toroidal Choke +* Wire (length depending on balun design) +* Solder +* Crimp-on ring terminals (x3) diff --git a/balun.scad b/balun.scad new file mode 100644 index 0000000..8bbd6bd --- /dev/null +++ b/balun.scad @@ -0,0 +1,216 @@ +// Enclosure Width (x) +width=80; + +// Enclosure Length (y) +length=80; + +// Enclosure Depth (z) +depth=30; + +// Wall/Floor thickness +wall=2; + +// Cover Screw Diameter (clearance) +cover_screw_diameter=3.5; + +// Heat-press insert height +insert_height=5; + +// Heat-press insert diameter +insert_diameter=5; + +// Diameter of binding posts +pole_clearance=4.5; + +// Generate cover model +include_cover = true; + +// Choose a radius that ensures adequate wall thickness +radius = max(insert_diameter, cover_screw_diameter) / 2 + wall; + +$fn=32; + +enclosure( + width = width, + length = length, + depth = depth, + wall = wall, + cover_screw_diameter = cover_screw_diameter, + insert_height = insert_height, + insert_diameter = insert_diameter, + pole_clearance = pole_clearance +); + +if (include_cover == true) { + translate([width+10, 0, 0]) + enclosure_cover( + width = width, + length = length, + thickness = wall, + radius = radius + ); +} + +module enclosure_cover( + width, + length, + thickness, + radius, + screw_diameter=3.5, +) { + difference() { + radiused_box(width, length, thickness, radius); + for (i = [[0, 0], [1, 0], [0, 1], [1, 1]]) { + translate([ + radius + (i[0]*(width - 2*radius)), + radius + (i[1]*(length - 2*radius)), + 0 + ]) + cylinder(r=screw_diameter/2, h=thickness+1); + } + } +} + +module enclosure(width, length, depth, + wall = 3, + cover_screw_diameter = 3, // diameter of corner screws (clearance) + insert_height = 0, // height of heat-press insert + insert_diameter = 0, // diameter of heat-press insert + pole_clearance = 4.5 // diameter binding posts for each pole +) { + radius = max(insert_diameter, cover_screw_diameter) / 2 + wall; + + // Top + translate([radius, length, 0]) + hanging_tab( + width = width-(2*radius), + length = 15, + diameter = 8, + thickness = wall*3 + ); + + difference() { + radiused_box(width, length, depth, radius); + + translate([wall, wall, wall]) + radiused_box( + width = width-2*wall, + length = length-2*wall, + depth = depth, + radius = radius-wall + ); + + // SO-239 mount, centered on front + translate([width/2, wall+1, (depth-wall)/2+wall]) + rotate([90, 0, 0]) + so_239_mount(height=wall+2); + + // Binding posts + translate([-1, (2*length)/3, depth/2]) + rotate([0, 90, 0]) + cylinder(r=pole_clearance/2, h=width+2); + } + + // screw bosses in each corner + for (i = [[0, 0], [1, 0], [0, 1], [1, 1]]) { + translate([ + radius + (i[0]*(width - 2*radius)), + radius + (i[1]*(length - 2*radius)), + 0 + ]) + screw_boss( + radius, + depth, + inner_diameter = cover_screw_diameter, + depth = depth-wall, // not a blind hole, leave a floor thickness + counterbore_depth = insert_height, + counterbore_diameter = insert_diameter + ); + } +} + +module hanging_tab( + width = 50, + diameter = 5, + length = 10, + thickness = 5 +) { + difference() { + union() { + translate([length, 0, 0]) + cube([width-(2*length), length, thickness]); + cube([width, length/2, thickness]); + translate([length, length/2, 0]) + cylinder(r=length/2, h=thickness); + translate([width-length, length/2, 0]) + cylinder(r=length/2, h=thickness); + } + + // Round the edges, add a fillet + translate([0, length/2, -1]) + cylinder(r=length/2, h=thickness+2); + translate([width, length/2, -1]) + cylinder(r=length/2, h=thickness+2); + + // Slot + translate([length, length/2, -1]) + cylinder(r=diameter/2, h=thickness+2); + translate([width-length, length/2, -1]) + cylinder(r=diameter/2, h=thickness+2); + translate([length, (length-diameter)/2, -1]) + cube([width-(2*length), diameter, thickness+2]); + } +} + +/** + * Describes clearance holes for a SO-239 connector + */ +module so_239_mount( + center_diameter = 15, + bolt_spacing = 18, + bolt_diameter = 3.5, + height = 10 +) { + cylinder(r=center_diameter/2, h=height); + for (i = [[-1, 1], [-1, -1], [1, 1], [1, -1]]) { + translate([i[0]*bolt_spacing/2, i[1]*bolt_spacing/2, 0]) + cylinder(r=bolt_diameter/2, h=height); + } +} + +/** + * Describes a cylinder with a center bore for accepting a screw, + * and a counterbore for a heat-press insert + */ +module screw_boss( + radius, + height, + inner_diameter, + depth, + counterbore_depth=0, + counterbore_diameter=0 +) { + difference() { + cylinder(r=radius, h=height); + translate([0, 0, height-depth]) + cylinder(r=inner_diameter/2, h=height+depth); + translate([0, 0, height - counterbore_depth]) + cylinder(r=counterbore_diameter/2, h=counterbore_depth+1); + } +} + +module radiused_box(width, length, depth, radius=0) { + translate([0, radius, 0]) + cube([width, length-2*radius, depth]); + translate([radius, 0, 0]) + cube([width-2*radius, length, depth]); + translate([radius, radius, 0]) + cylinder(r=radius, h=depth); + translate([width-radius, radius, 0]) + cylinder(r=radius, h=depth); + translate([radius, length-radius, 0]) + cylinder(r=radius, h=depth); + translate([width-radius, length-radius, 0]) + cylinder(r=radius, h=depth); +} +