// CyberDeck case โ€” SLAB (tablet-style) // Single flat rectangular slab: display front-facing, keyboard recessed // below it on the same plane (Sinclair QL / Cyberdeck "slab" aesthetic), // Pi + LoRa board sandwiched in a rear cavity behind a removable back plate. // Fits: Raspberry Pi 4/5, Meshtastic-class LoRa board, 5-7" DSI/HDMI display, // BB Q10/Q20-class keyboard. See ../bom.json for source hardware. // // Print settings: 0.24mm layer height, 20% infill, no supports needed // (fully flat geometry, print face-down). ABS or PETG for outdoor UV // tolerance if this deck lives on a desk near a window. // // Compile: openscad -o slab.stl slab.scad pi_w = 85; pi_d = 56; pi_h = 17; lora_w = 51; lora_d = 26; lora_h = 14; disp_w = 194; disp_d = 110; disp_h = 20; kb_w = 116; kb_d = 43; kb_h = 10; wall = 3; gap = 3; rear_h = pi_h + lora_h + wall*2 + 4; // rear cavity depth, stacked slab_w = disp_w + 2*(wall+gap); slab_d = disp_d + kb_d + 3*(wall+gap); slab_front_h = 8; // thin front bezel thickness module rounded_rect(w,d,r=2) { hull() for (x=[r,w-r]) for (y=[r,d-r]) translate([x,y]) circle(r=r,$fn=32); } module front_face() { linear_extrude(height=slab_front_h) { difference(){ rounded_rect(slab_w, slab_d, 3); // display cutout, top translate([wall+gap, wall+gap]) square([disp_w, disp_d]); // keyboard cutout, bottom translate([wall+gap, disp_d + 2*(wall+gap)]) square([kb_w, kb_d]); } } // wordmark engraved along the bottom edge, front face translate([slab_w/2, slab_d-6, slab_front_h]) linear_extrude(height=0.5) text("PERFECT WORLD PROJECT โ€” CYBERDECK", size=3.6, halign="center", valign="center", font="Liberation Mono:style=Bold"); } module rear_tray() { difference() { union(){ linear_extrude(height=wall) rounded_rect(slab_w, slab_d, 3); // walls translate([0,0,wall]) linear_extrude(height=rear_h) difference(){ rounded_rect(slab_w, slab_d, 3); translate([wall, wall]) rounded_rect(slab_w-2*wall, slab_d-2*wall, 2); } } // cable pass-through slot between display bay and Pi bay translate([slab_w/2-10, wall+gap+disp_d-2, wall+2]) cube([20, 8, rear_h]); } // component standoff posts for the Pi (4-hole pattern, approx spacing) for (p=[[wall+8,wall+8],[wall+8+58,wall+8],[wall+8,wall+8+49],[wall+8+58,wall+8+49]]) translate([p[0], p[1], wall]) cylinder(r=2.5, h=6, $fn=24); // LoRa board mount ledge translate([wall+6, slab_d-wall-lora_d-6, wall]) cube([lora_w, lora_d, 4]); } module back_plate() { linear_extrude(height=wall) rounded_rect(slab_w-1, slab_d-1, 3); // large embossed badge on the outside face โ€” this is the panel a builder // sees when the slab is face-down on a table translate([slab_w/2, slab_d/2, wall]) linear_extrude(height=0.8) { text("PERFECT WORLD", size=9, halign="center", valign="baseline", font="Liberation Sans:style=Bold"); translate([0,-11]) text("PROJECT ยท CYBERDECK", size=5, halign="center", valign="baseline", font="Liberation Sans:style=Bold"); } } translate([0,0,0]) front_face(); translate([slab_w+15, 0, 0]) rear_tray(); translate([2*(slab_w+15), 0, 0]) back_plate();