/* * case.scad * * https://github.com/kauzerei/OpensCadaver/blob/main/models/pico_stuff.scad * * Copyright (c) 2023 Kauzerei (openautolab@kauzerei.de) * Copyright (c) 2023 Thomas Buck (thomas@xythobuz.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * See . */ // prev [bottom,top,button,print,OPT_assembly] part = "OPT_assembly"; //[bottom,OPT_assembly] wall = 1.5; // https://www.waveshare.com/wiki/Pico-LCD-1.3 lcd_w = 52.0; lcd_h = 26.5; lcd_d = 1.55; // https://www.printables.com/model/210898-raspberry-pi-pico-case use p_w = 21; p_h = 51; p_t = 1.0; p_usb_h = 2.8; usb_cut_w = 8.5; usb_cut_h = p_usb_h + 0.4; pico_header_h = 2.6; lcd_header_h = 9.0; pico_slot_w = p_w + 1.2; pico_slot_h = p_h + 1.6; extra=4; //lip on the lid that presses top pcb down thread=3; air=0.5; bissl=1/100; joystick=6; $fa=1/1; $fs=1/2; add_len = 0.7 + 1; // + 2 * wall + thread; button = 4; button_hole = button + 1.0; button_stem = button - 0.4; button_cut_side = 0.6; header_h = pico_header_h + lcd_header_h; length = pico_slot_w; //26.7+2*air; width = pico_slot_h; //52.4+1.5+2*air; height = p_t + p_usb_h + header_h; //16.8+air+extra; total_width = width + 2 * wall; total_len = length + 2 * wall; pwr_w = 5.0; pwr_h = 10.0; pwr_gap = 0.3; pwr_wg = pwr_w + 2 * pwr_gap; pwr_hg = pwr_h + 3 * pwr_gap; module lcd() { color("blue") translate([-lcd_h / 2, -lcd_w / 2, 0]) cube([lcd_h, lcd_w, lcd_d]); } module hw() { translate([0, 0, header_h]) lcd(); translate([p_w / 2, -p_h / 2, 0]) rotate([0, 180, 0]) pico(); } module bottom() { difference() { translate([0, -add_len, 0]) cube([total_width, total_len + 2 * add_len, height + wall]); translate([wall, wall, wall]) cube([width, length, height + 0.1]); // screws if (0) #for (tr=[[wall+thread/2,wall+thread/2,height/2+wall], [wall+thread/2,length+3*wall+1.5*thread,height/2+wall], [width+wall-thread/2,wall+thread/2,height/2+wall], [width+wall-thread/2,length+3*wall+1.5*thread,height/2+wall]]) translate(tr) cylinder(h=height/2+bissl,d=thread); // usb cutout translate([wall / 2, wall + length / 2, usb_cut_h / 2 + wall]) cube([wall + bissl, usb_cut_w, usb_cut_h], center = true); // power button cutout translate([-0.1, wall + length / 2 - pwr_wg / 2, wall + usb_cut_h - 0.1]) cube([wall + 0.2, pwr_wg, pwr_h + 0.1]); // bootsel button translate([14.475, 16.05, -0.1]) cylinder(d = 4.5, h = wall + 0.2); } // power button translate([0, wall + length / 2 - pwr_w / 2, wall + usb_cut_h + (pwr_hg - pwr_h)]) cube([wall, pwr_w, pwr_h + 0.1]); // pico screw posts translate([total_width / 2, total_len / 2, wall]) for (x = [-p_h / 2 + 2, p_h / 2 - 2]) for (y = [-p_w / 2 + 4.8, p_w / 2 - 4.8]) translate([x, y, 0]) difference() { cylinder(d = 4, h = p_usb_h); translate([0, 0, -0.1]) cylinder(d = 2.2, h = p_usb_h + 0.2); } } module top() { difference() { cube([total_width, total_len, wall]); for (tr=[[wall+thread/2,wall+thread/2,-bissl], [wall+thread/2,length+3*wall+1.5*thread,-bissl], [width+wall-thread/2,wall+thread/2,-bissl], [width+wall-thread/2,length+3*wall+1.5*thread,-bissl]]) translate(tr) cylinder(h=wall+2*bissl,d=thread); translate([wall+1.5,2*wall+thread,-bissl]) for (i = [0 : 3]) translate([47.7 + air, 5.5 + i * 5.7]) cylinder(h=wall+2*bissl,d=button); translate([wall+1.5+6.7+air,2*wall+thread+13.8+air,-bissl]) cylinder(h=wall+2*bissl,d=joystick); translate([wall+13.5+1.5,2*wall+thread,-bissl]) cube([31,27,wall+2*bissl]); } translate([wall+13.5+1.5-1.5,2*wall+thread,-extra]) cube([1.5,27,extra]); translate([wall+13.5+1.5+31,2*wall+thread,-extra]) cube([1.5,27,extra]); } module button() { difference() { cylinder(h = 1, d = button_hole); translate([button_hole / 2 * -3 + button_cut_side, -button_hole / 2 - 0.1, -0.1]) cube([button_hole, button_hole + 0.2, 1.2]); } cylinder(h = 4, d = button_stem); } module bottom_assm() { %translate([0, 0, wall + p_t + p_usb_h]) rotate([0, 0, 90]) hw(); translate([-total_width / 2, -total_len / 2, 0]) bottom(); } if (part == "bottom") { bottom_assm(); } else if (part == "top") { rotate([180, 0, 0]) top(); } else if (part == "button") { button(); } else if (part == "print"){ translate([0, 10, 0]) bottom(); translate([0, -10, wall]) rotate([180, 0, 0]) top(); for (i = [1 : 4]) translate([-10, -25 + i * 10, 0]) button(); } else { difference() { union() { bottom_assm(); if (0) translate([-total_width / 2, -total_len / 2, height + wall]) top(); if (0) for (i = [0 : 3]) translate([47.7 + air, 5.5 + i * 5.7]) translate([wall + 1.5, 2 * wall + thread, -1]) translate([-total_width / 2, -total_len / 2, height + wall]) button(); } if (1) translate([-total_width / 2 - 1, 0, -2]) cube([total_width + 2, (total_len + 2 * add_len) / 2 + 2, height + wall + 10]); } }