Initial commit

This commit is contained in:
Fiona Grzebien 2025-11-08 02:03:00 +01:00
commit 203bc5d3ea
6 changed files with 330 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.stl
*.bgcode

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;