Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added some parameters to customizer & bash script #1

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 61 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,75 @@
# Parametric SMT Tape Feeder
=====

What is it for?
---
Parametric Feeder Design, load in OpenSCAD to make yours.

## What is it for?

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/).


Features
---
## Features

* parametric design fully adaptable to your needs
* width of one feeder is tapeWidth + 3mm, eg. for 8mm tapes the feeder will be 11mm
* width of one feeder is tapeWidth + 3mm, eg. for 8mm tapes the feeder will be 11mm
* gang multiple feeder in one element
* fully 3d printable, optimized design for best print results
* keeps tape in position by slight force causing friction
* no vitamins needed
* prepared to be mounted to bed by 6mmx3mm magnets or M3 screw
* try in Thingiverse Customizer

## Print settings

| Option | Value |
| ------------ | ------------ |
| Rafts | No |
| Supports | No |
| Layer height | 0.2-0.3 [mm] |
| Nozzle size | 0.5 [mm] max |
| Infill | 20% |

### Important notes

**Print in a color contrasting white paper tapes and black plastic tapes**

Before printing your feeders make a small test piece to check tolerances & more.

<img src="images/test.jpg" alt="test" width="500"/>


## Thingiverse

[thing:2506053](https://www.thingiverse.com/thing:2506053)

## Images

### Parameters

#### Description

![Description 1](images/parametric_feeder_desc.png)

![Description 2](images/parametric_feeder_desc2.png)

#### Cross section

![Cross section](images/sFeederOpenSCAD_magnetPockets.png)

### Creating the stl

![stl creation](images/sFeederOpenSCAD_edited.png)

### Feeder with identifier

![Feeder with identifier](images/gangedFeeder8mm_with_Identifier.jpg)

### Usage

![Photo](images/parametric_feeder_photo.jpg)

## Scripts

The provided `sFeeder_batch_export` scripts generate the files inside the `stl` folder.

Don't hesitate to take them as a reference for creating scripts for your own needs.

https://www.thingiverse.com/thing:2506053
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
Binary file added images/screenshot_customizer.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/test.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
100 changes: 58 additions & 42 deletions sFeeder.scad
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@ feederLength=180;
tapeLayerHeight=22.8;
//Bank ID: To identify the feeder in OpenPnP unique IDs for each bank are built and embossed into the ganged feeder. -1: no identifier.
bankID=1; //[-1:1:9]
//Change the starting letter according to ASCII code: 65 -> 'A', 75 -> 'K', 85 -> 'U' and so on.
startingLetter=65; //[65:1:90]
//diameter of pockets on the side to put a magnet in
magnetDiameter=6;
//height of the pocket for the magnet
magnetHeight=3;
//How many magnet pockets in the right side?
magnetPocketsRightSide=3;
//How many magnet pockets on the left side?
magnetPocketsLeftSide=4;

/* [advanced] */

Expand All @@ -32,7 +38,13 @@ bodyHeight=6;
tapeSupportHoleSide=2.8;
tapeSupportNonHoleSide=0.9;

//Separation from the magnet pocket to the edge, right side
separationRightSide=24.5;
//Separation from the magnet pocket to the edge, left side
separationLeftSide=7.5;

// Change this value to get a thicker space under the magnet
layerBelow=0.35;

/* [expert] */
//higher values make the left arm stronger
Expand All @@ -49,7 +61,7 @@ overallWidth=tapeWidth+additionalWidth;
overallHeight=tapeLayerHeight+tapeHeight+tapeGuideUpperOverhang+topFinishingLayer;
tapeXcenter=(overallWidth/2)+tapeClearance/2;



//make the feeders
gang_feeder();
Expand All @@ -64,32 +76,36 @@ module gang_feeder() {
difference() {
union() {


//stack up feeders
for(i=[0:1:numberOfFeeders-1]) {
translate([i*(tapeWidth+additionalWidth),0,0])
translate([i*(tapeWidth+additionalWidth),0,0])
feeder_body(i);
}


}

//magnet pockets
for(j=[0:1:2]) {
//echo((feederLength-2*separationRightSide)/(magnetPocketsRightSide-1))
for(j=[0:1:magnetPocketsRightSide-1]) {
//magnet pockets right side
translate([0,j*((feederLength-49)/2)+24.5,0]) {
translate([0,j*((feederLength-2*separationRightSide)/(magnetPocketsRightSide-1))+separationRightSide,0]) {
translate([(numberOfFeeders)*(tapeWidth+additionalWidth),0,0 ]) {
magnetic_fixation_pocket(0,feederLength/2);
//magnetic_fixation_pocket(0,feederLength/2);
magnetic_fixation_pocket();
}
}

}

for(j=[0:1:3]) {
translate([0,j*((feederLength-15)/3)+7.5,0]) {
//magnet pockets left side

//echo((feederLength-2*separationLeftSide)/(magnetPocketsLeftSide-1))
for(j=[0:1:magnetPocketsLeftSide-1]) {
//magnet pockets left side
translate([0,j*((feederLength-2*separationLeftSide)/(magnetPocketsLeftSide-1))+separationLeftSide,0]) {
rotate([0,0,180])
magnetic_fixation_pocket(0,feederLength/2);
//magnetic_fixation_pocket(0,feederLength/2);
magnetic_fixation_pocket();
}
}
}
Expand All @@ -103,19 +119,19 @@ module feeder_body(feederNo) {
translate([0,feederLength,0]) {
rotate([90,0,0]) {
difference() {

//main form
linear_extrude(feederLength) {
polygon(points=[
//base
[0,0],
[overallWidth,0],

//right arm way up ("spring", outer part)
[overallWidth,bodyHeight*0.8],
[overallWidth-springSkew,tapeLayerHeight-3],
[overallWidth-springClearance,tapeLayerHeight],

//right arm tape guide
[overallWidth-springClearance,overallHeight],
[tapeXcenter+tapeWidth/2+tapeClearance-tapeGuideUpperOverhang,overallHeight],
Expand All @@ -124,31 +140,31 @@ module feeder_body(feederNo) {
[tapeXcenter+tapeWidth/2+tapeClearance,tapeLayerHeight],
[tapeXcenter+tapeWidth/2+tapeClearance-tapeSupportHoleSide,tapeLayerHeight],
[tapeXcenter+tapeWidth/2+tapeClearance-tapeSupportHoleSide,tapeLayerHeight-0.6],

//right arm way down ("spring", inner part)
[overallWidth-springSkew-springWidth,tapeLayerHeight-3],
[overallWidth-springWidth,bodyHeight*0.8],
[overallWidth-springWidth-1,bodyHeight],

//base (inner part)
[tapeXcenter-tapeWidth/2+tapeSupportNonHoleSide,bodyHeight],

//left arm up (inner part)
[tapeXcenter-tapeWidth/2+tapeSupportNonHoleSide,tapeLayerHeight],

//left arm tape guide
[tapeXcenter-tapeWidth/2,tapeLayerHeight],
[tapeXcenter-tapeWidth/2,tapeLayerHeight+tapeHeight],
[tapeXcenter-tapeWidth/2+tapeGuideUpperOverhang,tapeLayerHeight+tapeHeight+tapeGuideUpperOverhang],
[tapeXcenter-tapeWidth/2+tapeGuideUpperOverhang,overallHeight],

//left arm down (outer part)
[0,overallHeight],
[0,0]

]);
}

//direction of travel while picking with OpenPnP
if(feederLength>=100) {
for (i=[0:1:3]) {
Expand All @@ -158,34 +174,34 @@ module feeder_body(feederNo) {
circle(3,$fn=3);
}
}

//4 identification marks
translate([additionalWidth,bodyHeight-0.9,feederLength-2])
rotate([90,90,180])
identification_mark(feederNo,"left","top");

translate([additionalWidth,bodyHeight-0.9,2])
rotate([90,90,180])
identification_mark(feederNo,"right","top");

translate([tapeXcenter,bodyHeight-0.9,feederLength-0.9])
rotate([0,0,0])
identification_mark(feederNo,"center","top");

translate([tapeXcenter,bodyHeight-0.9,0.9])
rotate([0,180,0])
identification_mark(feederNo,"center","top");

//reference hole
translate([tapeXcenter+tapeWidth/2+tapeClearance-1.75,tapeLayerHeight,feederLength-4])
rotate([90,90,0])
cylinder(h=0.6,d=1.4,center=false,$fn=20);

//3 registration points (for magnets, bolts or to screw from top)
//bottom_fixation(feederLength/2);
bottom_fixation(17);
bottom_fixation(feederLength-17);


}
}
Expand All @@ -196,29 +212,29 @@ module identification_mark(feederNo,_halign,_valign) {

if(bankID!=-1) {
linear_extrude(height=.91) {
text( str(bankID, chr(feederNo+65) ),font=":style=Bold", size=4, valign=_valign, halign=_halign);
text( str(bankID, chr(feederNo+startingLetter) ),font=":style=Bold", size=4, valign=_valign, halign=_halign);
}
}

}

module magnetic_fixation_pocket() {
layerBelow=0.25;
// change 'layerBelow' to get a thicker space under the magnet, 2 layers is ok, check your slicer's settings and preview!. Default: layerBelow=0.25;
magnetInset=1;
magnetDiameterOversizedFor3dPrinting=magnetDiameter+0.2;

translate([0,0,layerBelow]) {
union() {
translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0])
cylinder(d=magnetDiameterOversizedFor3dPrinting,h=magnetHeight+0.3,$fn=20);

hull() {
translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0])
cylinder(d=magnetDiameterOversizedFor3dPrinting-1.4,h=magnetHeight+0.3,$fn=20);
translate([0,0,(magnetHeight+0.3)/2])
cube([0.1,magnetDiameterOversizedFor3dPrinting+0.4,magnetHeight+0.3],center=true);
}

translate([-(magnetDiameterOversizedFor3dPrinting)/2-magnetInset,0,0]) {
difference() {
cylinder(d=magnetDiameterOversizedFor3dPrinting+3,h=magnetHeight+0.3,$fn=20);
Expand All @@ -230,27 +246,27 @@ module magnetic_fixation_pocket() {
cube([magnetDiameterOversizedFor3dPrinting,1,1],center=true);
}
}

module bottom_fixation(pos_y) {
layerForBridging=0.3;
cutoutbelow=3.5;
union() {
translate([tapeXcenter,bodyHeight-1,pos_y])
rotate([-90,0,0])
cylinder(h = 2.1, r=6.0/2, $fn=20);

translate([tapeXcenter,-0.1,pos_y])
rotate([-90,0,0])
cylinder(h = bodyHeight+1, r=3.5/2, $fn=20);

//old pocket below feeder for magnet
*translate([tapeXcenter,cutoutbelow,pos_y])
rotate([90,0,0])
cylinder(h = 10, r=6.0/2, $fn=20);

//chamfer
*translate([tapeXcenter,0.3,pos_y])
rotate([90,0,0])
cylinder(h = 0.3, r1=6.0/2, r2=6.3/2, $fn=20);
}
}
}
11 changes: 11 additions & 0 deletions sFeeder_batch_export.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env bash

for fdrs in 2 4 6 8; do
for tpw in 8 12 16; do
echo "Number of feeders: $fdrs, Tape Width: $tpw [mm]"
openscad -DbankID=-1 -DtapeWidth=$tpw -DnumberOfFeeders=$fdrs -o stl/sFeeder_${tpw}mm_${fdrs}ganged.stl sFeeder.scad
echo -e "\n"
done
done

openscad -DbankID=1 -DtapeWidth=8 -DnumberOfFeeders=8 -o stl/sFeeder_8mm_8ganged_1bankID.stl sFeeder.scad