Repository navigation
Expand file tree
/
Copy pathMulticonnectGridfinity.SCAD
More file actions
172 lines (162 loc) · 7.19 KB
/
Copy pathMulticonnectGridfinity.SCAD
File metadata and controls
172 lines (162 loc) · 7.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*Created by Andy Levesque
Credit to
@David D on Printables for Multiboard
Jonathan at Keep Making for Multiconnect
Zach at gridfinity.xyz for the Gridfinity standard
Katie (and her community) at Hands on Katie on Youtube for advice
Licensed Creative Commons 4.0 Attribution Non-Commercial Sharable with Attribution
TODO:
- Add ability to tweak rim height
- Ability to trim grid height (some versions lop off a tiny bit off the top)
*/
/*[Parameters]*/
unitsWide = 2;
unitsDeep = 2;
rimThickness = 1.5;
baseThickness = 1.5;
backHeight = 15+10*unitsDeep;
/*[Slot Customization]*/
//Distance between Multiconnect slots on the back (25mm is standard for MultiBoard)
distanceBetweenSlots = 25;
//QuickRelease removes the small indent in the top of the slots that lock the part into place
slotQuickRelease = false;
//Dimple scale tweaks the size of the dimple in the slot for printers that need a larger dimple to print correctly
dimpleScale = 1; //[0.5:.05:1.5]
//Scale the size of slots in the back (1.015 scale is default for a tight fit. Increase if your finding poor fit. )
slotTolerance = 1.00; //[0.925:0.005:1.075]
//Move the slot in (positive) or out (negative)
slotDepthMicroadjustment = 0; //[-.5:0.05:.5]
//enable a slot on-ramp for easy mounting of tall items
onRampEnabled = true;
//frequency of slots for on-ramp. 1 = every slot; 2 = every 2 slots; etc.
onRampEveryXSlots = 1;
/*[Hidden]*/
totalWidth = unitsWide*42+rimThickness*2;
totalDepth = unitsDeep*42+rimThickness;
//begin build
translate(v = [-totalWidth/2,-totalDepth/2])
union(){
translate(v = [rimThickness,0,0])
gridfinity_grid(xCount = unitsWide, yCount = unitsDeep);
translate(v = [0,0,-baseThickness])
multiconnectBack(backWidth = totalWidth, backHeight = backHeight, distanceBetweenSlots = distanceBetweenSlots);
//shelf
difference(){
translate(v = [0,0,-baseThickness])
cube([totalWidth,totalDepth,4.65+baseThickness]);
translate(v = [rimThickness,0,0])
cube([totalWidth-rimThickness*2,totalDepth-rimThickness,6]);
}
//bracket
exposedBackHeight = backHeight-baseThickness-4.65;
translate(v = [rimThickness,0,backHeight-baseThickness])
shelfBracket(bracketHeight = exposedBackHeight, bracketDepth = exposedBackHeight,rimThickness = rimThickness);
translate(v = [totalWidth,0,backHeight-baseThickness])
shelfBracket(bracketHeight = exposedBackHeight, bracketDepth = exposedBackHeight,rimThickness = rimThickness);
}
module gridfinity_grid(xCount, yCount) {
//Gridfinity Grid
for (columnY = [0:1:yCount-1]){
for (rowX = [0:1:xCount-1]) {
translate(v = [rowX*42,columnY*42,0]) gridfinity_base();
}
}
}
module gridfinity_base() {
difference() {
cube(size = [42,42,4.65]);
/*
baseplate delete tool
This is a delete tool which is the inverse profile of the baseplate intended for Difference.
Using polygon, I sketched the profile of the base edge per gridfinity specs.
I then realized I need rounded corners with 8mm outer diameter, so I increased the x axis enough to have a 4mm total outer length (radius).
I rotate extrude to created the rounded corner
Finally, I used minkowski (thank you Katie from "Hands on Katie") using a cube that is 42mm minus the 8mm of the edges (equalling 34mm)
I also added separate minkowski tools to extend the top and the bottom for proper deleting
*/
union() {
//primary profile
translate(v = [4,38,5.65])
rotate(a = [180,0,0])
color(c = "red")
minkowski() {
rotate_extrude($fn=50)
polygon(points = [[0,0],[4,0],[3.3,0.7],[3.3,2.5],[1.15,4.65],[0,4.65]]);
cube(size = [34,34,1]);
}
//bottom extension bottom tool
translate(v = [4,4,-2])
color(c = "blue")
minkowski() {
linear_extrude(height = 1) circle(r = 4-2.85, $fn=50);
cube(size = [34,34,6]);
}
//top extension
translate(v = [4,4,5])
color(c = "green")
minkowski() {
linear_extrude(height = 1) circle(r = 4, $fn=50);
cube(size = [34,34,2]);
}
}
}
}
//BEGIN MODULES
//Slotted back Module
module multiconnectBack(backWidth, backHeight, distanceBetweenSlots)
{
//slot count calculates how many slots can fit on the back. Based on internal width for buffer.
//slot width needs to be at least the distance between slot for at least 1 slot to generate
let (backWidth = max(backWidth,distanceBetweenSlots), backHeight = max(backHeight, 25),slotCount = floor(backWidth/distanceBetweenSlots), backThickness = 6.5){
difference() {
translate(v = [0,-backThickness,0]) cube(size = [backWidth,backThickness,backHeight]);
//Loop through slots and center on the item
//Note: I kept doing math until it looked right. It's possible this can be simplified.
for (slotNum = [0:1:slotCount-1]) {
translate(v = [distanceBetweenSlots/2+(backWidth/distanceBetweenSlots-slotCount)*distanceBetweenSlots/2+slotNum*distanceBetweenSlots,-2.35+slotDepthMicroadjustment,backHeight-13]) {
color(c = "red") slotTool(backHeight);
}
}
}
}
//Create Slot Tool
module slotTool(totalHeight) {
scale(v = slotTolerance)
//slot minus optional dimple with optional on-ramp
let (slotProfile = [[0,0],[10.15,0],[10.15,1.2121],[7.65,3.712],[7.65,5],[0,5]])
difference() {
union() {
//round top
rotate(a = [90,0,0,])
rotate_extrude($fn=50)
polygon(points = slotProfile);
//long slot
translate(v = [0,0,0])
rotate(a = [180,0,0])
linear_extrude(height = totalHeight+1)
union(){
polygon(points = slotProfile);
mirror([1,0,0])
polygon(points = slotProfile);
}
//on-ramp
if(onRampEnabled)
for(y = [1:onRampEveryXSlots:totalHeight/distanceBetweenSlots])
translate(v = [0,-5,-y*distanceBetweenSlots])
rotate(a = [-90,0,0])
color(c = "orange") cylinder(h = 5, r1 = 12, r2 = 10.15);
}
//dimple
if (slotQuickRelease == false)
scale(v = dimpleScale)
rotate(a = [90,0,0,])
rotate_extrude($fn=50)
polygon(points = [[0,0],[0,1.5],[1.5,0]]);
}
}
}
module shelfBracket(bracketHeight, bracketDepth, rimThickness){
rotate(a = [-90,0,90])
linear_extrude(height = rimThickness)
polygon([[0,0],[0,bracketHeight],[bracketDepth,bracketHeight]]);
}