//Raspberry Pi 3B+ based music box // Ⓒ Christian Kellermann // //This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International //License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ //or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. include include include /* All distances are in mm. */ /* set output quality */ $fn = 50; // Box inner dimensions box_inner = [200, 90, 160]; // Material thickness (mm) thickness = 4; // Tab width (X, Y, Z) (mm) tabs = [7,7,7,7,7]; // lcd measurements lcd = [84,55]; // this LCD has some parts added without a display, so the bezel needs to cover that up inner_bezel = [75,49]; module case_holes(){ translate([-95,-70]) circle(r=1.5, center=true); translate([95,-70]) circle(r=1.5, center=true); translate([-95,70]) circle(r=1.5, center=true); translate([95,70]) circle(r=1.5, center=true); } module lcd_holes(){ translate([94/2,65/2]) circle(d=3,center=true); translate([94/2,-65/2]) circle(d=3,center=true); translate([-94/2,65/2]) circle(d=3,center=true); translate([-94/2,-65/2]) circle(d=3,center=true); translate([-94/2,0]) circle(d=3,center=true); translate([94/2,0]) circle(d=3,center=true); } module buttons(){ translate([0,56]) translate([-3*(23)-10,0]) circle(d=7, center=true); translate([0,56]) translate([3*(23)+10,0]) circle(d=29, center=true); translate([0,-56]){ translate([3*(23)+10,0]) circle(d=29, center=true); translate([1.5 * 23 + 5,0]) circle(d=29, center=true); circle(d=29, center=true); translate([1.5*-23-5,0]) circle(d=29, center=true); translate([-3*23-10,0]) circle(d=29, center=true); } } module front(){ // difference(){ // square([200,140], center=true); case_holes(); translate([0,5]){ square(lcd, center=true); lcd_holes(); } buttons(); // } } module pi_mounts(){ difference(){ hull(){ projection(cut=true) rotate([0,0,-90]) rpi(); } projection(cut=true) rotate([0,0,-90]) rpi(); } } module back(){ // difference(){ // square([200,140], center=true); case_holes(); mirror([1,0,0]) translate([-99,-10]) pi_mounts(); // } } module lcd_holder_base() { difference(){ minkowski(){ circle(d=3, center=true); square([100,72], center=true); } lcd_holes(); } } module lcd_holder() { difference(){ lcd_holder_base(); translate([-3,0]) square(inner_bezel, center=true); } } module lcd_holder_back() { difference(){ lcd_holder_base(); square([120,50], center=true); } } module dc_jack(plate=false){ if (plate==true) circle(d=8,center=true); else circle(d=12, center=true); translate([-6,6]) circle(d=3, center=true); translate([-6,-6]) circle(d=3, center=true); translate([6,6]) circle(d=3, center=true); translate([6,-6]) circle(d=3, center=true); } module dc_plate(){ difference(){ minkowski(){ circle(d=3, center=true); square([17,17], center=true); } dc_jack(plate=true); } } module speaker_plate(){ difference(){ minkowski(){ circle(d=3, center=true); square([38,75], center=true); } translate([31/2-4,-70/2+4]) circle(r=1.5, center=true); translate([31/2-4,70/2-4]) circle(r=1.5, center=true); translate([-31/2+4,-70/2+4]) circle(r=1.5, center=true); translate([-31/2+4,70/2-4]) circle(r=1.5, center=true); intersection(){ angle = 20; scale([1,1.5]) circle(d=30, center=true); rotate([0,0,angle]){ for(i=[-15:3:15]){ translate([i,0]) square([2,45], center=true); } } rotate([0,0,-angle]){ for(i=[-15:3:15]){ translate([i,0]) square([2,45], center=true); } } } } } module speaker(with_dc=false, with_piports=false){ translate([31/2-4,-70/2+4]) circle(r=1.5, center=true); translate([31/2-4,70/2-4]) circle(r=1.5, center=true); translate([-31/2+4,-70/2+4]) circle(r=1.5, center=true); translate([-31/2+4,70/2-4]) circle(r=1.5, center=true); scale([1,1.5]) circle(d=30, center=true); if (with_piports==true) translate([-40,-10]) pi_ports(); if (with_dc==true) translate([35,-60]) dc_jack(); } module pi_ports(){ projection(cut=true) rotate([-90,0.01,-90]) rpi(); } module top(){ //difference(){ //square([200,90], center=true); for(i=[-70:5:-10]){ translate([i,0]) square([2,50], center=true); } for(i=[10:5:70]){ translate([i,0]) square([2,50], center=true); } //} } module bottom(){ square([200,90], center=true); } //translate([-200,0]) // front(); //translate([-200,150]) // back(); //translate([-400,0]) // speaker(with_piports=true); //speaker(with_dc=true); //translate([box_inner[0]/2,-thickness,box_inner[2]-25]) //rotate([90,0,0]) //linear_extrude(height=3, center=true) translate([0,-50,0]) lcd_holder(); translate([-280,-50,0]) lcd_holder_base(); translate([-140,-50,0]) lcd_holder_back(); translate([0,-100,0]) dc_plate(); // encoder knob //translate([20,-thickness,box_inner[2]-25]) //rotate([90,0,0]) //linear_extrude(height=15, center=true) //circle(d=20,center=true) // example button top //translate([box_inner[0]-2,box_inner[1]-10, 14]) //rotate([90,0,90]) //linear_extrude(height=2, center=true) module player_box(box_inner, thickness, tabs){ layout_2d(box_inner, thickness) { difference() { //top side_a_top(box_inner, thickness, tabs); translate([box_inner[0] / 2, box_inner[1] / 2]) top(); } difference() { //bottom side_a(box_inner, thickness, tabs); } difference() { // left // empty(); side_b(box_inner, thickness, tabs); translate([box_inner[1] / 2, box_inner[2] / 2]) speaker(with_piports=true); } difference() { // right // empty(); side_b(box_inner, thickness, tabs); translate([box_inner[1] / 2, box_inner[2] / 2]) speaker(with_dc=true); } difference() { //front // empty(); side_c(box_inner, thickness, tabs); translate([box_inner[0]/2, box_inner[2]/2]) front(); } difference() { // back // empty(); side_c(box_inner, thickness, tabs); translate([box_inner[0] / 2, box_inner[2] / 2]) back(); } } } // plate for speakers translate([200,-200,0]) //translate([-10,box_inner[1] / 2, box_inner[2] / 2]) //rotate([90,0,90]) //linear_extrude(height=3) speaker_plate(); translate([100,-200,0]) //translate([210,box_inner[1] / 2, box_inner[2] / 2]) //rotate([90,0,90]) //linear_extrude(height=3) speaker_plate(); //testing plate for all holes translate([0,-200,0]) //inear_extrude(height=3) difference(){ square([80,50], center=true); translate([-25,0]) circle(d=4, center=true); translate([-15,0]) circle(d=7, center=true); translate([-5,0]) circle(d=8, center=true); translate([15,0]) circle(d=29, center=true); } //model of rpi to check for hole alignment //translate([1,85,70]) //rotate([0,90,-90]) // rpi(); // render the box player_box(box_inner, thickness, tabs);