commit 203bc5d3eaf99d6bb868c1feef3c51ac0d87f1a0 Author: Fiona Grzebien Date: Sat Nov 8 02:03:00 2025 +0100 Initial commit 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