Files
5x6-split-kb/rev2/3d-models/top-dampener.scad
2025-08-23 17:22:59 +02:00

227 lines
6.9 KiB
OpenSCAD

$fn = 128;
$space = 3;
$width = 15.5;
$length = $width;
$height = 1;
$holes = $height*4;
$cut = $holes/2*-1;
$clearance = 0.2;
$switchDistance = $width+ $space;
// shell width is set to double of actual shell width and results in haft of the actual value due to division by 2.
// this needs to be fixed
$shellWidth = 12;
$shellHeight = 3.5 + $clearance;
$columns = 6;
$rows = 5;
$fingerStep = 5;
$xBase = (($width + $space) * $columns) + $space;
$yBase = (($length + $space) * $rows) + $space;
$pcbHeight = 1.6;
$dampenerHeight = 1;
$pcbDampenerOffset = $pcbHeight + $dampenerHeight;
module pin(){
cylinder(h=$holes, r=1, center=false);
}
module switch($diodesTop = false){
$xCenter = $width/2;
$yCenter = $length/2;
translate([$xCenter, $yCenter, 0])
cylinder(h=$holes, r=2.522, center=false);
translate([$xCenter + 0, $yCenter + 5.9,0])
pin();
translate([$xCenter + 5, $yCenter + 3.8,0])
pin();
translate([$xCenter + -5, $yCenter + 3.8,0])
pin();
translate([$xCenter + -5, $yCenter + -5.15,0])
pin();
translate([$xCenter + 5, $yCenter+-5.15,0])
pin();
translate([0, $length + 1.4, 0]);
$dDistanceFromCenter = $switchDistance/2;
$dWidth = 10.95;
$dHeight = 1.8;
if ($diodesTop){
translate([$xCenter - ($dWidth/2), $yCenter + $dDistanceFromCenter - ($dHeight/2), 0]){
cube([$dWidth, $dHeight, $holes]);
}
}
}
module switchColumn(){
difference() {
translate([-($space/2), -($space/2)])
cube([$switchDistance, $switchDistance * $rows, $height]);
for (y=[0:$rows-1]){
translate([0 * ($width + $space) ,y * ($length+$space) ,0]) {
switch(y<3);
}
}
}
}
module rightTopDampener(){
union(){
switchColumn();
translate([$switchDistance,0,0])
switchColumn();
translate([$switchDistance * 2,5,0])
switchColumn();
translate([$switchDistance * 3,0,0])
switchColumn();
translate([$switchDistance * 4,-5,0])
switchColumn();
translate([$switchDistance * 5,-5,0])
switchColumn();
}
}
module leftTopDampener(){
rotate([0,180,0]){
rightTopDampener();
}
}
module topDampeners(){
translate([10,0,0]){
rightTopDampener();
}
translate([-10,0,0]){
leftTopDampener();
}
}
module case(){
// Then adjust the shim, aux and pico.
// Last add magnets, don't forget the clearance.
$baseHeight = 6.3;
points = [
[0,0],
[0, $switchDistance * $rows],
[$switchDistance * 2, $switchDistance * $rows],
[$switchDistance * 2, $switchDistance * $rows + $fingerStep],
[$switchDistance * 3, $switchDistance * $rows + $fingerStep],
[$switchDistance * 3, $switchDistance * $rows],
[$switchDistance * 4, $switchDistance * $rows],
[$switchDistance * 4, $switchDistance * $rows - $fingerStep],
[$switchDistance * 6, $switchDistance * $rows - $fingerStep],
[$switchDistance * 6, 0 - $fingerStep],
[$switchDistance * 4, 0 - $fingerStep],
[$switchDistance * 4, 0],
[$switchDistance * 3, 0],
[$switchDistance * 3, 0 + $fingerStep],
[$switchDistance * 2, 0 + $fingerStep],
[$switchDistance * 2, 0],
];
module magnets(){
$magnetWidth = 4;
$magnetRadius = ($magnetWidth / 2) + $clearance/2;
$magnetHeight = 2 + $clearance;
$offset = ($shellWidth / 2 / 2) -0.8 ;
// Set Z-origin to align with shell top
translate([0, 0, $shellHeight -$magnetHeight]){
translate(points[0] + [-$offset, -$offset])
cylinder(h=$magnetHeight, r=$magnetRadius);
translate(points[1] + [-$offset, $offset])
cylinder(h=$magnetHeight, r=$magnetRadius);
translate(points[8] + [$offset, $offset])
cylinder(h=$magnetHeight, r=$magnetRadius);
translate(points[9] + [$offset, -$offset])
cylinder(h=$magnetHeight, r=$magnetRadius);
}
}
module aux(){
$topLeftOfPcbToCenterOfAux = 15.4;
$measurementPcbPlaneToCenterOfAux = 2.8;
$auxClearanceFromBase = $measurementPcbPlaneToCenterOfAux - $dampenerHeight;
$auxHoleRadius = 3.15;
$auxHoleLength = 17 + $shellWidth/2;
$auxCableRadius = 4.15;
// Move to the position along the wall the aux will be
translate([-($shellWidth/2 + $clearance),$switchDistance * $rows - $topLeftOfPcbToCenterOfAux,-$auxClearanceFromBase])
// Make cylinder perpendicular with the wall
rotate([0,90,0]){
// Aux component clearance
cylinder(h=$auxHoleLength,r=$auxHoleRadius);
// Aux cable housing clearance
cylinder(h=$shellWidth/2,r=$auxCableRadius );
}
}
module pico(){
$topLeftEdgeOfPcbToCenterOfUsb = 23;
$usbHoleWidth = 12;
$usbHoleHeight = 9;
$usbOffsetFromPcb = 4 - $pcbDampenerOffset;
$picoPcbClearanceFromBase = 5.4 - $pcbDampenerOffset;
$picoWidth = 25;
$picoLength = 53;
// Move to position along the wall the usb will be
translate([$topLeftEdgeOfPcbToCenterOfUsb - ($usbHoleWidth/2), $switchDistance * $rows, -$usbOffsetFromPcb]){
union() {
// Create a hole for the usb cable to go through
cube([$usbHoleWidth,$shellWidth,$usbHoleHeight]);
// Move inside the shell
translate([-(($picoWidth - $usbHoleWidth)/2),$clearance - $picoLength, +$usbOffsetFromPcb - $picoPcbClearanceFromBase])
// Make clearance downwards for the pico board
cube([$picoWidth,$picoLength, $picoLength]);
}
}
}
module shim(){
$shimPoints = [
[0 - $shellWidth / 2, - $baseHeight],
[$switchDistance * $columns + $shellWidth/2 + $clearance, 0],
[$switchDistance * $columns + $shellWidth/2 + $clearance, - ($baseHeight + $clearance)]
];
// Face z/x-plane
rotate([90,0,0])
// Move in front of model on the y-axis
translate([0,0,-500])
// Extrude it through the case
linear_extrude(99999)
polygon($shimPoints);
}
module body(){
union() {
linear_extrude($shellHeight){
difference(){
offset(r=$shellWidth/2 + $clearance, chamfer=true) polygon(points);
offset(r=$clearance) polygon(points);
}
}
translate([0,0,-$baseHeight])
linear_extrude($baseHeight){
offset(r=$shellWidth/2 + $clearance, chamfer=true) polygon(points);
}
}
}
difference(){
body();
shim();
pico();
aux();
magnets();
}
}
//topDampeners();
case();