1#include <BOSL2/std.scad>
2
3dimensions = [83,36,25]; // mm
4rib_count = [4,3];
5rib_thickness = 2; // mm
6wall_thickness = 2; // mm
7rounding = 4; // mm
8
9dove_tail_dimensions = [4,5,2]; // mm
10dove_tail_part_thickness = 2; // mm
11tolerance = 0.2; // mm
12
13rtl_sdr_body_dimensions = [61,18,15]; // mm
14rtl_sdr_sda_connector_offset = 7; // mm
15rtl_sdr_usb_connector_dimensions = [11,12,5]; // mm
16rtl_sdr_usb_connector_offset = 7; // mm
17
18rf_filter_body_dimensions = [54,30.5,19]; // mm
19rf_filter_output_sda_connector_offset = [15.5,12]; // mm
20rf_filter_input_sda_connector_offset = [18,11]; // mm
21
22sda_connector_dimensions = [10,12]; // mm (diameter,length)
23
24resolution = 100;
25top_part = true;
26dovetail_part = true;
27rf_filter_part = true;
28
29text_contents = ["Flamingo","OnTake's"];
30text_depth = 1; // mm
31font_size = 10; // mm
32font = "Iosevka Heavy";
33
34module rtl_sdr(){
35 cuboid(rtl_sdr_body_dimensions);
36 translate([rtl_sdr_body_dimensions.x/2+sda_connector_dimensions.x/2,0,-rtl_sdr_body_dimensions.z/2+rtl_sdr_sda_connector_offset]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
37
38 translate([-rtl_sdr_body_dimensions.x/2-rtl_sdr_usb_connector_dimensions.x/2,0,-rtl_sdr_body_dimensions.z/2+rtl_sdr_usb_connector_offset]) cuboid(rtl_sdr_usb_connector_dimensions);
39}
40
41module rf_filter(){
42 cuboid(rf_filter_body_dimensions);
43 translate([rf_filter_body_dimensions.x/2+sda_connector_dimensions.x/2,rf_filter_output_sda_connector_offset.x-rf_filter_body_dimensions.y/2,-rf_filter_body_dimensions.z/2+rf_filter_output_sda_connector_offset.y]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
44
45 translate([-rf_filter_body_dimensions.x/2-sda_connector_dimensions.x/2,rf_filter_input_sda_connector_offset.x-rf_filter_body_dimensions.y/2,-rf_filter_body_dimensions.z/2+rf_filter_input_sda_connector_offset.y]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
46}
47
48module dovetail(flip=false){
49 difference(){
50 prismoid(size1=[dimensions.x-rounding*2-dove_tail_part_thickness,dove_tail_dimensions.x],size2=[dimensions.x-rounding*2-dove_tail_part_thickness,dove_tail_dimensions.y],h=dove_tail_dimensions.z,anchor=LEFT+BOTTOM);
51 if (flip){
52 translate([0,-max(dove_tail_dimensions.x,dove_tail_dimensions.y)/2,0]) cuboid([dimensions.x-rounding*2-dove_tail_part_thickness,max(dove_tail_dimensions.x,dove_tail_dimensions.y),dove_tail_dimensions.z],anchor=LEFT+BOTTOM);
53 } else {
54 translate([0,max(dove_tail_dimensions.x,dove_tail_dimensions.y)/2,0]) cuboid([dimensions.x-rounding*2-dove_tail_part_thickness,max(dove_tail_dimensions.x,dove_tail_dimensions.y),dove_tail_dimensions.z],anchor=LEFT+BOTTOM);
55 }
56 }
57}
58if (dovetail_part){
59 difference(){
60 prismoid(size1=[dimensions.x-rounding*2+tolerance*2,dove_tail_dimensions.x+tolerance*2+dove_tail_part_thickness*2],size2=[dimensions.x-rounding*2+tolerance*2,dove_tail_dimensions.y+tolerance*2+dove_tail_part_thickness*2],h=dove_tail_dimensions.z+tolerance+dove_tail_part_thickness,anchor=LEFT+BOTTOM);
61 prismoid(size1=[dimensions.x-rounding*2+tolerance*2-dove_tail_part_thickness,dove_tail_dimensions.x+tolerance*2],size2=[dimensions.x-rounding*2+tolerance*2-dove_tail_part_thickness,dove_tail_dimensions.y+tolerance*2],h=dove_tail_dimensions.z+tolerance,anchor=LEFT+BOTTOM);
62 }
63 } else {
64difference(){
65union(){
66difference(){
67 cuboid([dimensions.x,dimensions.y,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM,LEFT+FRONT,LEFT+BACK,RIGHT+FRONT,RIGHT+BACK],rounding=rounding,$fn=resolution);
68 translate([wall_thickness,wall_thickness,wall_thickness]) cuboid([dimensions.x-wall_thickness*2,dimensions.y-wall_thickness*2,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM,LEFT+FRONT,LEFT+BACK,RIGHT+FRONT,RIGHT+BACK],rounding=rounding-wall_thickness,$fn=resolution);
69
70
71}
72 for (i=[1:rib_count.x]){
73 translate([dimensions.x/(rib_count.x+1)*i-rib_thickness/2,0,0])
74 cuboid([rib_thickness,dimensions.y,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM+FRONT,BOTTOM+BACK],rounding=rounding,$fn=resolution);
75 }
76
77 for (i=[1:rib_count.y]){
78 translate([0,dimensions.y/(rib_count.y+1)*i-rib_thickness/2,0])
79 cuboid([dimensions.x,rib_thickness,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM+LEFT,BOTTOM+RIGHT],rounding=rounding,$fn=resolution);
80 }
81 translate([rounding,0,dimensions.z/2]) rotate([90,0,0]) dovetail();
82 translate([rounding,dimensions.y,dimensions.z/2]) rotate([-90,0,0]) dovetail(flip=true);
83}
84translate([dimensions.x/2,dimensions.y/2,dimensions.z/2])
85if (top_part){
86 rotate([180,0,0])
87 if (rf_filter_part){
88 rf_filter();
89 } else {
90 rtl_sdr();
91 }
92} else {
93if (rf_filter_part){
94 rf_filter();
95 } else {
96 rtl_sdr();
97 }
98 }
99
100 translate ([dimensions.x/2,dimensions.y/2,text_depth]) rotate ([180,0,0]) linear_extrude(text_depth)
101 if (top_part){ text(text_contents.x,size=font_size,font=font,halign="center",valign="center");
102 } else { text(text_contents.y,size=font_size,font=font,halign="center",valign="center");
103 }
104}
105}