Revista 100% Verde

Introducción al modelado 3d con OpenSCAD para electrónicos

Por Soloelectronicos @soloelectronico

Para el modelado 3D, Tinkercad debería ayudarnos ante cualquier diseño inicial de una manera más sencilla con el proceso de modelado 3D, tanto es así, que incluso los modeladores experimentados lo hacen explorando las formas de Tinkercad, pues curiosamente, una herramienta "simple" como Tinkercad puede conducir a formas complejas.

Lógicamente detrás de Tinkercad y de cualquier otro programa de modelado 3D está el código, de modo que a medida que arrastra y suelta formas, los algoritmos complejos están trabajando para calcular cómo aparecerán los gráficos en la pantalla, asi que también debería ser posible crear figuras geométricas directamente mediante código.

Para aquellos que tienen curiosidad sobre el código, OpenSCAD es una herramienta gratuita de software para explorar el modelado 3d desde esa perspectiva, resultando mucho mas eficiente y concisa en el proceso de diseño que cualquier otra herramienta gráfica como por ejemplo Tinkercad..

A diferencia de Tinkercad, OpenSCAD no es una aplicación basada en la web de modo que si esta interesado en la herramienta tendrá que descargarla ( OpenSCAD se puede descargar gartis en http://www.openscad.org y está disponible para Windows, Mac OS X y Linux) e instalarla en su PC para usarla.

La interfaz OpenSCAD es sencilla en comparación con Tinkercad ,constando de sólo tres ventanas, siendo la ventana de la izquierda un editor de texto utilizado para ingresar el código.

Introducción al modelado 3d con OpenSCAD para electrónicos

Con OpenSCAD está diseñando código,pero no se preocupe: escribir código con Open SCAD es similar al uso de HTML en una página web, siendo el código para crear objetos autoexplicativo (por ejemplo, el comando del cubo crea cubos, el comando de esfera crea esferas y el comando del cilindro crea cilindros, etc).

Probablemente haya alrededor de 60 comandos en OpenSCAD, muchos de los cuales permitirán manipular la geometría , como por ejemplo mover, rotar, escalar y usar operaciones booleanas para combinar objetos, pero no se preocupe porque p ara modelar la mayoría de la piezas solo necesitaran unos pocos comandos como son union , difference, translate, cylinder o cube.

Las secuencias de comandos en el lenguaje de OpenSCAD se utilizan para crear modelos en 2D o 3D.

Este script es una lista de formato libre de instrucciones de acción.

 object(); variable = value; operator() action(); operator() { action(); action(); } operator() operator() { action(); action(); } operator() { operator() action(); operator() { action(); action(); } } 

Como vemos hay objetos,acciones y operadores para construir un pieza:

  • Objetos:Los objetos son los bloques de construcción de modelos, creados por primitivas 2D y 3D. Los objetos terminan en un punto y coma ';'.
  • Acciones: Instrucciones de acción que incluyen la creación de objetos usando las primitivas y asignar valores a variables. Las instrucciones de acción también terminan en un punto y coma ';'.
  • Operadores :Los operadores o las transformaciones, modifican la ubicación, color y otras propiedades de los objetos. Los operadores usen llaves '{}' cuando su ámbito de aplicación abarca más de una acción. Más de un operador puede usarse para la misma acción o grupo de acciones. Varios operadores se procesan de derecha a izquierda, es decir, el más cercano a la acción del operador se procesa primero. Los operadores no terminan en punto y coma ';', pero la persona hacen acciones que contienen.

Las unidades en OpenSCAD son genéricas de modo que no hay sistemas de medición en OpenSCAD, es decir , no hay designación para las unidades, y le corresponde al diseñador definir el tamaño del objeto al configurar el archivo antes de la impresión 3D.

CLINDRO (Cylinder)

Crea un cilindro o un cono centrado sobre el eje z. Cuando el centro es cierto, también se centra verticalmente a lo largo del eje z.

Nombres de los parámetros son opcionales si en el orden que se muestra a continuación. Si un parámetro se denomina, deben también llamarse todos los parámetros siguientes.

Nota: Si se utilizan r, d, d1 o d2 debe llamarse.

cylinder(h = height, r1 = BottomRadius, r2 = TopRadius, center = true/false);
h : altura del cilindro o de cono
r : radio del cilindro. R1 = r2 = r.
R1 : radio, parte inferior del cono.
R2 : radio superior del cono.
d : diámetro del cilindro. R1 = r2 = 2 d.
D1 : diámetro, parte inferior del cono. R1 = d1/2
D2 : diámetro superior del cono. R2 = d2/2
(Nota: d, d1, d2 requiere 2014.03 o posterior. Debian en la actualidad se sabe que detrás de esto)
$fa : ángulo mínimo (en grados) de cada fragmento.
$fs : longitud circunferencial mínima de cada fragmento.
$fn : fija el número de fragmentos en 360 grados. Valores de 3 o más reemplazar $fa y $fs
$fa, $fs y $fn deben ser nombrados.
defaults: cylinder();  yields: cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false);
Introducción al modelado 3d con OpenSCAD para electrónicos
equivalent scripts
 cylinder(h=15, r1=9.5, r2=19.5, center=false);
 cylinder(  15,    9.5,    19.5, false);
 cylinder(  15,    9.5,    19.5);
 cylinder(  15,    9.5, d2=39  );
 cylinder(  15, d1=19,  d2=39  );
 cylinder(  15, d1=19,  r2=19.5);
Introducción al modelado 3d con OpenSCAD para electrónicos
equivalent scripts
 cylinder(h=15, r1=10, r2=0, center=true);
 cylinder(  15,    10,    0,        true);
 cylinder(h=15, d1=20, d2=0, center=true);
  • Introducción al modelado 3d con OpenSCAD para electrónicos
  • Introducción al modelado 3d con OpenSCAD para electrónicos
equivalent scripts
 cylinder(h=20, r=10, center=true);
 cylinder(  20,   10, 10,true);
 cylinder(  20, d=20, center=true);
 cylinder(  20,r1=10, d2=20, center=true);
 cylinder(  20,r1=10, d2=2*10, center=true);

Crea un cubo en el primer octante. Cuando el centro es cierto, el cubo se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación.

cube(size = [x,y,z], center = true/false);
cube(size =  x ,     center = true/false);
tamaño
solo valor, cubo con los lados de esta longitud
3 valor array [x, y, z], cubo con dimensiones x, y y z.
Centro
falso (predeterminado), 1 º octante (positivo), una de las esquinas en (0,0,0)
cierto, cubo está centrado en (0,0,0)
default values:  cube();   yields:  cube(size = [1, 1, 1], center = false);
Introducción al modelado 3d con OpenSCAD para electrónicos
equivalent scripts for this example
 cube(size = 18);
 cube(18);
 cube([18,18,18]);
 .
 cube(18,false);
 cube([18,18,18],false);
 cube([18,18,18],center=false);
 cube(size = [18,18,18], center = false);
 cube(center = false,size = [18,18,18] );
Introducción al modelado 3d con OpenSCAD para electrónicos
equivalent scripts for this example
 cube([18,28,8],true);
 box=[18,28,8];cube(box,true);

ROTATE

Gira su objeto 'a' grados sobre el eje del sistema coordinado o alrededor de un eje arbitrario. Los nombres de argumento son opcionales si los argumentos se dan en el mismo orden como se especifica.

El argumento 'a' (deg_a) puede ser una matriz, tal como se expresa en el uso de más arriba; Cuando deg_a es una matriz, se omite el argumento de 'v'. Donde 'a' especifica múltiples ejes después de la rotación se aplica en el siguiente orden: x, y, z. que significa el código:

rotate(a=[ax,ay,az]) {...}

es equivalente a:

rotate(a=[0,0,az]) rotate(a=[0,ay,0]) rotate(a=[ax,0,0]) {...}

El argumento opcional de 'v' es un vector y le permite establecer un eje arbitrario que será girado al objeto.
Por ejemplo, para voltear un objeto boca abajo, se puede girar el objeto 180 grados alrededor del eje 'y'.

rotate(a=[0,180,0]) { ... }

Con frecuencia esto se simplifica a

rotate([0,180,0]) { ... }

Cuando se especifica un solo eje el argumento de 'v' permite especificar cuyo eje es la base para la rotación. Por ejemplo, el equivalente a lo anterior, para girar a la vuelta y

rotate(a=180, v=[0,1,0]) { ... }

Cuando se especifica un solo eje, 'v' es un vector de definición de un eje arbitrario de rotación; Esto es diferente del eje múltiple anterior. Por ejemplo, rotar el objeto 45 grados alrededor del eje definido por el vector [1,1,0],

rotate(a=45, v=[1,1,0]) { ... }

TRANSLATE

Se mueve sus elementos secundarios a lo largo del vector especificado. El nombre de argumento es opcional.

Example:
translate(v = [x, y, z]) { ... }
Introducción al modelado 3d con OpenSCAD para electrónicos Introducción al modelado 3d con OpenSCAD para electrónicos MINKOWSKY

Muestra la suma de minkowski de los nodos secundarios.

Supongamos que tiene una caja plana y quiere un borde redondeado. Hay muchas formas de hacerlo, pero minkowski es muy elegante.

Por ejemplo toma un cubo y un cilindro:

Luego, haga una suma de minkowski de ellos (tenga en cuenta que las dimensiones exteriores de la caja ahora son 10 + 2 + 2 = 14 unidades por 14 unidades por 2 unidades de altura a medida que se suman las alturas de los objetos):

Note que el origen del segundo objeto se usa para la suma. Si el segundo objeto no está centrado, entonces la adición será asimétrica. Las siguientes sumas de Minkowski son diferentes: la primera expande el cubo original en 0.5 unidades en todas las direcciones, tanto positivas como negativas. El segundo lo expande en +1 en cada dirección positiva, pero no se expande en las direcciones negativas.

Introducción al modelado 3d con OpenSCAD para electrónicos

En nuestro diseño final que veremos para la caja ATX nos sirve para redondear los bordes de la caja :

Observar que una caja ATX es de 151 x 85

TRANSFORMACIONES

La transformación afectan a los nodos secundarios y como su nombre indica transforma de diversas maneras las figuras como moviéndolas , rotándolas o escaléndolas . Las transformaciones en cascada se utilizan para aplicar una gran variedad de transformaciones a un a figura En cascada se logra mediante declaraciones de anidación,
rotate([45,45,45]) translate([10,20,30]) cube(10); 
Las transformaciones pueden aplicarse a un grupo de nodos secundarios mediante el uso de ' {' y '}' para incluir por ejemplo el subárbol Un aspecto a tener muy en cuenta es que las transformaciones se escriben antes el objeto que afectan.

Primer ejemplo

Como habrá podido deducir , construir una pieza en OpenSCAD es un proceso mucho más eficiente cuando se usa código.

Por ejemplo, el uso de Tinkercad para crear una caja y su tapa toma más de diez operaciones que consisten en dejar caer y arrastrar objetos, alinearlos y agruparlos para crear las formas finales, de modo que este proceso podría tardar mucho tiempo según el manejo que se tenga de la herramienta.

Con OpenSCAD, puede crear la misma pieza en menos de diez minutos simplemente usando el siguiente código:

difference () {
cube ([4,3,2], center=true);
translate ([0,0,1])
cube ([3.5,2.5,2], center=true);
}

union () {
translate ([0,0,2])
cube ([4,3,.4], center=true);
translate ([0,0,1.8])
cube ([3.49,2.49,.4], center=true);

translate ([0,0,2.2])
scale ([.1,.1,.1])
sphere (r=5, center=true);

translate ([0,0,2.7])
scale ([.07,.07,.07])
sphere (r=5, center=true);
}

Explicamos a continuacion el código:

La primera sección del código se usa para crear una caja hueca .

El comando (cube [4,3,2], center = true); crea el cuadro inicial.

El comando center= true se usa para asegurar que la caja esté perfectamente centrada en 3D

La siguiente serie de comandos, translate ([0,0,1]) cube ([3.5,2.5,2], center = true) ;, se usa para crear un segundo cuadro más pequeño.

Esta segunda caja, más pequeña, se mueve hacia arriba en 1 unidad en la dirección Z usando el comando translate y se usará en la operación boleana para crear la caja hueca gracias al comando difference que se usa para restar el cuadro más pequeño (3.5×2.5×2) para el cuadro grande (4x3x2)

Como vemos cualquier comando de forma como cubo, esfera y cilindro que se encuentre dentro de los corchetes que preceden al comando de diferencia se usará en la operación booleana dando resultado qu e el primer objeto enumerado en los corchetes tendrá la forma de base, y los objetos anteriores enumerados serán "objetos de corte" y restarán la geometría de la base.

Introducción al modelado 3d con OpenSCAD para electrónicos

Para la tapa de la caja, simplemente usaremos el comando unión para formar una pieza compuesta por dos cubos superpuestos ,uno de 4x3x.4 y otro algo mas pequeño de 3.49×2.49x.4

Introducción al modelado 3d con OpenSCAD para electrónicos

Los últimos dos conjuntos de comandos crean el mango esférico para la parte superior de la tapa

translate ([0,0,2.2])
scale ([.1,.1,.1])
sphere (r=5, center=true);

translate ([0,0,2.7])
scale ([.07,.07,.07])
sphere (r=5, center=true);

Finalmente, el comando de unión se usa para combinar todos los elementos de tapa juntos.

Introducción al modelado 3d con OpenSCAD para electrónicos

Ejemplo fuente ATX

Para mostrar lo util que es el prototipado con esta herramienta, vamos a ver como se puede hacer un tapa a una fuente de ordenador ATX de ordenador de modo que queden accesibles las tensiones principales de la fuente(+12,-12 y +5V) y además podamos controlarlas con un conmutador y un instrumento de panel.

El prototipo final es el que mostramos a continuación:

Introducción al modelado 3d con OpenSCAD para electrónicos

Podemos ver la tapa como dos bloques , donde uno sera la caja y el otro todos los orificios que se practiquen sobre el mismo

Bloque inicial

La primera sección del código se usa para crear una caja hueca y los agujeros de los laterales.

El comando translate([0,0,0]) cube([151,85,29]); crea el cuadro inicial de medidas algo superiores al frontal de una caja ATX dado que debe colocarse esta deno.

La siguiente serie de comandos, trtranslate([0,0,2]) cube([151,85,28]); se usa para crear un segundo cuadro más pequeño .

Esta segunda caja, más pequeña, se mueve hacia arriba en 2 unidades en la dirección Z usando el comando translate y se usará en la operación boleana para crear la caja hueca gracias al comando difference que se usa para restar el cuadro más grande al cuadro pequeño

En el diseño para la caja ATX nos sirve la función minkowski para redondear los bordes de la caja :

Observar que una caja ATX es de 151 x 85 x29.

En este bloque además se practican los agujeros de refrigeracion en la cara inferior por medio de la creación de cilindros de radio 5

//agujeros de refrigeracion
translate([40,80,12]) rotate([-90,0,0]) cylinder(h=9,r=5);
translate([60,80,12]) rotate([-90,0,0]) cylinder(h=9,r=5);
translate([75,80,12]) rotate([-90,0,0]) cylinder(h=9,r=5);
translate([90,80,12]) rotate([-90,0,0]) cylinder(h=9,r=5);
translate([110,80,12]) rotate([-90,0,0]) cylinder(h=9,r=5);

Asimismo, se crean 4 orificios para los 4 tornillos que serviran para sujetar esta pieza a la caja ATX :

// 4 agujeros para sujetarlos a la caja ATX
translate([15.5,-2,25]) rotate([-90,0,0]) cylinder(h=3,r1=3.5,r2=1.5);
translate([135.5,-2,25]) rotate([-90,0,0]) cylinder(h=3,r1=3.5,r2=1.5);

translate([-2,80,25]) rotate([0,90,0]) cylinder(h=3,r1=3.5,r2=1.5);
translate([154,80,25]) rotate([0,-90,0]) cylinder(h=3,r1=3.5,r2=1.5);

Además, en este bloque se han añadido dos patas compuestas por dos cubos que se fijaran a la cara inferior

//2 pies de apoyo
translate([10,86,0]) rotate([.5,0,0]) cube([10,3,30]);
translate([131,86,0]) rotate([.5,0,0]) cube([10,3,30]);

Bloque de vaciados

Se ha visto interesante reforzar los 5 bornas por medio de 5 cilindros interiores que ayudan a dar más consistencia a las bornas en su operacion normal ,las cuales estan formados simplemente por cilindros de poca altura:

//refuerzo conectores
translate([18,70,0]) cylinder(h=5,r=6);
translate([38,70,0]) cylinder(h=5,r=6);
translate([58,70,0]) cylinder(h=5,r=6);
translate([151-18,70,0]) cylinder(h=5,r=6);
translate([151-38,70,0]) cylinder(h=5,r=6);

Asimismo se han añadido refuerzos en el interior para mejorar la estabilidad mecánica formados por cubos y que recorren toda la caja :

//Costillas de refuerzo para la caja
translate([0,0,0]) cube([3,3,20]);
translate([0,82,0]) cube([3,3,20]);
translate([148,0,0]) cube([3,3,20]);
translate([148,82,0]) cube([3,3,20]);
translate([47,0,0]) cube([3,3,20]);
translate([47,82,0]) cube([3,3,20]);
translate([77,0,0]) cube([3,3,20]);
translate([100,82,0]) cube([3,3,20]);
translate([0,40,0]) cube([3,3,20]);
translate([148,50,0]) cube([3,3,20]);
translate([47,40,0]) cube([3,45,4]);
translate([100,50,0]) cube([3,35,4]);
translate([0,40,0]) cube([80,3,4]);
translate([77,0,0]) cube([3,50,4]);
translate([77,50,0]) cube([151-77,3,4]);
}

También es interesante destacar la abertura para el interruptor de encendido y el display led formado por dos simples cubos , así como tambien los agujeros para los conectores formados por 5 cilindros:

//Abertura para el display
translate([32,12,0]) cube([45.3,25.7,10]);

//Abertura para el interruptor
translate([15,15,0]) cube([11.7,19.6,10]);

//Agujeros para los conectores
translate([18,70,0]) cylinder(h=9,r=5);
translate([38,70,0]) cylinder(h=9,r=5);
translate([58,70,0]) cylinder(h=9,r=5);
translate([151-18,70,0]) cylinder(h=9,r=5);
translate([151-38,70,0]) cylinder(h=9,r=5);

Por ultimo, para mejorar la refrigeración se ha optado por poner rejillas de ventilación en el frontal formadas cada una por 2 cilindros huecos y un cubo

Como novedad se realiza de forma re-cursiva mediante el empleo de un bucle for

Finalmente, si lo unimos todo, tenemos el siguiente código para general la pieza entera:

module box(){
difference(){
union(){
minkowski(){
translate([0,0,0]) cube([151,85,29]);
cylinder(r=2);
}
//2 pies de apoyo
translate([10,86,0]) rotate([.5,0,0]) cube([10,3,30]);
translate([131,86,0]) rotate([.5,0,0]) cube([10,3,30]);
}
//vaciado de la caja
translate([0,0,2]) cube([151,85,28]);

// 4 agujeros para sujetarlos a la caja ATX
translate([15.5,-2,25]) rotate([-90,0,0]) cylinder(h=3,r1=3.5,r2=1.5);
translate([135.5,-2,25]) rotate([-90,0,0]) cylinder(h=3,r1=3.5,r2=1.5);

translate([-2,80,25]) rotate([0,90,0]) cylinder(h=3,r1=3.5,r2=1.5);
translate([154,80,25]) rotate([0,-90,0]) cylinder(h=3,r1=3.5,r2=1.5);

//Costillas de refuerzo para la caja
translate([0,0,0]) cube([3,3,20]);
translate([0,82,0]) cube([3,3,20]);
translate([148,0,0]) cube([3,3,20]);
translate([148,82,0]) cube([3,3,20]);
translate([47,0,0]) cube([3,3,20]);
translate([47,82,0]) cube([3,3,20]);
translate([77,0,0]) cube([3,3,20]);
translate([100,82,0]) cube([3,3,20]);
translate([0,40,0]) cube([3,3,20]);
translate([148,50,0]) cube([3,3,20]);
translate([47,40,0]) cube([3,45,4]);
translate([100,50,0]) cube([3,35,4]);
translate([0,40,0]) cube([80,3,4]);
translate([77,0,0]) cube([3,50,4]);
translate([77,50,0]) cube([151-77,3,4]);
}
//Abertura para el display
translate([32,12,0]) cube([45.3,25.7,10]);

//Aabertura para el interruptor
translate([15,15,0]) cube([11.7,19.6,10]);

//Rejilla de ventilacion
for ( i = [85 : 8 : 145] )
{
translate([i,10,0]) cylinder(h=9,r=2);
translate([i,45,0]) cylinder(h=9,r=2);
translate([i-2,10,0]) cube([4,35,4]);
}
}


Volver a la Portada de Logo Paperblog