├── .gitignore ├── README.md ├── gangedFeeder8mm with Identifier.jpg ├── parametric_feeder_desc.png ├── parametric_feeder_desc2.png ├── parametric_feeder_desc_raw.png ├── parametric_feeder_example.png ├── parametric_feeder_photo.jpg ├── sFeeder.scad ├── sFeederOpenSCAD_edited.png ├── sFeederOpenSCAD_magnetPockets.png ├── sFeeder_batch_export.bat ├── screenshot_customizer.PNG └── stl ├── sFeeder_12mm_2ganged.stl ├── sFeeder_12mm_4ganged.stl ├── sFeeder_12mm_6ganged.stl ├── sFeeder_12mm_8ganged.stl ├── sFeeder_16mm_2ganged.stl ├── sFeeder_16mm_4ganged.stl ├── sFeeder_16mm_6ganged.stl ├── sFeeder_16mm_8ganged.stl ├── sFeeder_8mm_2ganged.stl ├── sFeeder_8mm_4ganged.stl ├── sFeeder_8mm_6ganged.stl └── sFeeder_8mm_8ganged.stl /.gitignore: -------------------------------------------------------------------------------- 1 | /not on github 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Parametric SMT Tape Feeder 2 | ===== 3 | 4 | What is it for? 5 | --- 6 | Serves to hold SMT tapes with resistors, capacitors, etc. in place. Designed to use in a Pick and Place Machine, like [OpenPnP](http://openpnp.org/). Another option would be [this](http://malte-randt.de/strip-feeders-and-modular-tray-for-smd/). 7 | 8 | 9 | Features 10 | --- 11 | * parametric design fully adaptable to your needs 12 | * width of one feeder is tapeWidth + 3mm, eg. for 8mm tapes the feeder will be 11mm 13 | * gang multiple feeder in one element 14 | * fully 3d printable, optimized design for best print results 15 | * keeps tape in position by slight force causing friction 16 | * no vitamins needed 17 | * prepared to be mounted to bed by 6mmx3mm magnets or M3 screw 18 | * try in Thingiverse Customizer 19 | 20 | 21 | https://www.thingiverse.com/thing:2506053 -------------------------------------------------------------------------------- /gangedFeeder8mm with Identifier.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/gangedFeeder8mm with Identifier.jpg -------------------------------------------------------------------------------- /parametric_feeder_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/parametric_feeder_desc.png -------------------------------------------------------------------------------- /parametric_feeder_desc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/parametric_feeder_desc2.png -------------------------------------------------------------------------------- /parametric_feeder_desc_raw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/parametric_feeder_desc_raw.png -------------------------------------------------------------------------------- /parametric_feeder_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/parametric_feeder_example.png -------------------------------------------------------------------------------- /parametric_feeder_photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/parametric_feeder_photo.jpg -------------------------------------------------------------------------------- /sFeeder.scad: -------------------------------------------------------------------------------- 1 | /* 2 | Author: Michael 3 | 4 | 2017/10/28 5 | 6 | */ 7 | 8 | /* [basic parameters] */ 9 | 10 | //How wide is the tape? 11 | tapeWidth=8; // [8, 12, 16, 24, 36, 48, 72] 12 | //Optimize for Plastic or Paper tape? Plastic tapes fit in Paper, but not reverse. Plastic tapes may be too loose in paper feeder. 13 | tapeHeight=0.9; // [0.9:paper,0.3:plastic] 14 | //How many feeder to print ganged 15 | numberOfFeeders=2; // [1:1:20] 16 | //Overall length of feeder? 17 | feederLength=180; 18 | //Height of tape's bottom side above bed 19 | tapeLayerHeight=22.8; 20 | //Bank ID: To identify the feeder in OpenPnP unique IDs for each bank are built and embossed into the ganged feeder. -1: no identifier. 21 | bankID=1; //[-1:1:9] 22 | //diameter of pockets on the side to put a magnet in 23 | magnetDiameter=6; 24 | //height of the pocket for the magnet 25 | magnetHeight=3; 26 | 27 | /* [advanced] */ 28 | 29 | //controls the force to keep the tape in place. lower value higher force and though friction 30 | tapeClearance=-0.3; // [-0.5:0.05:0.5] 31 | bodyHeight=6; 32 | tapeSupportHoleSide=2.8; 33 | tapeSupportNonHoleSide=0.9; 34 | 35 | 36 | 37 | /* [expert] */ 38 | //higher values make the left arm stronger 39 | additionalWidth=3; 40 | topFinishingLayer=0.3; 41 | tapeGuideUpperOverhang=0.4; 42 | //lower values make the spring smaller thus less force on tape, should be slightly less than a multiple of extrusion-width 43 | springWidth=1.3; 44 | springSkew=1.2; 45 | //if two tapeloaded lanes touch each other raise this value a little 46 | springClearance=0.4; 47 | 48 | overallWidth=tapeWidth+additionalWidth; 49 | overallHeight=tapeLayerHeight+tapeHeight+tapeGuideUpperOverhang+topFinishingLayer; 50 | tapeXcenter=(overallWidth/2)+tapeClearance/2; 51 | 52 | 53 | 54 | //make the feeders 55 | gang_feeder(); 56 | 57 | 58 | // customizer specific stuff 59 | // preview[view:north west, tilt:top diagonal] 60 | 61 | 62 | module gang_feeder() { 63 | 64 | difference() { 65 | union() { 66 | 67 | 68 | //stack up feeders 69 | for(i=[0:1:numberOfFeeders-1]) { 70 | translate([i*(tapeWidth+additionalWidth),0,0]) 71 | feeder_body(i); 72 | } 73 | 74 | 75 | } 76 | 77 | //magnet pockets 78 | for(j=[0:1:2]) { 79 | //magnet pockets right side 80 | translate([0,j*((feederLength-49)/2)+24.5,0]) { 81 | translate([(numberOfFeeders)*(tapeWidth+additionalWidth),0,0 ]) { 82 | magnetic_fixation_pocket(0,feederLength/2); 83 | } 84 | } 85 | 86 | } 87 | 88 | for(j=[0:1:3]) { 89 | translate([0,j*((feederLength-15)/3)+7.5,0]) { 90 | //magnet pockets left side 91 | rotate([0,0,180]) 92 | magnetic_fixation_pocket(0,feederLength/2); 93 | } 94 | } 95 | } 96 | } 97 | 98 | module feeder_cover() { 99 | cube([2,feederLength,overallHeight]); 100 | } 101 | 102 | module feeder_body(feederNo) { 103 | translate([0,feederLength,0]) { 104 | rotate([90,0,0]) { 105 | difference() { 106 | 107 | //main form 108 | linear_extrude(feederLength) { 109 | polygon(points=[ 110 | //base 111 | [0,0], 112 | [overallWidth,0], 113 | 114 | //right arm way up ("spring", outer part) 115 | [overallWidth,bodyHeight*0.8], 116 | [overallWidth-springSkew,tapeLayerHeight-3], 117 | [overallWidth-springClearance,tapeLayerHeight], 118 | 119 | //right arm tape guide 120 | [overallWidth-springClearance,overallHeight], 121 | [tapeXcenter+tapeWidth/2+tapeClearance-tapeGuideUpperOverhang,overallHeight], 122 | [tapeXcenter+tapeWidth/2+tapeClearance-tapeGuideUpperOverhang,tapeLayerHeight+tapeHeight+tapeGuideUpperOverhang], 123 | [tapeXcenter+tapeWidth/2+tapeClearance,tapeLayerHeight+tapeHeight], 124 | [tapeXcenter+tapeWidth/2+tapeClearance,tapeLayerHeight], 125 | [tapeXcenter+tapeWidth/2+tapeClearance-tapeSupportHoleSide,tapeLayerHeight], 126 | [tapeXcenter+tapeWidth/2+tapeClearance-tapeSupportHoleSide,tapeLayerHeight-0.6], 127 | 128 | //right arm way down ("spring", inner part) 129 | [overallWidth-springSkew-springWidth,tapeLayerHeight-3], 130 | [overallWidth-springWidth,bodyHeight*0.8], 131 | [overallWidth-springWidth-1,bodyHeight], 132 | 133 | //base (inner part) 134 | [tapeXcenter-tapeWidth/2+tapeSupportNonHoleSide,bodyHeight], 135 | 136 | //left arm up (inner part) 137 | [tapeXcenter-tapeWidth/2+tapeSupportNonHoleSide,tapeLayerHeight], 138 | 139 | //left arm tape guide 140 | [tapeXcenter-tapeWidth/2,tapeLayerHeight], 141 | [tapeXcenter-tapeWidth/2,tapeLayerHeight+tapeHeight], 142 | [tapeXcenter-tapeWidth/2+tapeGuideUpperOverhang,tapeLayerHeight+tapeHeight+tapeGuideUpperOverhang], 143 | [tapeXcenter-tapeWidth/2+tapeGuideUpperOverhang,overallHeight], 144 | 145 | //left arm down (outer part) 146 | [0,overallHeight], 147 | [0,0] 148 | 149 | ]); 150 | } 151 | 152 | //direction of travel while picking with OpenPnP 153 | if(feederLength>=100) { 154 | for (i=[0:1:3]) { 155 | translate([additionalWidth+3/2+0.5,bodyHeight+0.1,feederLength-25-(i*6)]) 156 | rotate([90,90,0]) 157 | linear_extrude(1) 158 | circle(3,$fn=3); 159 | } 160 | } 161 | 162 | //4 identification marks 163 | translate([additionalWidth,bodyHeight-0.9,feederLength-2]) 164 | rotate([90,90,180]) 165 | identification_mark(feederNo,"left","top"); 166 | 167 | translate([additionalWidth,bodyHeight-0.9,2]) 168 | rotate([90,90,180]) 169 | identification_mark(feederNo,"right","top"); 170 | 171 | translate([tapeXcenter,bodyHeight-0.9,feederLength-0.9]) 172 | rotate([0,0,0]) 173 | identification_mark(feederNo,"center","top"); 174 | 175 | translate([tapeXcenter,bodyHeight-0.9,0.9]) 176 | rotate([0,180,0]) 177 | identification_mark(feederNo,"center","top"); 178 | 179 | //reference hole 180 | translate([tapeXcenter+tapeWidth/2+tapeClearance-1.75,tapeLayerHeight,feederLength-4]) 181 | rotate([90,90,0]) 182 | cylinder(h=0.6,d=1.4,center=false,$fn=20); 183 | 184 | //3 registration points (for magnets, bolts or to screw from top) 185 | //bottom_fixation(feederLength/2); 186 | bottom_fixation(17); 187 | bottom_fixation(feederLength-17); 188 | 189 | 190 | } 191 | } 192 | } 193 | } 194 | 195 | module identification_mark(feederNo,_halign,_valign) { 196 | 197 | if(bankID!=-1) { 198 | linear_extrude(height=.91) { 199 | text( str(bankID, chr(feederNo+65) ),font=":style=Bold", size=4, valign=_valign, halign=_halign); 200 | } 201 | } 202 | 203 | } 204 | 205 | module magnetic_fixation_pocket() { 206 | layerBelow=0.25; 207 | magnetInset=1; 208 | magnetDiameterOversizedFor3dPrinting=magnetDiameter+0.2; 209 | 210 | translate([0,0,layerBelow]) { 211 | union() { 212 | translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0]) 213 | cylinder(d=magnetDiameterOversizedFor3dPrinting,h=magnetHeight+0.3,$fn=20); 214 | 215 | hull() { 216 | translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0]) 217 | cylinder(d=magnetDiameterOversizedFor3dPrinting-1.4,h=magnetHeight+0.3,$fn=20); 218 | translate([0,0,(magnetHeight+0.3)/2]) 219 | cube([0.1,magnetDiameterOversizedFor3dPrinting+0.4,magnetHeight+0.3],center=true); 220 | } 221 | 222 | translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0]) { 223 | difference() { 224 | cylinder(d=magnetDiameterOversizedFor3dPrinting+3,h=magnetHeight+0.3,$fn=20); 225 | cylinder(d=magnetDiameterOversizedFor3dPrinting+2,h=magnetHeight+0.3,$fn=20); 226 | } 227 | } 228 | } 229 | translate([-(magnetDiameterOversizedFor3dPrinting-magnetInset+1)/2-magnetInset,0,0]) 230 | cube([magnetDiameterOversizedFor3dPrinting,1,1],center=true); 231 | } 232 | } 233 | 234 | module bottom_fixation(pos_y) { 235 | layerForBridging=0.3; 236 | cutoutbelow=3.5; 237 | union() { 238 | translate([tapeXcenter,bodyHeight-1,pos_y]) 239 | rotate([-90,0,0]) 240 | cylinder(h = 2.1, r=6.0/2, $fn=20); 241 | 242 | translate([tapeXcenter,-0.1,pos_y]) 243 | rotate([-90,0,0]) 244 | cylinder(h = bodyHeight+1, r=3.5/2, $fn=20); 245 | 246 | //old pocket below feeder for magnet 247 | *translate([tapeXcenter,cutoutbelow,pos_y]) 248 | rotate([90,0,0]) 249 | cylinder(h = 10, r=6.0/2, $fn=20); 250 | 251 | //chamfer 252 | *translate([tapeXcenter,0.3,pos_y]) 253 | rotate([90,0,0]) 254 | cylinder(h = 0.3, r1=6.0/2, r2=6.3/2, $fn=20); 255 | } 256 | } -------------------------------------------------------------------------------- /sFeederOpenSCAD_edited.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/sFeederOpenSCAD_edited.png -------------------------------------------------------------------------------- /sFeederOpenSCAD_magnetPockets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/sFeederOpenSCAD_magnetPockets.png -------------------------------------------------------------------------------- /sFeeder_batch_export.bat: -------------------------------------------------------------------------------- 1 | REM @echo off 2 | 3 | for /l %%x in (2, 2, 8) do ( 4 | for /l %%y in (8, 4, 16) do ( 5 | echo numberOfFeeders %%x tapeWidth %%y 6 | openscad -DbankID=-1 -DtapeWidth=%%y -DnumberOfFeeders=%%x -o stl\sFeeder_%%ymm_%%xganged.stl sFeeder.scad 7 | ) 8 | ) 9 | 10 | openscad -DbankID=1 -DtapeWidth=8 -DnumberOfFeeders=8 -o stl\sFeeder_8mm_8ganged_1bankID.stl sFeeder.scad 11 | 12 | pause -------------------------------------------------------------------------------- /screenshot_customizer.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mgineer85/sFeeder/5731923868afd6d325b23dedead91db3d3269978/screenshot_customizer.PNG --------------------------------------------------------------------------------