✍ diale.org

Webpage of Tiago Charters de Azevedo

Início/Start Arquivo/Archive AdNauseum Notas/Notes Contact me RSS


Vaso 3D

... obtido por rotação em torno de um eixo

2016/11/27-13:47:37

A visualização tridimensional é um ingrediente importante na comunicação e estudo da matemática. Figuras e modelos expressam ideias e antecipam o estabelecimento de um formalismo matemático mais rigoroso. Embora a imaginação visual não substitua o conceito de demonstração dá-nos uma prova visual convincente e permite construir uma intuição sobre os resultados a perseguir e ideias a aprofundar.

A figura seguinte mostra a modelação 3D de uma "jarra" construída através da rotação em torno de um eixo.

Ao contrário do que acontece com outros tipos de software, os softwares usados em matemática permitem de uma forma muito económica a modelação e construção de estruturas não triviais, especificando simplesmente a expressão que as definem.

phi=(1+sqrt(5))/2;

n=100;

r=40;
l=152;
mu=3;
mv=2;
a=.25;
b=a/phi;
lambda=1.5;

nu=.2;
[u,v]=meshgrid([linspace(0,2*pi,n) 2*pi/n],linspace(0,l,n));

x=r*cos(u).*abs(cos(u)).^nu.*(1+a*cos(mu*u+mv*pi*v/l).^5+b*cos(mv*2*pi*v/l));
y=r*sin(u).*abs(sin(u)).^nu.*(1+a*cos(mu*u+mv*phi*pi*v/l).^5+b*cos(mv*2*pi*v/l));
z=v;

simplef2stl("vase.stl",x,y,z)

Depois de impresso o resultado é muito apelativo!

... e não é uma curva.

Função para gerar STL em GNU/Octave

## Author: Tiago Charters de Azevedo 
## Maintainer: Tiago Charters de Azevedo 

## Copyright (c) - 2016 Tiago Charters de Azevedo

## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.

## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor,
## Boston, MA 02110-1301, USA.

function simplef2stl(filename,x,y,z)
  fid=fopen(filename,'w');
  title_str=sprintf('%s',datestr(now));
  fprintf(fid,'solid %s\r\n',title_str);

  zmin=min(min(z));
  z=z-zmin;
  nfacets=0;
  nx=size(z,1);
  ny=size(z,2);
  for i=1:nx-1;
    for j=1:ny-1
      p1=[x(i,j) y(i,j) z(i,j)];
      p2=[x(i,j+1) y(i,j+1) z(i,j+1)];
      p3=[x(i+1,j+1) y(i+1,j+1) z(i+1,j+1)];
      writefacet(fid,p1,p2,p3);

      p1=[x(i+1,j+1) y(i+1,j+1) z(i+1,j+1)];
      p2=[x(i+1,j) y(i+1,j) z(i+1,j)];
      p3=[x(i,j) y(i,j) z(i,j)];        
      writefacet(fid,p1,p2,p3);
    end
  end
  fprintf(fid,'endsolid');
  fclose(fid);
end  
  
function num=writefacet(fid,p1,p2,p3)
    n=normal(p1,p2,p3);
    fprintf(fid,'facet normal %.7E %.7E %.7E\r\n',n(1),n(2),n(3));
    fprintf(fid,'outer loop\r\n');        
    fprintf(fid,'vertex %.7E %.7E %.7E\r\n',p1);
    fprintf(fid,'vertex %.7E %.7E %.7E\r\n',p2);
    fprintf(fid,'vertex %.7E %.7E %.7E\r\n',p3);
    fprintf(fid,'endloop\r\n');
    fprintf(fid,'endfacet\r\n');
end

function n=normal(p1,p2,p3)
  v1=p2-p1;
  v2=p3-p1;
  v3=cross(v1,v2);
  n=v3./sumsq(v3);
end

Etiquetas/Tags: 3d, print, reprap, GNU/Octave, STL

OD-11 Carlsson-cube

Omnidirectional, bass reflex type.

2016/11/21-11:53:44

Box volume: 10 litres
Measures: B x W x D: 26 x 26 x 26 cm
Weight: 6 Kg
Principle: Omnidirectional, bass reflex type. Diagonally facing speaker-
elements for frontfacing wall or bookshelf placement or upwardsfacing floor-position
Impedance: 8 ohms
Frequency range: 45-18.000 Hz
Frequency response: 52-15.000 Hz ± 4dB
Crossover frequency: 1800 Hz
Mid-bass: 1pc 6.5 inch 8 ohms Peerless SC165.
Tweeters: 1 pc 5 cm 8 ohms Peerless MT20HFC 

Ref.: http://www.carlssonplanet.com/od11.php

Etiquetas/Tags: hifi, od-11, Carlsson, cube

RepRap Printing on Fabric

testing...

2016/10/25-12:17:49

After seeing the post RepRap Printing on Fabric, I had to try it out.

It works nicely!

Etiquetas/Tags: 3d printing, 3dp, cloth, fabric, reprap

All work and no play...

with Arduino and TVout

2016/07/23-00:01:49

So I've been playing with Arduino and the TVout library... fun, fun, fun!

#include <TVout.h>
#include <TVoutfonts/fontALL.h>
#include "TVOlogo.h"

TVout TV;

void setup(){
  TV.begin(_PAL); // for PAL system
  TV.clear_screen();
}

void loop(){
  TV.select_font(font4x6);
  
  TV.set_cursor(0,0);
  TV.print("All work");

  TV.set_cursor(0,7);
  TV.print("and no play");
  
  TV.set_cursor(0,14);
  TV.print("makes Jack a dull boy...");

  TV.bitmap(0,21,TVOlogo);
}

Refs.:

Happy hacking!

Etiquetas/Tags: Arduino, TVout

Doing a drawbot...

using servos and arduino

2016/06/30-12:53:08

First the results... it really does not work.

Lots of vibrations and errors... but a lot of fun.

Here's the GNU/Octave code to generate the .ino file.

Happy hacking!

clear all

l1=18.5;
l2=20;
d=-15;
n=200;
t=linspace(0,20*pi,n);
x=d+5*cos(t).*exp(-.05*t);
y=5*sin(t).*exp(-.05*t);
alpha(1)=   -4.5980
beta(1)=   4.3070

for i=1:n-1
  aux= newtonsys([alpha(i) beta(i)],[x(i+1) y(i+1)],1e-3,l1,l2);
  
  alpha(i+1)=aux(1);
  beta(i+1)=aux(2);
end


theta1=-alpha*180/pi-180;
theta2=beta*180/pi-180;


## Write to INO
filename="~/Arduino/examples/servo/servo.ino"

comment_str="This is a comment on the begining of the .ino file ;)";
fid=fopen(filename,'w');
fprintf(fid,'/* %s */\n',comment_str);

header_str="\n#include <Servo.h>\n\nServo Servo1;\nServo Servo2;\n\n";
preamble_str="\nvoid setup()\{\n    Servo2.attach(10);\n    Servo1.attach(9);\}\n\nvoid loop(){\n";

fprintf(fid,'%s',header_str);
fprintf(fid,'%s',preamble_str);

for i=1:n
  fprintf(fid,'%s%f%s',"Servo1.write(",theta1(i),");\n");
  fprintf(fid,'%s%f%s',"Servo2.write(",theta2(i),");\n");
  fprintf(fid,'%s',"delay(100);\n");


end
fprintf(fid,'%s',"}");
fclose(fid);

############################################################
figure(1)
clf
hold on
plot(x,y)
u=l1*cos(alpha)+l2*cos(beta);
v=l1*sin(alpha)+l2*sin(beta);
plot(u,v,'r-')

############################################################
figure(2)
clf
hold on
plot(l1*cos(theta1)+l2*cos(theta2),l1*sin(theta2)+l2*cos(theta2),'-')
plot(l2*cos(beta),l2*sin(beta),'r-')
plot(l1*cos(alpha(1)),l1*sin(alpha(1)),'o')

[t' alpha' beta' theta1' theta2']

function Fv=Ffun(x,xpos,l1,l2)
  Fv(1,1)=xpos(1)-l1*cos(x(1))-l2*cos(x(2));
  Fv(2,1)=xpos(2)-l1*sin(x(1))-l2*sin(x(2));
end
function Jv=Jfun(x,l1,l2)
  Jv(1,1)=l1*sin(x(1));
  Jv(1,2)=l2*sin(x(2));
  Jv(2,1)=-l1*cos(x(1));
  Jv(2,2)=-l2*cos(x(2));
end
function x=newtonsys(xo,xpos,tol,l1,l2)
  Niter=1000;
  x=xo';
  delta=eye(length(xo),1);

  i=0;
  while or(i<=Niter, abs(max(delta))>tol)
      Jv=Jfun(x,l1,l2);
      Fv=Ffun(x,xpos,l1,l2);
      delta=-Jv\Fv;
      x=x+delta;
      i=i+1;
  endwhile
end

Etiquetas/Tags: arduino, draw bot, Octave, ino

"Now, a tricolumn - build this efficiente column speaker" by R. N.Baldock.

... simple idea for using a CNC.

2016/06/16-14:55:56

Here is a simple idea for building a tricolumn with a F88 Fountek speaker.

And the final construction:

Etiquetas/Tags: CNC, tricolumn, speaker, audio

Prusa i3 pro B

... a wood frame version

2016/06/16-10:12:21

So instead of this fragile wood frame

this

It's a hybrid version, between a Prusa i3 Pro B and a Mendel 90. Works nicely!

P.S.

In you are wandering it as a GT2560 board:

[#define MOTHERBOARD BOARD_ULTIMAKER]

board nr. 7. 

Etiquetas/Tags: diy, 3d printer, prusa i3 pro b

Speaker enclosure resistance vent

3D printed

2016/06/15-17:02:27

This a simple hack of a resistor vent (https://www.youmagine.com/tca/).The basic idea is to build a small speaker enclosure and use a resistance vent to minimize the boomimg effect that the small box imposes on the final frequency response.

More details here: http://diyaudioprojects.com/Technical/Aperiodic/

Typically these resistors have 10cm diameter. The default STL's are for a 8cm hole, but you can tailor it using the SCAD file attached (see end of page).

Happy hacking!

Notes:

Printer Brand: RepRap

Printer: Prusa i3

Rafts: No

Supports: No

Resolution: .2mm

Infill: 20%

Here's de OpenSCAD code

// Author: Tiago Charters de Azevedo 
// Maintainer: Tiago Charters de Azevedo 

// Copyright (c) - 2016 Tiago Charters de Azevedo (tca@diale.org)

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301, USA.

$fn=64;
h=7.5;
R=40;
eps=.2;
n=4;
thickness=2;
screw=3;

module top(){
    translate([0,0,thickness/2]){
        difference(){
            difference(){
                cylinder(thickness,R+3*screw,R+3*screw,center=true);
                cylinder(2*thickness,R-eps-thickness,R-eps-thickness,center=true);}
                for(i=[0:2]){
                    rotate([0,0,i*360/3]){
                        translate([0,R+2*screw/3,0]){
                            cylinder(10,screw/2+eps,screw/2+eps,center=true);}}}}}
    
    
 translate([0,0,(h+thickness)/2]){
        difference(){
            cylinder(h+thickness,R-eps-thickness,R-eps-thickness,center=true);
            cylinder(10*h,R-eps-2*thickness,R-eps-2*thickness,center=true);}}
    
    intersection(){
        union(){
            for(i=[-n:n]){
                translate([i*R/n,0,1]){
                    cube([2,2*R,2],center=true);}}
            
            rotate([0,0,90]){
                for(i=[-n:n]){
                    translate([i*R/n,0,1]){
                        cube([2,2*R,2],center=true);}}}}
        
        cylinder(50,R-eps-thickness,R-eps-thickness,center=true);}}

////////////////////////////////////////////////////////////

module bottom(){
    rotate([0,0,0]){
        translate([0,0,0]){
            translate([0,0,h/2]){
                difference(){
                    cylinder(h+thickness,R,R,center=true);
                    cylinder(5*h,R-thickness,R-thickness,center=true);}}
            
            intersection(){
                union(){
                    for(i=[-n:n]){
                        translate([i*(R)/n,0,0]){
                            cube([2,2*(R-eps),2],center=true);}}
                    
                    rotate([0,0,90]){
                        for(i=[-n:n]){
                            translate([i*(R)/n,0,0]){
                                cube([2,2*(R-eps),2],center=true);}}}}
                cylinder(50,R-eps,R-eps,center=true);}}}}



//!top();
//!bottom();

!alltosee();

module alltosee(){
    top();
    rotate([0,180,0]){
        translate([0,0,-4*h,]){
            bottom();
        }}}

Added some handles and feet;)

Etiquetas/Tags: audio, speaker enclosure, vent, variovent

3D printer

... from far east

2016/05/26-22:36:06

I recently bought a kit from China of a Prusa i3 Pro B

The software did not have a interactive way for leveling the bed... so here's the gcode for it! ;) Just levels the bed and starts heating... getting ready for printing.

;G0 rapid linear move
;G1 linear move

M104 S0                     ;extruder heater off
M140 S0  

G21        ;metric values
G90        ;absolute positioning
M82        ;set extruder to absolute mode
M107       ;start with the fan off
G28 X0 Y0  ;move X/Y to min endstops
G28 Z0     ;move Z to min endstops


;Put printing message on LCD screen
M117 Leveling bed...
M0

G1 X0 Y0 Z1
G1 X20 Y20 Z1
G1 X20 Y20 Z0
M117 Press button when finish...
M0
G1 X20 Y20 Z1

G1 X20 Y180 Z1
G1 X20 Y180 Z0
M117 Press button when finish...
M0
G1 X20 Y180 Z1


G1 X180 Y180 Z1
G1 X180 Y180 Z0
M117 Press button when finish...
M0
G1 X180 Y180 Z1

G1 X180 Y20 Z1
G1 X180 Y20 Z0
M117 Press button when finish...
M0
G1 X180 Y20 Z1

G1 X90 Y90 Z1
G1 X90 Y90 Z0
M117 Done!
M0

G1 X90 Y90 Z1

G28 X0 Y0  ;move X/Y to min endstops
G28 Z0     ;move Z to min endstops


M84                         ;steppers off
G90                         ;absolute positioning

M117 Prepare for printing...
M190 S70  ;set bed temperature                         
M109 S215 ;set nozzle temperature                         

Happy hacking!

P.S.

One more

; Simple gcode start up script for my far east printer (prusa i3 pro b)
M104 S0    ;extruder heater off
M140 S0  

G21        ;metric values
G90        ;absolute positioning
M82        ;set extruder to absolute mode
M107       ;start with the fan off
G28 X0 Y0 Z0  ;move X/Y/Z to min endstops
G1 X0 Y0 Z10  ;move 10mm up

M109 S215 ;Wait for nozzle temperature to reach target temp
G1 X0 Y0 Z50 ;move 40mm up
G1 X0 Y0 Z20 E30 ;extrudes 30mm of filament

M190 S70  ;Wait for bed temperature to reach target temp

M117 Ready for printing.

Etiquetas/Tags: 3d, printer, china, pla, abs, gcode

Ping-Pong Anemometer

3D printed...

2016/05/10-09:16:16

Sphere anemometers are simple devices that use the wind drag force on a sphere to determine the wind speed by equating the weight of the sphere with the drag force in a pendulum like configuration.

The drag force is the force that a sphere feels when traveling with a certain speed latex2png equation in a viscous fluid (relatively to the fluid, in our case air). This forces depends on the relative velocity between the air and the sphere, on the density of the air latex2png equation, effective area in contact with the fluidlatex2png equation and an adimensional coefficient latex2png equation called the drag coefficient. In this case this force amounts to

latex2png equation

Note that the drag coefficient latex2png equation is a geometric factor and is usually determined experimentally. For a sphere, for high enough Reynolds numbers, the drag coefficient is around 0.5.

Apparently this kind of anemometer was invented in 1900 by G. Daloz. Modern versions includes a ping-pong ball.

Equating the weight of the sphere

latex2png equation

with the drag force in a pendulum like configuration for a given equilibrium position one gets

latex2png equation

and for the velocity:

latex2png equation Where D=2 R is the diameter of the ping-pong ball.

Given that a ping-pong ball has mass of 2.7g and a typical diameter of 40mm one gets for the density rhoball=2.7/(4*pi/3*2^3)~0.081 g/cm^3

and thus

latex2png equation

Here's the OpenSCAD file:

// Author: Tiago Charters de Azevedo
// Maintainer: Tiago Charters de Azevedo 

// Copyright (c) - 2016 Tiago Charters de Azevedo (tca@diale.org)

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301, USA.


// Gravity aceleration
g=9.8; //(m/s^2)
rhoair=0.001225; // (g/cm^3)
// pi
pi=3.1415926;

/*Drag coeficiente
.5 sphere
see: https://en.wikipedia.org/wiki/Drag_coefficient
*/
Cd=.47;

// Ping-Pong
D=.04; // (m)
mball=2.7; // (g)
A=pi*pow(D/2,2);
rhoball=mball/(4*pi/3*pow(100*D/2,3));// 0.081; // (g/cm^3)

// Font size
fsize=4;

R=100;
h=2;

coef=1;//3.6*0.621371;
module slice(h=2){
    difference(){
        cylinder(h,R,R,center=true,$fn=64);
        translate([0,2.5*R/2,0]){
            cube([2.5*R,2.5*R,2*h],center=true);}
        translate([2.5*R/2,0,0]){
            cube([2.5*R,2.5*R,2*h],center=true);}}}

module vscale(){
    for(alpha=[0:5:89]){
        v=coef*sqrt(pi*g*rhoball*pow(D,3)*tan(alpha)/(3*A*Cd*rhoair));
        rotate([0,0,alpha]){
            translate([-R*.99,0,-0]){
                rotate([0,0,-0]){
                    linear_extrude(height=h,scale=1,twist=0,convexity= 0){          
                        text(str(floor(v*10)/10),size=fsize,font="Arial Black:style=Bold",center=true);}}}
            
            translate([-R*.8,-1*0,h/2]){
                sphere(h/2,center=true,$fn=64);}}}
    
    translate([-R*.7,-1*0,h/2]){
        sphere(h/2,center=true,$fn=64);}
    
    
    translate([0,-R+2,0]){
        rotate([0,0,90]){
            linear_extrude(height=h,scale=1,twist=0,convexity= 0){          
                text("m/s",size=fsize,font="Arial Black:style=Bold",center=true);}}}}

//difference()
{
    intersection(){
        union(){
            difference(){
                slice();
                cylinder(10,R*.7,R*.7,center=true,$fn=64);}
            translate([0,-R/2,0]){
                cube([6*h,R,h],center=true);}
            translate([-R/2,0,0]){
                cube([R,6*h,h],center=true);}}
        cylinder(10*h,R,R,center=true,$fn=64);}
    vscale();}


cylinder(h,3*h,3*h,center=true,$fn=64);

difference(){
    union(){
        cylinder(3*h,h,h,center=false,$fn=64);
        translate([0,0,3*h]){
    sphere(h,center=true,$fn=64);}}
    translate([0,0,2.5*h]){
        rotate([0,90,0]){
            cylinder(3*h,1,1,center=true,$fn=64);}}}

Etiquetas/Tags: anemometer, ping-pong, 3d printer

Palavras chave/keywords: página pessoal, blog

Criado/Created: NaN

Última actualização/Last updated: 27-11-2016 [13:47]


GNU/Emacs

1999-2016 (ç) Tiago Charters de Azevedo

São permitidas cópias textuais parciais/integrais em qualquer meio com/sem alterações desde que se mantenha este aviso.

Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.