[ 6,581 keer bekeken / views ] Yet Another Parametric Projectbox generator
Here you can find an English version of this post.
Bij iedere elektronische schakeling die ik maak komt er een moment dat het project “af” is …. bijna!
De laatste stap is altijd om een geschikte projectbox te vinden en dan nog is het lastig om een (vaak plastic) project box van gaten te voorzien met de juiste grootte en op de juiste plek.
Gelukkig heb ik een 3D printer en kan ik in theorie zelf een projectbox maken maar er gaat altijd erg veel tijd in zitten. Voor standaard processor bordjes kun je op internet wel 3D STL files vinden maar als je zelf een printplaat hebt “bedacht” is de enige manier een “parameter gestuurde” oplossing die je in Fusion 360 of in openSCAD kunt inlezen. Daarna kun je via parameters de grootte van de box opgeven en soms nog wat meer maar het “past” nooit echt goed of het is zo complex dat je eerst moet afstuderen voordat je er iets moois mee kunt maken.
Daarom ben ik er maar eens voor gaan zitten en ik denk dat ik een oplossing heb gevonden waarmee vrijwel iedere printplaat van een mooie projectbox kan worden voorzien.
4 December 2023: Rev. 3.0 gereleased
Deze release breekt met de vrijwel alle API’s!
Hier vind je de officiële documentatie (Engels)
In deze post leg ik uit wat de uitgangspunten van deze YAPP generator zijn en hoe je hem kunt gebruiken om mooie projectboxen te 3D-printen!
Benodigdheden
- openSCAD
Een recente versie van “openSCAD” kun je hier downloaden. - de YAPP generator
Deze kun je als “.zip
” bestand van github downloaden. Pak het “YAPP_Box-main.zip
” bestand uit in je openSCAD projecten map. Je hebt nu een nieuwe map “YAPP_Box-main
” waarin verschillende voorbeeld bestanden staan. In “YAPP_Box-main
” staat ook een map “library
” waarin de YAPP generator zit (gooi deze dus niet weg!). Het is verstandig om de map structuur zo te laten en nieuwe box-ontwerpen in deze “YAPP_Box-main
” map te bewaren.
Design filosofie
De meeste box generatoren die je op internet kunt vinden geven je de mogelijkheid om de grootte van de box op te geven. Soms moet je binnen-maten opgeven en soms buiten-maten.
YAPP doet dat anders en gaat uit van de printplaat waar je een projectbox voor nodig hebt. De belangrijkste maten zijn dan ook de lengte, breedte en de dikte van de printplaat. Vervolgens geef je op waar de gaten zitten waarmee de printplaat moet worden vastgezet. De gaten kunnen gebruikt worden om de printplaat met schroefjes vast te zetten of je kunt de printplaat vastklemmen tussen de standoff’s in de onder- en bovenkant van de projectbox. Daarna kun je voor alle vlakken (boven, onder, voor, achter, links en rechts) van de projectbox opgeven waar rechthoekige en of ronde gaten moeten komen.
Als laatste kunnen teksten worden opgegeven die aan de bovenkant van de projectbox geprint worden.
Coördinatie Systeem
Voordat we verder gaan is het noodzakelijk om te begrijpen wat de oriëntatie van de projectbox is. Het mag duidelijk zijn dat de projectbox zes “vlakken” heeft.
De bovenkant heet “lid” de onderkant “base”. Het vlak dat het dichtst bij de Y-as ligt is de “back”. “left” ligt het dichtst bij de X-as. Het vlak tegenover “back” (die dus het verst van de Y-as af ligt) heet “front” en het vlak dat tegenover “left” ligt heet “right”
Het “nulpunt” ([x=0, y=0, z=0]
) is altijd links-achter aan de bovenkant van de printplaat.
Voor ieder vlak is er een array waarin kan worden opgegeven waar de uitsparingen in dat vlak moeten komen. Deze uitsparingen hebben allemaal [0,0,0]
van de printplaat als beginpunt. Als dus op enig moment besloten wordt om de randen rondom de printplaat te vergroten (padding
) of om de “pcbStandoffs” hoger te maken, dan verplaatsen de uitsparingen netjes mee met de positie van de printplaat.
Uitsparingen
Er zijn twee soorten uitsparingen: “rechthoeken” en “cirkels”.
Rechthoeken kunnen op twee manieren worden gemaakt en wel met de oorsprong op coördinaten of met het centrum van de rechthoek op de coördinaten.
Voor “cirkels” zijn de coördinaten altijd het middelpunt.
pcb Standoffs
Met de “pcbStandoffs” wordt de afstand tussen de bovenkant van de “base” en de onderkant van de printplaat vastgelegd. Tegenover de “standoff’s” worden automatisch “pushdown’s” op het “lid” gemaakt die precies zo lang zijn dat de printplaat daar netjes door wordt ingeklemd.
De standoff’s kunnen worden voorzien van “pennen” zodat de printplaat ook op de X- en Y-assen gefixeerd wordt. Hoeveel “pcb standoff’s” er moeten komen en waar deze moeten komen wordt opgegeven in het array “pcbStands”. Iedere pcbStand wordt opgegeven in één regel en per regel worden de eigenschappen van een pcbStand gedefinieerd.
Je gebruikt het pcbStands array als volgt:
Ieder regel in de array zorgt voor één standoff.
Het derde element (2) heeft de volgende betekenis:
yappBoth: plaats zowel onder een pcbStand alsook boven een pcbStand yappLidOnly: de pcbStand wordt alleen boven (lidHalf) geprint yappBaseOnly: de pcbStand wordt alleen beneden (baseHalf) geprint
De betekenis van het vierde element (3) is:
yappHole: de pcbStand wordt van een “gat” (hole) voorzien yappPin: de pcbStand wordt van een “pen” voorzien
Als het derde element “yappBoth
” is en als vierde element wordt “yappPin
” opgegeven dan zal de pen op de baseHalf worden geprint en een gat op de lidHalf.
Het is mogelijk om zowel onder alsook boven een gat (hole) te printen door als vierde (3) element “yappHole
” op te geven:
[3, 12, yappBoth, yappHole]
Als je mij wil helpen om meer van dit soort posts te kunnen schrijven, overweeg dan om een kleine donatie te geven door op onderstaande knop te klikken.
Uitsparingen in de zes andere vlakken
Let op!
Alle voorbeelden zijn gemaakt met versie 1.3 van de YAPPgenerator.
Vanaf versie 1.4 hebben de rijen in de cutouts array’s een extra parameter “angle”. Voor bestaande ontwerpen kan worden volstaan deze toe te voegen met de waarde “0” (nul) direct voor yappRectangle of yappCircle.
Voor ieder vlak is er een array waarin per regel kan worden opgegeven waar uitsparingen moeten komen, wat de oorspring van zo’n uitsparing is (voor rechthoeken) en wat voor vorm de uitsparing moet krijgen (rechthoek of cirkel).
Uitsparingen in het Front Plane
Uitsparingen in het Back Plane
Uitsparingen in het Lid Plane
Uitsparingen in het Base Plane
Uitsparingen in het Left Plane
Uitsparingen in het Right Plane
Rechthoekige uitsparing onder een hoek
Projectbox bevestigingen
Om je projectbox eenvoudig ergens op vast te kunnen zetten kun je zgn. “baseMounts” definiëren.
Connectoren om de twee helften te verbinden
De connectoren zijn ideaal om de twee helften met zgn. “inserts” met elkaar te verbinden.
Snap Joins
Met zgn. “snapJoins” klikken de Base en Lid helften in elkaar zonder dat daar schroefjes of andere dingen voor nodig zijn.
Als je mij wil helpen om meer van dit soort posts te kunnen schrijven, overweeg dan om een kleine donatie te geven door op onderstaande knop te klikken.
Een echt voorbeeld
In dit voorbeeld gaan we een projectbox voor een Arduino UNO maken.
We beginnen in openSCAD het bestand “YACC_template.scad
” te openen en deze direct weer weg te schrijven (“[Save as]”) met de naam “ArduinoUNO
”. Controleer wel of het nieuwe bestand in de map “YAPP_Box-main
” wordt weggeschreven.
Pas nu commentaar regels boven in het bestand aan zodat duidelijk is dat met dit bestand een projectbox voor een Arduino UNO kan worden gegenereerd.
Met de eerste echte code-regel wordt de YACC generator ingevoegd waarna de YAPPgenerate()
module uit deze library gebruikt kan worden.
include <./library/YAPPgenerator_v10.scad>
Buitenmaten en standoff’s
Nu moeten één voor één alle variabelen die de uiteindelijke projectbox bepalen opgemeten en in het “ArduinoUNO.scad
” bestand worden ingevoerd.
pcbLength = 68.5; pcbWidth = 53.3; pcbThickness = 1.5; pcbStands = [ [14.0, 2.5, yappBoth, yappPin] // back-left , [15.3, 50.7, yappBaseOnly, yappPin] // back-right , [66.1, 7.6, yappBoth, yappPin] // front-left , [66.1, 35.5, yappBoth, yappPin] // front-right ];
Connectoren
De hoogte van zowel de USB plug als de powerJack is 11mm.
Om wat speling in te bouwen laten we de USB plug en de powerJack 1mm dichter bij de X-as beginnen en maken we de breedte van de uitsparing voor de USB plug 2mm groter en die voor de powerJack 3mm. Ook de lengte van beide uitsparingen maken we iets groter.
cutoutsLid = [ [0, 31.5-1, 12.2+2, 11.0, yappRectOrg] // USB , [0, 3.5-1, 12.0, 13.5, yappRectOrg] // Power Jack ]; cutoutsBack = [ [31.5-1, -1, 12.2+2, 12, yappRectOrg] // USB , [ 3.5-1, 0, 12.0, 11, yappRectOrg] // Power Jack ];
Headers en ATmega
cutoutsLid = [ [0, 31.5-1, 12.2+2, 11.0, yappRectOrg] // USB , [0, 3.5-1, 12.0, 13.5, yappRectOrg] // Power Jack , [29-1, 12.5-1, 8.5+2, 35.0+2, yappRectOrg] // ATmega328 , [17.2-1, 49.5-1, 5.0, 47.4+2, yappRectOrg] // right headers , [26.5-1, 1.0-1, 5.0, 38.0+2, yappRectOrg] // left headers ]
Overige uitsparingen
Tenslotte moeten de posities en grootte van de ICSP connectoren, reset button en LEDjes worden opgemeten.
De totale definitie van de cutoutsLid array ziet er dan zo uit:
cutoutsLid = [ [0, 31.5-1, 12.2+2, 11.0, yappRectOrg] // USB , [0, 3.5-1, 12.0, 13.5, yappRectOrg] // Power Jack , [29.0-1, 12.5-1, 8.5+2, 35+2, yappRectOrg] // ATmega328 , [17.2-1, 49.5-1, 5.0, 47.4+2, yappRectOrg] // right headers , [26.5-1, 1.0-1, 5.0, 38.0+2, yappRectOrg] // left headers , [65.5, 28.5, 8.0, 5.5, yappRectCenter] // ICSP1 , [18.0, 45.5, 6.5, 8.0, yappRectCenter] // ICSP2 , [6.0, 49.0, 8.0, 0.0, yappCircle] // reset button //-- if space between pcb and lidPlane > 5.5 we don't need holes for the elco's -- // , [18.0, 8.6, 7.2, 0.0, yappCircle] // elco1 // , [26.0, 8.6, 7.2, 0.0, yappCircle] // elco2 // , [21.5, 8.6, 7.2, 7.0, yappRectCenter] // connect elco's , [28.2, 35.2, 5.0, 3.5, yappRectCenter] // TX/RX leds , [28.2, 42.5, 3.0, 3.5, yappRectCenter] // led13 , [58.5, 37.0, 3.0, 3.5, yappRectCenter] // ON led ];
Om nu de projectbox ook daadwerkelijk te genereren moet onderaan het programma deze module-aanroep worden gezet:
//--- this is where the magic happens --- YAPPgenerate();
Klik vervolgens op [F5] of [F6] om het resultaat van je werkt te zien.
Tweede voorbeeld (Wemos bordje)
In dit voorbeeld maken we een projectbox voor een Wemos D1 mini (V3.0.0).
Uitganspunt is weer het YAPP_template.scad
bestand wat we inlezen en direct weer wegschrijven als “WemosD1Mini.scad
“.
Eerst moeten we weer alle maten opmeten.
De “buitenmaten” worden boven in het script gezet.
wallThickness = 1.5; basePlaneThickness = 1.0; lidPlaneThickness = 1.0; baseWallHeight = 4; lidWallHeight = 4; pcbLength = 35.0; pcbWidth = 26.0; pcbThickness = 1.0; // padding between pcb and inside wall paddingFront = 1; paddingBack = 1; paddingRight = 1.5; paddingLeft = 1.5; // ridge where base and lid off box can overlap // Make sure this isn't less than lidWallHeight ridgeHeight = 3; ridgeSlack = 0.1; // afhankelijk van de Nozzle diameter // How much the PCB needs to be raised from the base // to leave room for solderings and whatnot standoffHeight = 2.0; pinDiameter = 1.8; pinHoleSlack = 0.2; standoffDiameter = 4;
De posities en grootte van de uitsparingen worden opgenomen in de cutoutsLid
, cutoutsBase
, cutoutsFront
en cutoutsRight
array’s.
//-- pcbStandoffs -- origin is pcb-0,0 pcbStands = [ [3.4, 3.0, yappBoth, yappPin] // back-left , [3.4, pcbWidth-3, yappBoth, yappHole] // back-right , [pcbLength-3, 7.5, yappBoth, yappHole] // front-left , [pcbLength-3, pcbWidth-3, yappBoth, yappPin] // front-right ]; //-- front plane -- origin is pcb-0,0 (red) cutoutsFront = [ [14.0, 1.0, 12.0, 10.0, yappRectCenter] // microUSB ]; //-- top plane -- origin is pcb-0,0 cutoutsLid = [ [6.0, -1.0, 6.0, (pcbLength-12), yappRectOrg] // left-header , [6.0, pcbWidth-4, 6.0, pcbLength-12, yappRectOrg] // right-header , [18.7, 8.8, 2.0, 0.0, yappCircle] // blue led ]; //-- bottom plane -- origin is pcb-0,0 cutoutsBase = [ [6.0, -1.0, 6.0, pcbLength-12, yappRectOrg] // left-header , [6.0, pcbWidth-4, 6.0, pcbLength-12, yappRectOrg] // right-header ]; //-- left plane -- origin is pcb-0,0 cutoutsLeft = [ [31.0, 0.5, 4.5, 3, yappRectCenter] // reset button ];
Merk op dat er maar twee gaten in de printplaat zitten. Om de printplaat toch op zijn plaats te houden worden en wel vier pcbStand gemaakt maar twee daarvan hebben geen pennen. Omdat in de linker-voorhoek een reset switch zit moet de pcbStand in deze hoek ook op een iets verschoven plek komen.
Als laatste moet de YAPPgenerate() module worden aangeroepen:
//--- this is where the magic happens --- YAPPgenerate();
Druk vervolgens op [F5] of [F6] om te controleren of de projectbox er uitziet zoals je bedacht hebt.
Debug opties
Er zijn verschillende mogelijkheden om extra informatie over de gegenereerde projectbox te bekijken zodat al tijdens de ontwerp fase gecontroleerd kan worden of het script doet wat het moet doen.
printLidShell = true; printBaseShell = true; //-- D E B U G -------------------- default showSideBySide = false; //-> true onLidGap = 1; shiftLid = 0; hideLidWalls = true; //-> false colorLid = "yellow"; hideBaseWalls = true; //-> false colorBase = "white"; showPCB = false; //-> false showPCBmarkers = false; //-> false inspectX = 0; //-> 0=none (>0 from front, <0 from back) inspectY = 0; //-- D E B U G -------------------
De eerste twee variabelen (printLid
en printBase
) geven aan of de bovenste helft van de projectbox of de onderste helft geprint moeten worden. Dit kan handig zijn als je 3D printer niet groot genoeg is om beide helften naast elkaar te printen of als je alleen in één van de twee aanpassingen hebt aangebracht en (dus) alleen die helft opnieuw wilt 3D printen.
showSideBySide
hideLidShell / hideBaseShell
Deze instelling geeft inzicht in de “binnenkant” van de projectbox.
showPCB
Deze optie is vooral handig in de side-by-side presentatie of als showLid en/of showBase “false” zijn.
showPCBmarkers
Markers worden weergegeven op de vier hoeken van de printplaat en op de linker-achterhoek van de box.
inspectX / inspectY
Met een waarde van +1 t/m +pcbLength of -1 t/m -pcbLength wordt een doorsnede van de projectbox getoond.
Andere voorbeelden
In speciale gevallen wil je de mogelijkheid hebben om objecten te maken die niet met de standaard array’s kunnen worden gemaakt. Daarvoor zijn er vier zgn. “hooks” die het mogelijk maken om deze speciale objecten in de projectbox of buiten de projectbox te definiëren. Deze hooks heten:
- lidHookInside()
- lidHookOutside()
- baseHookInside()
- baseHookOutside
Stel je hebt, op het PCB twee drukknopjes die je uiteraard wilt kunnen bedienen als het PCB in de projectbox zit. Hiervoor moeten drie zaken geregeld worden.
- In het lid moeten twee ronde gaten komen;
- Aan de binnenkant van het lid moeten twee ronde geleiders komen voor de “switchExtenders”;
- De switchExtenders moeten geprint worden. Omdat deze niet in verbinding met de projectbox staan kunnen deze in een apart scad bestand worden opgenomen of gewoon “naast de projectbox” worden geprint.
Voor een ESP-CAM wil je een mogelijkheid maken om deze “tiltbaar” op een voet te zetten. Hiervoor kun je de “lid- of baseHookOutside” modules gebruiken.
Snap Joins
Een “snapJoin” is een gat in het Lid waar een uitstulping in de Base precies in past. Hiermee klik je het Lid vast aan de Base zonder schroefjes of iets anders.
Vaak wil je aan één of twee kanten dat de snapJoins symmetrisch worden aangebracht. Dit kan door in een snapJoin-rij als laatste argument “yappSymmetric” op te geven.
Let op: snapJoins kunnen alleen worden aangemaakt als de ridgeHeight niet kleiner is dan 3mm!
Release 1.8 is uit!
Bugfixes en veranderingen in de API voor pcbStands[] en connectors[]!
Zie de documentatie!
Wat een super mooie generator. Mijn eerste stappen reeds gemaakt. Goeie documentatie. In een bestaande file zaken gewijzigd en zodoende ontdekt hoe het werkt.
Perfect om te leren…
Bedankt hiervoor !
Thanks!
Geweldig project!
Wel een tip/vraag wat het nog beter kan maken. Wellicht heeft het met mijn onhandigheid te maken, maar ik heb al een paar keer gehad dat de pilaartjes net boven het horizontale vlak afbreken. Dit is waarschijnlijk het zwakste punt. Is het wellicht mogelijk om optioneel de overgang pilaar-bodem af te ronden? Dit zou de bevestiging van de pilaren behoorlijk verstevigen.
Hey S.,
Bedankt voor het compliment!
En dat zou zéker een verbetering zijn, maar voorlopig even niet!
Ik heb overigens nooit last van afbrekende “pilaartjes”. Misschien moet je de diameter groter maken zodat de overgang aan de boven- en/of onderkant groter wordt?
Dat is zeker ook nog iets om even te proberen.
En anders moet ik gewoon wat aan die handigheid gaan doen natuurlijk…
Beste S.
Rev. 1.5 maakt zogenaamde “Flenzen” als overgang tussen de lid- en basePlanes.
De flenzen maken de verbinding sterker.
Yes, as you can read in the README.md and in the documentation there now is an extra param “angle”.
I’m confused. Did the user interface just change?
I just gave your “YAPPgenerator_v14.scad” a try and all of my rectangular cutouts disappeared! I am using OpenSCAD version 2021.01.
Before (with YAPPgenerator_v13.scad):
After (with new YAPPgenerator_v14.scad):
BTW: I really find your library very useful. I’ve made three different tiny enclosures for what I’m currently prototyping.
Er staat een nieuwe versie van de YAPPgenerator (versie 1.4) op GitHub.
Deze versie ‘breekt’ met de voorgaande versies voor wat betreft de rijen in de cutouts array’s. Er is, na ‘height‘ en vóór ‘yappRectangle‘ (of ‘yappCircle‘) een nieuwe parameter toegevoegd ‘angle‘. Hiermee kan de uitsparing van een rechthoek (yappRectangle) om de oorsprong worden gedraaid (ofwel de hoek waar x/y naar wijst ofwel het midden van de uitsparing als ook yappCenter wordt opgegeven).
Complimenten voor deze goed doordachte generator en de documentatie!
Ik ben blij deze gevonden te hebben en zal m veel gebruiken.
Thanks!
Willem: I’m so glad I found your project on GitHub. This is not “yet another” project box generator. IMHO it definitely is the “premier” project box generator, against which all others will be measured. Good job! Your hard work and OpenSCAD expertise is much appreciated.
Wauw!
Thanks for the nice words!
Wow, this is fantastic! It would have saved me a couple of hours of modeling on my last project! (I’m a newbie and very slow in F360 🙂 Thanks!!
Thanks!
Yes F360 is the best .. if only we knew how to use it! What a steep learning curve 🙁
8 Februari 2022
Ik heb de documentatie uitgebreid met voorbeelden van het gebruik van zgn. “Hooks”, “base Mounts” en “snapJoins”
Mounting tabs? Is there any way to put tabs/ears on the outside of the box to allow for screw mounting to a surface? Alternatives I’m not thinking about?
Really great project. Thanks for all the effort and the excellent documentation
Hi Andrew,
Thanks for the compliment!
You can use an array “baseMounts” (see YAPPtemplate.scad) to create … well, “baseMounts”!
Thank you so much for this project!
Well, I just needed a project box myself and could not find anything that I could use or understand…
Thanks for the complement!
Outstanding. And outstanding documentation of this complex project. I’m sure it took quite some effort. Thanks for sharing!
Thanks!