Diseño de piezas con OpenScad II

De WikiRobotics
Revisión del 09:29 9 mar 2014 de Obijuan (Discusión | contribuciones) (Estudiando el código compartido por los demás)

Saltar a: navegación, buscar
Logo-temp-2.png

Contenido

Ficha

Introducción

Segunda temporada de tutoriales de Openscad. La filosofía es la misma que con los primeros: Intentar que NO SOBREPASEN LOS 3 MINUTOS, de manera que si uno no te gusta, sólo habrás perdido 3 minutos de tu vida.

Nota: Bueno, vale, en algunos vídeos me he pasado de tiempo. Intentaré estar por debajo de 5 minutos siempre  :-)

Descargas

Pendiente... de momento los ejemplos están accesibles desde el repositorio en github

Aprendiendo más opciones de Openscad

1) Usando un editor mejorado

Video Tutorial 1
Código openscad en el editor externo kate (click para ampliar)

Descripción

El editor de textos que incorpora openscad es muy básico. Vamos a ver cómo podemos utilizar un editor externo

Pasos

Los pasos a realizar son los siguientes:

  • Abrir openscad
  • Ir a la opción view/hide editor. Con esto dejamos de ver el editor de openscad
  • Ir a la opción design/automatic reload and compile
  • Salir de openscad. Se quedarán grabadas las estas opciones de manera que la siguiente vez que arranque openscad no hace falta volverlas a activar

Ahora, para editar cualquier programa sólo hay que abrirlo con openscad y luego con el editor de texto que queramos. Cada vez que se graben los cambios, openscad cargará automaticamente ese fichero y lo visualizará.

Configuración del editor kate en Linux

  • Instalar kate (sudo apt-get install kate)
  • Descargar el fichero openscad.xml
  • Copiar el fichero en /usr/share/kde4/apps/katepart/syntax/
sudo cp $HOME/Downloads/openscad.xml /usr/share/kde4/apps/katepart/syntax/
  • Dar permiso de lectura al fichero:
sudo chmod a+r  /usr/share/kde4/apps/katepart/syntax/openscad.xml
  • Ejecutar kate
  • Ir a la opción tools > mode > Other > Openscad

Créditos

  • El primero que me enseñó esta opción de openscad fue Sergio Vilches
  • El fichero con resaltado de sintaxis de kate es obra de Kevin Weekly

2) ¡¡¡Las pirámides son cilindros!!!

Video Tutorial 2
Cono truncado (click para ampliar)
Piramide (click para ampliar)

Descripción

Se muestra cómo con el comando "cylinder" de openscad se pueden crear conos, pirámides y tetraedros

Código

//-- Cilindro normal. r es el radio, h es la altura
*cylinder (r = 20, h = 20, $fn = 100);

//-- Cono truncado. r1 radio base inferior, r2 radio de la base superior
*cylinder (r1 = 20, r2 = 10, h = 20, $fn = 100);

//-- Cono
*cylinder (r1 = 20, r2 = 0, h = 20, $fn = 100);

//-- Piramide de base hexagonal
*cylinder (r1 = 20, r2 = 10, h = 20, $fn = 6);

//-- Piramide
*cylinder (r1 = 20, r2 = 0, h = 20, $fn = 4);

//-- Tetraedro
cylinder (r1 = 20, r2 = 0, h = 20, $fn = 3);

3) Mis objetos en una cuadrícula, por favor

Video Tutorial 3
Objetos en la cuadrícula virtual (click para ampliar)

Descripción

Ejemplo de organización de 6 objetos en una cuadrícula virtual paramétrica. Más adelante esta idea se desarrollará y refinará

Código

//-- Dimensiones de los cuadros de la cuadricula
d = 60;

//-- Centrar la cuadricula (opcional)
translate([-2*d / 2, -d / 2, 0]) {

  //-- Punto: 0, 0
  translate([0, 0, 0]) cylinder (r = 20, h = 20, $fn = 100);
  
  //-- Punto: 1, 0
  translate([d, 0, 0]) cylinder (r1 = 20, r2 = 10, h = 20, $fn = 100);

  //-- Punto: 2, 0
  translate([2*d, 0, 0]) cylinder (r1 = 20, r2 = 0, h = 20, $fn = 100);

  //-- Punto: 0, 1
  translate([0, d, 0])  cylinder (r1 = 20, r2 = 10, h = 20, $fn = 6);

  //-- Punto: 1, 1
  translate([d, d, 0])  cylinder (r1 = 20, r2 = 0, h = 20, $fn = 4);

  //-- Punto: 2, 1
  translate([2*d, d, 0]) cylinder (r1 = 20, r2 = 0, h = 20, $fn = 3);

}

4) Esferita, esferita, dime donde está la cuadrícula

Video Tutorial 4
Una esfera y un cube dentro de la cuadrícula (click para ampliar)

Descripción

Aprender a crear esferas. Ejemplo de cómo visualizar una cuadrícula.

Código

Fichero: esfera-cuadricula.scad

//-- Ejemplo de uso de esferas para visualizar una cuadrícula
//-- de N x N cuadros

//-- Tamaño de cada cuadro
d = 30; 

//-- Radio de las esferas en la cuadrícula
r = 2;

//-- Número de cuadros (N x N)
N = 10;

//-- Tamaño total de la cuadrícula
size = N * d;

//-- Dibujar la cuadricula
translate([-size / 2, -size / 2, 0]) //-- Centrar cuadricula
for (ix = [0:N]) //-- Esferas en eje x
  for (iy = [0:N]) //-- Esferas en eje y
    //-- Posicionar la esfera en punto (ix, iy)
    translate([ix * d, iy * d, 0])
      sphere(r = r, $fn=20);

//-- Objeto ejemplo en punto (2, 2): una esfera roja
translate([2 * d, 2 * d, 0])
  color("red")
    sphere(r = 15, $fn = 20);

//-- Objeto ejemplo en punto (-3, -4): un cubo azul
color("blue")
  translate([-3 * d, -4 * d, 0])
   cube([20, 20, 20], center = true);

5) Organiza tus canicas

Video Tutorial 5
(click para ampliar)
(click para ampliar)

Descripción

Ejemplo de diseño de una pieza paramétrica para organizar las canicas

Código

//-- Organizador de canicas paramétrico

//-- Número de canicas
N = 3;

//-- Diametro de las canicas
dc = 16;

//-- Tamaño de cada cuadro
d = dc + 3;

//-- Tamaño total de la cuadrícula
size = (N-1) * d;

//-- Tamaño de la caja donde están las canicas
size_box = N * d;
h_box = dc / 2 + 1;

difference() {
  //-- Caja de las canicas
  translate([0, 0, -h_box / 2])
  cube([size_box, size_box, h_box], center = true);

  //-- Canicas
  translate([-size / 2, -size / 2, 0]) //-- Centrar canicas
  for (ix = [0:N-1])
    for (iy = [0:N-1])
      //-- Posicionar la canica en punto (ix, iy)
      translate([ix * d, iy * d, 0])
        sphere(r = dc/2, $fn=20);
}

6) ¡Comparte tus diseños!

Video Tutorial 6
Una esfera y un cube dentro de la cuadrícula (click para ampliar)


Descripción

Una vez terminado un diseño... ¡Compártelo! Es la manera de que el conocimiento esté disponible para todos y que podamos mejorar.

Como ejemplo, esto son los sitios donde he compartido el organizador de canicas:

7) Tirando tangentes con el operador hull

Video Tutorial 7
Pieza que queremos diseñar (click para ampliar)
Esquema de los elementos geométricos que componen la pieza (click para ampliar)

Descripción

El comando hull crea el objeto convexo mínimo que incluye otros objetos indicados. Se muestra su uso para construir una pieza en la que es necesario crear las tangentes entre dos cilindros.

Código

//-------- Parametros de la pieza
r1 = 25; //-- Radio cilindro 1
r2 = 10; //-- Radio cilindro 2
th = 5; //-- Grosor

//-- Distancia entre los centros de los cilincros
d = r1 + r2 + 10;

//-- Crear el objetco convexo minimo que contiene ls dos
//-- cilindros
hull() {

  //-- Cilindro 1
  translate([-d/2, 0, 0])
    cylinder(r = r1, h = th, center = true, $fn = 50);
    
  //-- Cilincro 2
  translate([d/2, 0, 0])
    cylinder(r = r2, h = th, center = true, $fn = 50);
}

8) Figuras redondeadas en el plano xy

Video Tutorial 8
Caja redondeada (click para ampliar)
Esquema de cómo hacer la caja redondeada (click para ampliar)

Descripción

Ejemplo de cómo se pueden hacer objetos con las aristas verticales redondeadas, usando el comando hull

Código

//-- Parametros de la caja
lx = 50; //-- Longitud en eje x
ly = 40; //-- Longitud en eje y
r = 5; //-- Radio del redondeo de las esquinas
h = 10; //-- Altura

//-- Coordenadas del cilindro del primer cuadrante
cx = lx/2 - r;
cy = ly/2 - r;

//-- Posicion de los 4 cilindros de las esquinas
P1 = [cx, cy, 0];
P2 = [-cx, cy, 0];
P3 = [-cx, -cy, 0];
P4 = [cx, -cy, 0];
 

//-- Obtener el menor objeto convexo que contiene
//-- los 4 cilindros
hull() {
  translate(P1)
    cylinder(r = r, h = h, center = true, $fn = 20);
   
  translate(P2)
    cylinder(r = r, h = h, center = true, $fn = 20);
   
  translate(P3)
    cylinder(r = r, h = h, center = true, $fn = 20);
   
  translate(P4)
    cylinder(r = r, h = h, center = true, $fn = 20);
}

9) Automatizando con vectores

Video Tutorial 9
Figura convexa redondeada formada mediante 7 cilindros y el comando hull (click para ampliar)
Detalles de la figura y los cilindros (click para ampliar)

Descripción

Creación de objetos redondeados a partir de un número genérico de cilindros. Las posiciones de los cilincros se guardan en un vector (array). Usando un bucle for se recorren y se colocan automáticamente los cilindros. Luego se aplica hull para generar el objeto convexo mínimo que contiene todos los cilindros.

Código

//-- Parametros
r = 5; //-- Radio del redondeo de las esquinas
h = 10; //-- Altura

//-- Coordenadas del cilindro del primer cuadrante
cx = 20;
cy = 15;

//-- Vector de puntos, con las posiciones de los cilindros
POINT = [
  [cx, cy, 0], //-- Punto 0
  [-cx, cy, 0], //-- Punto 1
  [-cx, -cy, 0], //-- Punto 2
  [cx, -cy, 0], //-- Punto 3
  [2*cx, 0, 0], //-- Punto 4
  [0, 1.5*cy, 0], //-- Punto 5
  [0,0,h], //-- Punto 6
];
 

//-- Obtener el menor objeto convexo que contiene
//-- los cilindros situados en los puntos indicados en
//-- el vector POINT

hull() { 

  //-- Dibujar cada cilindro en su posicion correspondiente
  for (pos = POINT)
    translate(pos)
      cylinder(r = r, h = h, center = true, $fn = 20);
}

Apilando 2 objetos

Video Tutorial 10
Dos cubos apilados (click para ampliar)
Dos cubos apilados (click para ampliar)


Descripción

Apilar 2 objetos es fácil... pero usando vectores es mucho más fácil aún y el código se mantiene mejor

Código

//-- Definiciones para acceder a las componentes X,Y,Z
//-- Aunque las definimos todas, en este ejemplo solo
//-- accedemos a la componente Z de los cubos
X = 0;
Y = 1;
Z = 2;

//-- Dimensiones de los cubos. Se pueden cambiar por el usuario
//-- Todo se recalculara para que B esté siempre encima de A
A = [30, 30, 10];
B = [10, 10, 30];

//-- Calcular la posicion de B para que este encima de A
posB = [0, 0, B[Z]/2 + A[Z]/2];

//---- Construccion de la figura a partir de los datos calculados!
//-- Poner el cubo B encima del A

//-- Poner el cubo A (es la base)
cube(A, center = true);

//-- Cubo B, encima de A
translate(posB)
  cube(B, center = true);

Apilando varios objetos

Video Tutorial 11
(click para ampliar)


Descripción

Se propone como ejercicio modificar el ejemplo del tutorial anterior para apilar 4 objetos

Código

//-- Definiciones para acceder a las componentes X,Y,Z
//-- Aunque las definimos todas, en este ejemplo solo
//-- accedemos a la componente Z de los cubos
X = 0;
Y = 1;
Z = 2;

//-- Dimensiones de los cubos. Se pueden cambiar por el usuario
//-- Todo se recalculara para que todos los cubos esten apilados
A = [30, 30, 10];
B = [10, 10, 30];
C = [6, 6, 10];
D = [3, 3, 3];

//-- Calcular las posicion de los cubos para que esten apilados
posB = [0, 0, B[Z]/2 + A[Z]/2];
posC = posB + [0, 0, C[Z]/2 + B[Z]/2];
posD = posC + [0, 0, D[Z]/2 + C[Z]/2]; 

//---- Construccion de la figura a partir de los datos calculados! 

//-- Poner el cubo A (es la base)
cube(A, center = true);

//-- Cubo B, encima de A
translate(posB)
  cube(B, center = true);
  
//-- Poner el cubo C encima del B
translate(posC)
  cube(C, center = true);

//-- Poner el cubo D encima del C   
translate(posD)
  cube(D, center = true);

Mis cubos con curvas, por favor

Video Tutorial 12


El cubo redondeado en 3D (click para ampliar)
Construido a partir de 8 esferas y aplicando el comando hull (click para ampliar)
Comparación entre el cubo redondeado y uno sin redondear (click para ampliar)
Obtener las coordenadas de las esferas de los vértices (click para ampliar)

Descripción

Crear un cubo con todas las aristas redondeadas es muy fácil. Basta con colocar esferas en cada uno de los vertices y aplicar el comando hull. Para que el cubo tenga las mismas dimensiones que el equivalente sin redondear, hay que calcular las coordenadas de las 8 esferas.

Código

//-- Constantes para acceder a las coordenadas X,Y,Z de los vectores
X = 0;
Y = 1;
Z = 2;

//-- Parámetros del cubo redondeado
r = 4; //-- Radio de las curvas
A = [30, 30, 20]; //-- Dimensiones del cubo 

//-- Calcular las coordenadas en funcion de los parametros del user
a = (A - [2*r, 2*r, 2*r])/2;

//-- Obtener las coordenadas. Es un atajo para no escribir tanto
x = a[X];
y = a[Y];
z = a[Z]; 

//-- Calcular los vertices del cubo
vertice = [
  [x, y, z],
  [-x, y, z],
  [-x, -y, z],
  [x, -y, z],
  [x, y, -z],
  [-x, y, -z],
  [-x, -y, -z],
  [x, -y, -z],
]; 

//-- Cubo de comprobacion. Mismas dimensiones pero sin
//-- redondear. El redondeado debe tener las mismas dimensiones
%cube(A, center = true);

//-- Dibujar el cubo redondeado. Se coloca en cada vertice una
//-- esfera de radio r y se aplica el operador hull
hull()
  for (pos = vertice)
    translate(pos)
      sphere(r = r, $fn = 20);

Objetos condicionales: cilindros redondeados

Video Tutorial 13
(click para ampliar)
(click para ampliar)
(click para ampliar)

Descripción

Crearemos un objeto condicional denominado rcylinder. En función del parámetro both, se dibuja bien un cilindro con ambas tampas redondeadas, o bien sólo con la superior. También la translación aplicada dependerá del valor del parámetro center.

Código

//-- Cilindro redondeado en las tapas
//-- Parametros:
//-- r: radio del cilindro
//-- h: Altura del cilindro
//-- center : [true, false], centrar el cilindro
//-- both: [true, false]
//-- true: Redondear ambas tapas (superior e inferior)
//-- false: solo se redondea la tapa superior
module rcylinder(r = 4,
                 h = 20,
                 center = false,
                 both = false, $fn = 30)
{ 

  //-- Calcular la altura del cilindro interior
  //-- Si redondeo por las dos tapas, vale h - 2*r
  //-- si solo una tapa entonces h - r
  hc = (both == true) ? h - 2 * r : h - r;
  
  //-- Calcular la traslacion para centrar el cilindro
  posc = (center == true) ? 0 : h/2;
  
  //-- Aplicar traslaciopn para el centrado
  translate([0, 0, posc])
  
    //-- Cilindro con ambas tapas redondeadas
    //-- Se pone un cilindro de altura hc y una esfera
    //-- en la parte superior y otra en la inferior
    if (both == true) {
      cylinder(r = r, h = hc, center = true, $fn = $fn);
      
      //-- Esferas superior e inferior
      for (i = [-1, 1])
        translate([0, 0, i * hc / 2])
          sphere(r = r);
          
    }
    //-- Cilindro con tapa superior redondeada
    else
      //-- Centrar la figura
      translate([0, 0, -h/2]) {
     
        //-- Cilindro + esfera
        cylinder(r = r, h = hc, $fn = $fn);
          translate([0, 0, hc]) sphere(r = r, $fn = $fn);
      }
       
}

//-- Parametros para los ejemplos
r = 5;
h = 30;
center = false;
$fn = 30;

//-- Cilindro normal
translate([-3*r, 0, 0])
  cylinder(r = r, h = h, center = center, $fn = $fn);

//-- Cilindro con tapa superior redondeada
rcylinder(r = r, h = h, both = false, center = center, $fn = $fn);

//-- Cilindro con ambas tapas redondeadas
translate([3*r, 0, 0])
  rcylinder(r = r, h = h, both = true, center = center, $fn = $fn);

Redondeados parciales con hull (II)

Video Tutorial 14
Cubo con 2 aristas verticales afiladas, una en chaflán y otra redondeada (click para ampliar)
Esquema de cómo se ha construido la figura (click para ampliar)
Cubo con todas las aristas redondeadas (click para ampliar)
Esquema (click para ampliar)
Cubo con las aristas verticales y horizontales superiores redondeadas (click para ampliar)
Esquema (click para ampliar)

Descripción

Ejemplo de cómo hacer figuras con diferentes terminaciones en las aristas. Según cómo combinemos los objetos con hull, conseguimos aristas en 90 grados, en chaflán o redondeadas

Código

use <rcylinder.scad>

X = 0;
Y = 1;
Z = 2;

//-- Parametros del cubo
size = [20, 20, 10];
r = 2;

//-- Calcular las coordenadas de la esquina del cuadrante 1
xc = size[X]/2 - r;
yc = size[Y]/2 - r;
zc = size[Z]/2;

//-- Tamaño de las columnas cuadradas
col_size = [2 * r, 2 * r, size[Z]];

//-- Posiciones de las columnas
vertex = [
  [xc, yc, 0],
  [-xc, yc, 0],
  [-xc, -yc, 0],
  [xc, -yc, 0],
];

//-- Ejemplo 1:  Modificacion de las aristas verticales
module example1() 
{
  hull() {
    for (v = [0:1]) 
      translate(vertex[v]) 
      	 cube(col_size, center = true);
        //cylinder(r = r, h = size[Z], center = true, $fn = 4);

    translate(vertex[2])
      cylinder(r = r, h = size[Z], center = true, $fn = 50);    
	
    translate(vertex[3])
      cylinder(r = r, h = size[Z], center = true, $fn = 4);
  }
}

//-- Ejemplo 2: Modificacion de las aristas horizontales y verticales
module example2()
{
  hull() {
  for (v = [0:3]) 
    translate(vertex[v])
       //cylinder(r = r, h = size[Z], center = true, $fn = 50);
      rcylinder(r = r, h = size[Z], both = false, center = true, $fn = 40);
      //rcylinder(r = r, h = size[Z], both = true, center = true, $fn = 40);
  }
}

//-- Ejemplos para probar

example1();
//example2();

El operador Minkowski

Video Tutorial 15
Minkowski de la pieza con un cilindro (click para ampliar)
Resultado final (click para ampliar)
Piezas originales y resultado del minkowski(click para ampliar)
Minkowski de la pieza con una esfera (click para ampliar)
Resultado final (click para ampliar)
Piezas originales y resultado del minkowski (click para ampliar)
Minkowski de la pieza con un cilindro redondeado (click para ampliar)
Resultado final (click para ampliar)
Piezas originales y resultado del minkowski (click para ampliar)

Descripción

Utilización del operador Minkowski para redondear tanto las aristas verticales como horizontales de un objeto no convexo

Código

use <rcylinder.scad>

X = 0;
Y = 1;
Z = 2;

size = [20, 20, 10];
r = 2;

//-- Pieza de ejemplo, a la que aplicar Minkowski
module pieza()
{
  cube(size, center = true);
    
  translate([10,10,0])
    cube(size, center = true);
}

//-- Aplicar Minkowski a la pieza, usando diferentes objetos 
minkowski() {
  pieza();
  
  cylinder(r = r, h = 1, center = true, $fn = 10);
  //sphere(r = r, $fn = 10);
  //rcylinder(r = r, h = 2 * r, both = false, center = true, $fn = 10);
}

// Pieza original, para compararla con la conseguido con minkowski
*pieza();

//-- La otra pieza utilizada con minkowski
*color("red")
translate([-size[X]/2, 0, size[Z]/2])
cylinder(r = r, h = 1, center = true, $fn = 10);
//sphere(r = r, $fn = 10);
//rcylinder(r = r, h = 2 * r, both = false, center = true, $fn = 10);

Estudiando el código compartido por los demás

Video Tutorial 16
Ejemplo 9 incluido en Openscad: Un ventilador (click para ampliar)
Ejemplo 10 incluido en Openscad: Una superficie (click para ampliar)
Engranaje de ejemplo. Incluido en el fichero involute_gears.scad de la librería MCAD (click para ampliar)
Elementos del fichero hardware.scad de la librería MCAD (click para ampliar)
Una Impresora 3D modelo Prusa i3. Las piezas están diseñadas con Openscad (click para ampliar)
El carro del eje x de una Prusa i3 (click para ampliar)
Impresora 3D modelo Powercode, derivada de la Prusa i3. Piezas en openscad (click para ampliar)
El carro del eje x de una PowerCode (click para ampliar)
La Cyclone PCB Factory, una fresadora imprimible para hacer Circuitos Impresos (click para ampliar)
Vista 3D de la Cyclone, hecha con Openscad (click para ampliar)
[[|thumb|300px| (click para ampliar)]] [[|thumb|300px| (click para ampliar)]]
[[|thumb|300px| (click para ampliar)]] [[|thumb|300px| (click para ampliar)]]
[[|thumb|300px| (click para ampliar)]] [[|thumb|300px| (click para ampliar)]]

Descripción

Código

  • Ficheros: []

Objetos 3D a partir de objetos 2D

17 bis) Extruyendo objetos 2D

  • 2d -> square, circle
  • Show: Linear extrusion, rotate extrusion, linear extrusion + twist!

18 Polígonos 2D

  • Ej. triangle

4) Ejercicio: Rueda del miniskybot

5) Generación automática de polígonos con python

6) Creando logos

  • draw lines
  • move to origin
  • export to dxf
  • import into openscad

7) Creando logos (II)

  • The same but with bezier curves!!

a) Draw curves b) insert multiple points c) convert into lines d) move orig e) export dxf f) import openscad

8) Creating logos from images!

Ej. Obijuan Academy!


POR HACER...

Operaciones: Escalar, simetrías

Creando tus propias transformaciones

Cuadricula: grid

11) Using libraries: write

12) Obiscad: roudend cube

13) Obiscad: Vectors

14) Obiscad: beveling and reinforcements

15) attach?

16) MCAD library

Repositorio

Los ficheros fuentes están en este repositorio:

Licencia

Cc logo.png This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 Spain License.

Sobre este tutorial

Este tutorial está realizado exclusivamente usando herramientas libres.

Enlaces

Noticias

  • 25/Dic/2013: Tutorial 1) Usando un editor externo
  • 24/Dic/2013: Comenzada la página

Proyecto Clone wars

Proyecto Clone wars: Construye tu impresora 3D opensource!
Proyecto Reprap
Proyecto RepRap: Impresoras 3D auto-replicantes. El origen de la revolución de las impresoras 3D opensource
Obijuan Academy
Obijuan Academy, Tu academia rebelde! ;-)