plankeus
change wkkwntolosyzzytoompmpspmmrvmnzxy
commit 874f4c3a99ae4bb8ed8566a78a1ec3716a4e8f63
author Alpha Chen <alpha@kejadlen.dev>
date
parent zsrvorkq
diff --git a/plankeus.scad b/plankeus.scad
new file mode 100644
index 0000000..94b490b
--- /dev/null
+++ b/plankeus.scad
@@ -0,0 +1,182 @@
+// Inspired by @technomancy's Atreus project:
+//
+// https://github.com/technomancy/atreus/blob/master/case/openscad/atreus_case.scad
+
+// Settings that most likely don't need adjusting.
+$fn          = 50;                  // Increase the resolution for the small screw holes.
+key_size     = 19;                  // Distance between keys.
+bezel        = 5;                   // Bezel size.
+
+// User settings.
+n_cols   = 5;  // Number of columns (not including the thumb cluster).
+n_rows   = 4;  // Number of rows.
+rotation = 10; // How much each hand-half is rotated.
+hand_sep = 2;  // Distance between the halves.
+screw_d  = 2.1;  // Screw size.
+
+// Staggering of the columns, inside->out. (The first
+// column is the single thumb key on the inside.)
+stagger = [0.25*key_size, 0, 5, 11, 6, 0, -3];
+
+// Handy variables for future calculations.
+max_y         = (n_rows-1)*key_size+stagger[n_cols];
+max_x         = (n_cols+1)*key_size;
+top_right_rot = rz_fun([max_x, max_y]);
+
+// USB/Teensy settings.
+usb_size    = [20.7, 10.2];
+teensy_size = [18.0, 30.5];
+usb_offset  = [-usb_size[0]/2,top_right_rot[1]-usb_size[1]+bezel/2];
+
+//translate([-50,0]) reference_square();
+
+// For reference!
+everything();
+
+//translate() {
+//  difference() {
+//    hull() minkowski() {
+//      kerf_test();
+//      circle(r=bezel);
+//    }
+//    kerf_test();
+//    translate([-0.5*key_size,0]) screw();
+//  }
+//}
+
+module kerf_test() {
+  n = 5;
+  for(i=[0:n]) translate([i*key_size,0]) switch(kerf=0.05*i);
+  for(i=[0:n-1])
+    translate([(i+0.5)*key_size,key_size*(i-(n-1)/2)/(1.5*n)])
+      circle(d=screw_d-(0.1*i), center=true);
+}
+
+module everything() {
+  difference() {
+    base_plate();
+    whole() {
+      keys() square(18, center=true);
+      thumb_cluster() square([18,27], center=true);
+    }
+    translate([0,30]) teensy();
+    translate([-usb_size[0]/2,80-usb_size[1]]) difference() { usb(); usb_screws(); }
+  }
+}
+
+module bottom_plate() {
+  difference() {
+    base_plate();
+    translate([3,0]) translate(top_right_rot) rotate(-80) translate([0,-usb_size[1]]) usb_screws();
+  }
+}
+
+module switch_plate() {
+  difference() {
+    base_plate();
+    whole() keys() switch(notch=true);
+  }
+}
+
+module base_plate() {
+  difference() {
+    hull() whole() bezel();
+    whole() screws() screw();
+  }
+}
+
+module bezel() {
+  translate([max_x,-1*key_size+stagger[n_cols]]) circle(d=bezel, center=true);
+  translate([max_x,(n_rows-1)*key_size+stagger[n_cols]+2]) circle(d=bezel, center=true);
+  translate([key_size*2,-1.5*key_size+stagger[1]-1]) circle(d=bezel, center=true);
+}
+
+module whole() {
+  union() {
+    translate([0.5*hand_sep,0]) rotate(rotation) children();
+    translate([-0.5*hand_sep,0]) mirror() rotate(rotation) children();
+  }
+}
+
+module screws() {
+  col_1 = 2*key_size;
+  col_2 = n_cols*key_size+1;
+  translate([col_1+1, -1*key_size+stagger[2]]) children();
+  translate([col_1+1,  1*key_size+stagger[2]]) children();
+  translate([col_1-1,  3*key_size+stagger[1]]) children();
+  translate([col_2,    0*key_size+stagger[n_cols]]) children();
+  translate([col_2,    2*key_size+stagger[n_cols]]) children();
+}
+
+module keys() {
+  translate([key_size, 0]) alphabet() children();
+  translate([2*key_size, -key_size]) modifiers() children();
+  thumb_cluster() children();
+}
+
+module alphabet() {
+  translate([key_size/2, key_size/2])
+    for(x=[0:(n_cols-1)])
+      for(y=[0:(n_rows-2)])
+        translate([x*key_size, y*key_size+stagger[x+1]])
+          children([0:$children-1]);
+}
+
+module modifiers() {
+  translate([key_size/2, key_size/2])
+    for(x=[0:(n_cols-2)])
+      translate([x*key_size, stagger[x+2]])
+        children();
+}
+
+module thumb_cluster() {
+  translate([0, -1.5*key_size]) 
+  translate([0.5*key_size, 0.75*key_size])
+    for(x=[0:1])
+      translate([x*key_size, stagger[x]])
+        children();
+}
+
+module switch(notch=false, kerf=0) {
+  hole_size    = 13.9;
+  notch_width  = 3.5001;
+  notch_offset = 4.2545;
+  notch_depth  = 0.8128;
+
+  union() {
+    square(hole_size-kerf, center=true);
+    if(notch) {
+      for(y=[-notch_offset,notch_offset])
+        translate([0,y])
+          square([hole_size+2*notch_depth, notch_width], center=true);
+    }
+  }
+}
+
+module usb_screws() {
+  translate([0,usb_size[1]])
+    translate([0,-2.5]) {
+      translate([usb_size[0]-2.75,0]) screw();
+      translate([2.75,0]) screw();
+    }
+}
+
+module usb() square(usb_size);
+module teensy() square(teensy_size, center=true);
+
+module screw() circle(d=screw_d, center=true);
+
+// Useful for visualizing how the keys will look.
+module caps() {
+  rotate(rotation) {
+    translate([key_size, 0]) alphabet() square(18, center=true);
+    translate([2*key_size, -key_size]) modifiers() square(18, center=true);
+    translate([0, -1.5*key_size]) thumb_cluster() square([18,27.5], center=true);
+  }
+}
+
+module reference_square() square(10, center=true);
+
+// Computes post-rotation coordinates.
+function rz_fun(p) = [p[0]*cos(rotation) - p[1]*sin(rotation),
+                      p[0]*sin(rotation) + p[1]*cos(rotation)];