From 203bc5d3eaf99d6bb868c1feef3c51ac0d87f1a0 Mon Sep 17 00:00:00 2001 From: Fiona Grzebien Date: Sat, 8 Nov 2025 02:03:00 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + Meshcore Repeater Baseplate.scad | 87 +++++++++++++++++++ Meshcore Repeater Battery Holder.scad | 64 ++++++++++++++ Meshcore Repeater Drilling Template.scad | 46 ++++++++++ Meshcore Repeater Mounting Plate.scad | 103 +++++++++++++++++++++++ Meshcore Repeater Solarpanel Frame.scad | 28 ++++++ 6 files changed, 330 insertions(+) create mode 100644 .gitignore create mode 100644 Meshcore Repeater Baseplate.scad create mode 100644 Meshcore Repeater Battery Holder.scad create mode 100644 Meshcore Repeater Drilling Template.scad create mode 100644 Meshcore Repeater Mounting Plate.scad create mode 100644 Meshcore Repeater Solarpanel Frame.scad diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5470b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.stl +*.bgcode diff --git a/Meshcore Repeater Baseplate.scad b/Meshcore Repeater Baseplate.scad new file mode 100644 index 0000000..afee9c1 --- /dev/null +++ b/Meshcore Repeater Baseplate.scad @@ -0,0 +1,87 @@ +height=148; +width=80; +thickness=2; +difference() { + cube([height,width,thickness]); + + // corner cutouts + corner_radius=9; + translate([0,0,-0.5]) { + cylinder(thickness+1, corner_radius, corner_radius); + } + translate([0,width,-0.5]) { + cylinder(thickness+1, corner_radius, corner_radius); + } + translate([height,0,-0.5]) { + cylinder(thickness+1, corner_radius, corner_radius); + } + translate([height,width,-0.5]) { + cylinder(thickness+1, corner_radius, corner_radius); + } + + // mounting holes + mounting_hole_radius=1.25; + x_distance=18; + y_distance=3.5; + translate([y_distance,x_distance,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + translate([y_distance,width-x_distance,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + translate([height-y_distance,x_distance,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + translate([height-y_distance,width-x_distance,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + + // battery mounting holes + battery_mounting_hole_radius=1.25; + for(i=[1:3]) { + translate([i*37.5-9,28,-0.5]) { + cylinder(thickness+1, battery_mounting_hole_radius, battery_mounting_hole_radius); + } + translate([i*37.5-9,width-28,-0.5]) { + cylinder(thickness+1, battery_mounting_hole_radius, battery_mounting_hole_radius); + } + } + + // xiao mounting point + xiao_pin_header_distance=15; + xiao_pin_header_length=17; + y_offset=10; + cable_tie_slot_length=6; + translate([height-9.5-xiao_pin_header_distance,y_offset,-0.5]) { + cube([1.5, xiao_pin_header_length, thickness+1]); + } + translate([height-9.5,y_offset,-0.5]) { + cube([1.5, xiao_pin_header_length, thickness+1]); + translate([-cable_tie_slot_length/2+1.5/2-xiao_pin_header_distance/2,-5,0]) { + cube([cable_tie_slot_length, 2, thickness+1]); + } + translate([-cable_tie_slot_length/2+1.5/2-xiao_pin_header_distance/2,xiao_pin_header_length+3,0]) { + cube([cable_tie_slot_length, 2, thickness+1]); + } + } + + // sensor module mounting holes + sensor_module_mounting_hole_radius=1.25; + sensor_mount_distance=8; + for(i=[1:3]) { + translate([height-i*sensor_mount_distance-2,width-12,-0.5]) { + cylinder(thickness+1, sensor_module_mounting_hole_radius, sensor_module_mounting_hole_radius); + } + translate([height-i*sensor_mount_distance-2,width-30,-0.5]) { + cylinder(thickness+1, sensor_module_mounting_hole_radius, sensor_module_mounting_hole_radius); + } + } + + // air valve cutout + air_valve_cutout_width=10; + translate([-0.5,width/2-air_valve_cutout_width/2,-0.5]) { + cube([8+0.5, air_valve_cutout_width, thickness+1]); + } +} + +$fn=70; diff --git a/Meshcore Repeater Battery Holder.scad b/Meshcore Repeater Battery Holder.scad new file mode 100644 index 0000000..5cc65b6 --- /dev/null +++ b/Meshcore Repeater Battery Holder.scad @@ -0,0 +1,64 @@ +length=75; +width=36; +thickness=6; +overlap=0.1; + +difference() { + cube([length,width,thickness]); + + // cable tie cutout + cable_tie_width=5; + translate([length/2-cable_tie_width/2+6.5,-overlap/2,-overlap]) { + cube([cable_tie_width,width+overlap,3+overlap]); + cube([cable_tie_width,3,thickness+2*overlap]); + translate([0,width-3+overlap,0]) { + cube([cable_tie_width,3+overlap,thickness+2*overlap]); + } + } + + // screw holes + screw_hole_radius=1.25; + translate([25.5,width/2,-overlap/2]) { + cylinder(thickness+overlap,screw_hole_radius,screw_hole_radius); + translate([0,0,thickness-2]) { + cylinder(3+overlap,screw_hole_radius+1,screw_hole_radius+1); + } + translate([24,0,0]) { + cylinder(thickness+overlap,screw_hole_radius,screw_hole_radius); + translate([0,0,thickness-2]) { + cylinder(3+overlap,screw_hole_radius+1,screw_hole_radius+1); + } + } + } + + // battery charger inset + charger_width=13; + charger_length=25; + charger_height=2; + translate([15.5,2,thickness-charger_height+overlap]) { + //cube([charger_length,charger_width,charger_height]); + } +} + +// battery inlay/walls +wall_width=15; +radius=16.5; +translate([0,0,thickness/2+1.5]) { + difference() { + union() { + cube([wall_width,width,radius]); + translate([length-wall_width,0,0]) { + cube([wall_width,width,radius]); + } + } + + rotate([0,90,0]) { + translate([-radius-thickness/2,width/2,2]) { + #cylinder(length-4,radius,radius); + } + } + } +} + +$fn=70; + \ No newline at end of file diff --git a/Meshcore Repeater Drilling Template.scad b/Meshcore Repeater Drilling Template.scad new file mode 100644 index 0000000..00d57ff --- /dev/null +++ b/Meshcore Repeater Drilling Template.scad @@ -0,0 +1,46 @@ +case_height=158; +case_width=89.5; + +difference() { + cube([case_height,case_width,1]); + + translate([9,35,-0.5]) { + cylinder(2, 2, 2); + } + + translate([38,7,-0.5]) { + cylinder(2, 2, 2); + } + + translate([70,7,-0.5]) { + cylinder(2, 2, 2); + } + + translate([99,7,-0.5]) { + cylinder(2, 2, 2); + } + + translate([120,7,-0.5]) { + cylinder(2, 2, 2); + } + + translate([149,35,-0.5]) { + cylinder(2, 2, 2); + } +} + +// walls +translate([0,-1,0]) { + cube([case_height,1,6]); +} +translate([0,case_width,0]) { + cube([case_height,1,6]); +} +translate([-1,-1,0]) { + cube([1,case_width+2,6]); +} +translate([case_height,-1,0]) { + cube([1,case_width+2,6]); +} + +$fn=70; diff --git a/Meshcore Repeater Mounting Plate.scad b/Meshcore Repeater Mounting Plate.scad new file mode 100644 index 0000000..e9dfd7a --- /dev/null +++ b/Meshcore Repeater Mounting Plate.scad @@ -0,0 +1,103 @@ +width=89; +height=157; +thickness=3; +edge_radius=4; + +difference() { + translate([edge_radius,edge_radius,0]) { + minkowski() { + cube([height-2*edge_radius,width-2*edge_radius,thickness/2]); + cylinder(thickness/2, edge_radius, edge_radius); + } + } + + mounting_hole_radius=2.5; + translate([5,5,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + + translate([5,width-5,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + + translate([height-5,5,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } + + translate([height-5,width-5,-0.5]) { + cylinder(thickness+1, mounting_hole_radius, mounting_hole_radius); + } +} + +// pole mount +pipe_diameter=60; +pipe_radius=pipe_diameter/2; + +pole_mount_width=15; +pole_mount_length=25; +pole_mount_height=pipe_radius; +channel_width=15; + +channel_angle=65; // TODO: Automatically adapt angle to pipe diameter +width_offset=sign(sign(width-pipe_diameter)+1)*((width-pipe_diameter)/2+5); + +difference() { + union() { + translate([15,width_offset,0]) { + difference() { + cube([pole_mount_length,pole_mount_width,pole_mount_height]); + translate([pole_mount_length/2-channel_width/2,pole_mount_width,thickness]) { + rotate([channel_angle,0,0]) { + cube([channel_width,2,30]); + } + } + } + } + + mirror([0,1,0]) { + translate([15,-width+width_offset,0]) { + difference() { + cube([pole_mount_length,pole_mount_width,pole_mount_height]); + translate([pole_mount_length/2-channel_width/2,pole_mount_width,thickness]) { + rotate([channel_angle,0,0]) { + cube([channel_width,2,30]); + } + } + } + } + } + + translate([height-pole_mount_length-15,width_offset,0]) { + difference() { + cube([pole_mount_length,pole_mount_width,pole_mount_height]); + translate([pole_mount_length/2-channel_width/2,pole_mount_width,thickness]) { + rotate([channel_angle,0,0]) { + cube([channel_width,2,30]); + } + } + } + } + + mirror([0,1,0]) { + translate([height-pole_mount_length-15,-width+width_offset,0]) { + difference() { + cube([pole_mount_length,pole_mount_width,pole_mount_height]); + translate([pole_mount_length/2-channel_width/2,pole_mount_width,thickness]) { + rotate([channel_angle,0,0]) { + cube([channel_width,2,30]); + } + } + } + } + } + } + + // pipe + rotate([0,90,0]) { + translate([-pipe_radius-5,width/2,0]) { + #cylinder(height,pipe_radius,pipe_radius); + } + } +} + +$fn=70; diff --git a/Meshcore Repeater Solarpanel Frame.scad b/Meshcore Repeater Solarpanel Frame.scad new file mode 100644 index 0000000..f5632e9 --- /dev/null +++ b/Meshcore Repeater Solarpanel Frame.scad @@ -0,0 +1,28 @@ +frame_height=186; +frame_width=110; +frame_thickness=2; + +difference() { + // frame + cube([frame_height,frame_width,frame_thickness]); + + // case cutout + case_height=159; + case_width=90.5; + case_thickness=2; + translate([(frame_height-case_height)/2,(frame_width-case_width)/2,-0.5]) { + cube([case_height,case_width,frame_thickness+1]); + } +} + +// walls +cube([frame_height,1,frame_thickness+2]); +translate([0,frame_width-1,0]) { + cube([frame_height,1,frame_thickness+2]); +} +cube([1,frame_width,frame_thickness+2]); +translate([frame_height-1,0,0]) { + cube([1,frame_width,frame_thickness+2]); +} + +$fn=70; \ No newline at end of file