Nog een geparametriseerde projectbox generator

[ 5,420 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.

Met de YAPPgenerator als basis kunnen complexe project boxen gemaakt 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

Rechthoek gedraaid om de hoek x/y
Rechthoek gedraaid rond het midden (x/y) [yappCenter]


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.

yappSymmetric

Let op: snapJoins kunnen alleen worden aangemaakt als de ridgeHeight niet kleiner is dan 3mm!

This entry was posted in 3D printing, Arduino, Computer, ESP8266, Hardware, Scripts and tagged , , , , . Bookmark the permalink.

23 Responses to Nog een geparametriseerde projectbox generator

  1. Release 1.8 is uit!

    Bugfixes en veranderingen in de API voor pcbStands[] en connectors[]!

    Zie de documentatie!

  2. Johan says:

    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 !

  3. S. Verdoold says:

    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.

    • Willem Aandewiel says:

      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?

      • S. Verdoold says:

        Dat is zeker ook nog iets om even te proberen.
        En anders moet ik gewoon wat aan die handigheid gaan doen natuurlijk…

    • Willem Aandewiel says:

      Beste S.

      Rev. 1.5 maakt zogenaamde “Flenzen” als overgang tussen de lid- en basePlanes.

      De flenzen maken de verbinding sterker.

  4. Willem Aandewiel says:

    Yes, as you can read in the README.md and in the documentation there now is an extra param “angle”.

  5. Bruce D Lightner says:

    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):

    YAPPgeneratoir v1.4

    After (with new YAPPgenerator_v14.scad):

    YAPPgenerator v1.3

    BTW: I really find your library very useful. I’ve made three different tiny enclosures for what I’m currently prototyping.


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

  7. Gerard says:

    Complimenten voor deze goed doordachte generator en de documentatie!
    Ik ben blij deze gevonden te hebben en zal m veel gebruiken.

  8. Bruce D Lightner says:

    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.

  9. DaveE says:

    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!!

  10. 8 Februari 2022

    Ik heb de documentatie uitgebreid met voorbeelden van het gebruik van zgn. “Hooks”, “base Mounts” en “snapJoins”

  11. andrew williams says:

    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

    • Willem Aandewiel says:

      Hi Andrew,

      Thanks for the compliment!

      You can use an array “baseMounts” (see YAPPtemplate.scad) to create … well, “baseMounts”!

  12. Jürgen Kern says:

    Thank you so much for this project!

    • Willem Aandewiel says:

      Well, I just needed a project box myself and could not find anything that I could use or understand…

      Thanks for the complement!

  13. Ziggy says:

    Outstanding. And outstanding documentation of this complex project. I’m sure it took quite some effort. Thanks for sharing!

Leave a Reply to Willem Aandewiel Cancel reply

Your email address will not be published. Required fields are marked *

The maximum upload file size: 4 MB. You can upload: image, other. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here

This site uses Akismet to reduce spam. Learn how your comment data is processed.