In questo articolo OpenSCAD neopixel ws2812 leggerai come ho utilizzato un programma open source per disegnare un modello 3D usato nella mia ultima sperimentazione wearable.
Hai certamente già letto i miei articoli dedicati all’utilizzo di software open source come openscad per disegnare case, box da tagliare a laser ecc.
Uso regolarmente questo software dal 2012 sia perché open source sia per la qualità e la semplicità con cui è possibile disegnare partendo da linee di codice.
L’eperimento OpenSCAD neopixel ws2812
Questo articolo dedicato all’esperimento OpenSCAD neopixel ws2812 potrebbe essere molto simile a tanti altri in cui con un cad 3D disegni un case.
La differenza principale è che in questo esperimento vedrai come disegnare, e potrai utilizzare anche in futuri progetti, anche l’elemento principale da inserire nella stampa 3D: il led neopixel ws2812
Ho poi aggiunto una funzione di ispezione che ti permette di controllare la corretta posizione del componente, in modo virtuale, prima di stampare il “case”.
Il risultato finale
parto dal risultato finale per rendere meglio l’idea del perogetto OpenSCAD neopixel ws2812 e poter poi ragionare sul codice e sul metodo per la sua realizzazione in modo più chiaro.
Ciò che otterrai con l codice descritto nel paragrafo successivo sarà simile a questo:
per arrivarci farai i passaggi che ti descrivo di seguito.
Step 1 – disegno del modello ws2812
Parti dal disegno del led neopixel che inserirai nel modello da stamapre in 3D:
hai notato che rispetto al modello reale ho aggiunto un cilindro, evidente, sotto, il cui scopo è permettere la foratura del modello finale quando esso sarà inserito al suo interno, in pratica sottrarrai dal modello “case” da stampare il neopixel e grazie a quel cilindro otterrai un foro per poter eseguire le saldature una volta inserito il led nella stampa 3D.
Il codice di questo elemento è il seguente:
module WS2812B(mode) { hCube=2; if (mode == "print") { translate([0,0,-2]) cylinder(r=4.6,h=5,center=true,$fn=96); hCube=3; } translate([0,0,1]) cube([5,5,hCube],center=true); cylinder(r=5.2,h=1.3,center=true,$fn=96); }
le linee partono dalla 80 in quanto nel listato completo questa è l’ultima funzione che incontrerai.
In pratica è semplicemente un cilindro ( linea 87 ) sormontato da un cubo ( linea 86 ) raprresentatnte esattamente il led 5x5mm.
L’esperessione “if” che leggi alla linea 82 ha la funzione di aggiungere il cilindro di cui hai letto per il passaggio dei cavi ed innalzare l’altezza dell’elemento led di 1mm rispetto ai 2mm originali della linea 81.
L’utilizzo della variabile hCube , in questo caso, è la soluzione più rapida per parametrizzare questo modello senza dover scrivere due volte il codice che disegna l’elemnto led.
Step 2 – il disegno del modello
Per l’OpenSCAD neopixel ws2812 puoi realizzare il modello con la forma che più preferisci, io ho scelto la cupola che partendo da una sfera viene adeguatamente tagliata e svuotata per ottenere:
l’oggetto che andrai a stampare in 3D.
Il codice che puoi usare per disegnare tale parte è il seguente:
module singleNeopixel(radius,mode) { /* */ if (mode == "sphere") { difference() { translate([0,0,-3]) sphere(r=radius,center=true,$fn=96); translate([0,0,-3]) sphere(r=radius-1.5,center=true,$fn=96); translate([0,0,-(radius/2)-4]) cylinder(r=radius*2,h=radius+5,center=true,$fn=4); isIspection(radius); } } if (mode == "sphere") { translate([0,0,(radius/2)-.5]) cylinder(r=radius/3,h=1.5,center=true,$fn=96); /* */ difference() { union() { intersection() { translate([0,0,-0.8]) cylinder(r=radius+.5,h=2,center=true,$fn=96); translate([0,0,-3]) sphere(r=radius,center=true,$fn=96); } } // ws2812 holes translate([0,0,-0.25]) WS2812B("print"); } } }
il modulo singleNeopixel accetta due parametri (linea 37) il primo parametro rappresenta il raggio della figura, in questo caso una sfera, che vuoi realizzare ed il secondo il modello, in questo esempio puoi specificare solo “sphere” ma potresti decidere di ampliare questo modello con altre forme.
Nota che alla linea 61 richiami la funzione già vista: WS2812B il cui scopo è disegnare il modello che, in questa occasione, sottrarrai dal modello principale.
Inoltre alla linea 45 è stata richiamata la funzione isIspection(radius) che abilita la possibilità di ispezionare il modello attivando semplicemente una variabile booleana.
Step 3 – Ispeziona il modello
Per consentirti di ispezionare il modello ho previsto due passaggi, il primo è relativo all’attivazione di una variabile booleana:
sezione=false;
che puoi impostare come true o false rispettivamente se vuoi avere la visione con l’ispezione oppure no.
La funzione che si occupa di farti vedere la modalità ispezione è molto semplice ed è la isIspection(radius) che hai già incontrato nel passaggio precedente.
La funzione isIspection() inizia alla linea 43:
module isIspection(radius) { if (sezione) { translate([0,radius*2,(radius/2)]) cylinder(r=radius*2,h=radius+5,center=true,$fn=4); } }
e nel progetto OpenSCAD neopixel ws2812 ha lo scopo di permetterti di ispezionare l’oggetto “affettandolo” da un lato:
Come hai notato la funzione che stai leggendo crea solo un cubo, in modalità cilindro dandogli il parametro $fn=4 ( tecnicamente un cilindro a 4 lati ) che sarà poi usato dalla funzione singleNeopixel(radius,mode) come oggetto sottratto alla linea 45.
Il codice completo del progetto
Ecco il codice completo che ho usato per generare il modello 3D:
/****** VARS ********/ sezione=false; radius=8; /****** MAIN ********/ // WS2812B(); // WS2812B("print"); singleNeopixel(8,"sphere"); /****** FUNCTIONS ********/ module singleNeopixel(radius,mode) { if (mode == "sphere") { difference() { translate([0,0,-3]) sphere(r=radius,center=true,$fn=96); translate([0,0,-3]) sphere(r=radius-1.5,center=true,$fn=96); translate([0,0,-(radius/2)-4]) cylinder(r=radius*2,h=radius+5,center=true,$fn=4); isIspection(radius); } } if (mode == "sphere") { translate([0,0,(radius/2)-.5]) cylinder(r=radius/3,h=1.5,center=true,$fn=96); /* */ difference() { union() { intersection() { translate([0,0,-0.8]) cylinder(r=radius+.5,h=2,center=true,$fn=96); translate([0,0,-3]) sphere(r=radius,center=true,$fn=96); } } // ws2812 holes translate([0,0,-0.25]) WS2812B("print"); } } } module isIspection(radius) { if (sezione) { translate([0,radius*2,(radius/2)]) cylinder(r=radius*2,h=radius+5,center=true,$fn=4); } } module WS2812B(mode) { hCube=2; if (mode == "print") { translate([0,0,-2]) cylinder(r=4.6,h=5,center=true,$fn=96); hCube=3; } translate([0,0,1]) cube([5,5,hCube],center=true); cylinder(r=5.2,h=1.3,center=true,$fn=96); }
se lanci il rendering del modello nella schermata openSCAD: