diale.org

Celebrate the Riemann Hypothesis proof
... and print the graph of the Gamma function

2018/09/24-16:06:43

Get it here: https://www.youmagine.com/designs/complex-gamma-function

Etiquetas/Tags: 3d, 3dprint, reprap, math, Riemann


Two motors, two currents, two frequencies
... simple experiment

2018/09/18-13:50:06

Etiquetas/Tags: dc motor, dc, motor, electronics


Playing with LEGO and servos
Playing with OpenSCAD, LEGOS and a servo

2018/09/13-11:40:50

I've been playing with an idea, to design a simple LEGO part to attach a standard servo. Here's the pic.

I'm using a https://github.com/cfinke/LEGO.scad[LEGO.scad]] (underfull library) and MCAD for the servo model.

Look great!

Here's the OpenSCAD code:


//11:35:10 - 13/09/2018
// Author: Tiago Charters de Azevedo 
// Maintainer: Tiago Charters de Azevedo 

// Copyright (c) - 2018 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.

include <../utils/polyholes.scad>;
use <lego.scad>;
use <servo.scad>;

//https://github.com/cfinke/LEGO.scad
//https://github.com/openscad/MCAD

module showservo(){
    translate([44.1/2-.5,-20.3,10+2*1.6]){
        rotate([0,-90,0]){
            color("grey")futabas3003();}}}
difference(){
    union(){
        rotate([0,0,90]){
            block(width=7,length=1,height=1,stud_type="baseplate");}
        servopin();}
    place(0,0,2.5){
        rotate([0,90,0]){
            cube([21,42, 36.1], true);}}}


module servopin(){
    difference(){
        place(-3, 0,1) {block(width=1,length=1,height=3,stud_type="hollow");}
        
        place(-3, 0,2) 
        rotate([0,90,0]){
            poly_cylinder(h=50,r=1.5,center=true);}
        
        translate([0,0,10]){
            place(-3, 0,2) {
                rotate([0,90,0]){
                    poly_cylinder(h=50,r=1.5,center=true);}}}}

        difference(){
        place(3, 0,1) {block(width=1,length=1,height=3,stud_type="hollow");}
        
        place(3, 0,2) 
        rotate([0,90,0]){
            poly_cylinder(h=50,r=1.5,center=true);}
        
        translate([0,0,10]){
            place(3, 0,2) {
                rotate([0,90,0]){
                    poly_cylinder(h=50,r=1.5,center=true);}}}}}

Looks great doesn't it?

Happy hacking!

Etiquetas/Tags: diy, openscad, servo, arduino, lego


Booster com uma válvula 6J6
a 5.3V

2018/08/21-11:01:36

Na discussão sobre qual a melhor distorção, a distorção de transístores ou a de válvulas, é usual encontrarmos argumentos para todos os gostos. Do ponto de vista do DIY o principal impedimento na construção de projectos com válvulas está na utilização de voltagens perigosas e letais. As válvulas em geral necessitam de tensões elevadas para funcionarem e por isso a construção está vedada a construtores mais experientes. Para além disso as válvulas são caras, ineficientes e têm um tempo de vida limitado, ao contrário dos seus descendentes de silício, resistentes, eficientes e duradouros. Os pré-amplificadores e amplificadores de guitarra a válvulas são caros, mais caros que os correspondentes primos solid-state, e por isso o engenho da comunidade DIY mundial arranjou maneira de se construir um booster com uma válvula que funciona a tensões baixas e não letais.

É disso exemplo o projecto intitulado de valvecaster: usa uma válvula 12AU7 (dois triodos) especificamente projectada para áudio. Nesse projecto usa-se uma tensão de 9V para alimentar a 12AU7.

Este texto descreve a construção de um pré-amplificador semelhante mas usando um válvula 6J6 que também contém dois triodos, à semelhança da 12AU7, mas a 6J6 tem dois triodos com os cátodos comuns (numa configuração twin). A 6J6 não é em geral usada em amplificadores de áudio numa configuração de cátodo comum, é mais frequente encontra-la num divisor de fase (amplificador diferencial) para o estágio de amplificação em push-pull.

Um triodo típico tem os seguintes terminais.

As válvulas têm um contentor de vidro (fragilidade) e necessitam de ser aquecidas (ineficiência) para atingirem o seu ponto de funcionamento, os electrões precisam de ser aquecidos para viajarem.

A 6J6 é uma válvula barata e por 3eurs temos toda a distorção de uma válvula num pacote de 7 pinos. Vamos usar um transformador de telemóvel que nos fornece 5.3V para alimentar a o heater da válvula e alimentar o circuito. O heater necessita de pelo menos 6.3V (vamos usar menos) e de uma corrente de 0.45A disponível num qualquer carregador de telemóvel. A datasheet para a 6J6 é esta: http://www.r-type.org/pdfs/6j6-1.pdf

Material

Material opcional – BMP tone control

(ver justificação mais à frente no texto: http://www.muzique.com/lab/tone3.htm)

Circuito

O circuito é este:

1º triodo: plate (pino 1), gate (pino 6), 2º triode: plate (pino 2), gate (pino 5). O cátodo comum é o pino 7 e o heater (filamento) correspondem aos pinos 3 e 4.

Montagem

A peça fundamental para este circuito é esta válvula.

Tinha uma caixa Hammond já furada sem utilização na qual tinha desenhado um motivo de trepadeiras com um berbequim manual.

Não esquecer o suporte de 7 pinos para a 6J6, este foi usado para a montagem na breadboard.

O transformador foi reaproveitado dos muitos que por aqui em casa vão sobrando, não se gasta dinheiro numa coisa destas!.

Mas primeiro os testes. O estudo do circuito foi realizado numa pequena breadboard, a desorganização dos fios é reveladora!

A figura seguinte mostra a tensão à saída para diferentes valores de amplitude do sinal de entrada e mostra bem o tipo de curvas do sinal de saída que nos dão a “boa” distorção. Desta vez não coloquei as diferentes componentes harmónicas para cada caso. É fácil descobrir as dominantes em cada caso.

Optei por montar tudo no suporte da válvula, não é das montagens mais bonitas mas funciona. O esquema das ligações é este.

Depois de testado com o amplificador achei que um tone control seria uma coisa interessante de adicionar ao circuito, e já tinha os furos feitos para adicionar mais controlos.

A escola recaiu sobre o tone control do Big Muff PI (http://www.muzique.com/lab/tone3.htm) cuja montagem foi efectuada nos pinos do potenciómetro de 100k linear. O potenciómetro log de volume corresponde ao rectângulo verde e o tone control ao cilindro prateado junto ao condensador verde de 4000pF e a um outro, velhíssimo que para aqui tinha, de 0.01uF.

Inicialmente tinha uma resistência de 10k na plate do segundo triodo mas a adição do tone control atenua muito o sinal de saída, por isso se se pretender incluir o controlo de tonalidade talvez seja mais razoável substituir essa resistência de carga por outra de 22k ou mesmo de 100k.

Melhor ainda será usar duas 6J6 com o tone control entre os dois estágios, futuro projecto. Alguém do Forumusica avança com a ideia?

Notas finais e modificações ao circuito

Do ponto de vista sónico e com o objectivo de construir um booster com um som de válvula o tone control é perfeitamente dispensável, mas como tudo isto é DIY podemos testar as várias hipóteses com um acender do ferro de soldar. Mas confesso que a versão que mais gosto é a simples, sem tone control e com 10k na plate do segundo triodo.

O condensador C2 controla o cut-off nas frequências mais baixas (à volta de 7Hz) diminuindo o seu valor de é possível retirar mais alguns baixos, para 80Hz C2 deve ter o valor de 2uF (C2=1/(2*3.14*1000*80)).

É fácil sentir o encanto de ver uma válvula a funcionar.

O booster funciona muitíssimo bem para espevitar qualquer amplificador solid-state com pouco carácter.

Etiquetas/Tags: 6j6, guitarra, diy, booster


Bluetooth + Arduino
... code

2018/08/16-16:29:58

// Hardware
// BT module   Arduino
// GND ------- GND
// VCC ------- 5V
// TX-O ------ pin0honda eCUB 2
// RX-I ------ pin1

// Servo       Arduino
// GND ------- GND
// VCC ------- VCC
// signal ---- pin4

// TX arduino -> RX BT module
// RX arduino -> TX BT module

#define bluetooth Serial
#include <Servo.h>
Servo aServo;

void setup(){
  delay(1000); 
  Serial.begin(9600);
  aServo.attach(4);}


void loop(){
  int data = 0;

   if(Serial.available() > 0){
     data = Serial.read();        
     Serial.print(data);          
     Serial.print("\n");        
     if(data == '1')              
        aServo.writeMicroseconds(544);
      else if(data == '0')         
        aServo.writeMicroseconds(2400);}}

Etiquetas/Tags: arduino, bluetooth, code, example


Filtro Kalman 1D
... implementação simples de um filtro de Kalman usando Arduino (ou outra coisa qualquer)

2018/07/13-09:40:09

A ideia deste texto é explicar de uma forma simples a implementação de um filtro de Kalman num Arduino e construir um sensor de intensidade luminosa usando um LDR. O hardware necessário é o seguinte:

Hardware e código inicial

É fácil de encontrar um código exemplo para se ligar um LDR ao Arduino. Fica aqui uma versão simples ;)

int sensorPin = A0; 
int sensorValue = 0;

void setup(){ 
  Serial.begin(9600); 
} 

void loop(){ 
  sensorValue = analogRead(sensorPin); 
  Serial.println(sensorValue); 
} 

O gráfico seguinte mostra a variação da luminosidade quando tapo e destapo o LDR com a mão. Vê-se claramente as oscilações de 50Hz da rede eléctrica na luz do candeeiro.

Filtro de Kalman 1D

Quero então estimar o valor da luminosidade da sala onde me encontro. Para isso admito que a intensidade luminosa é constante (ou antes que necessita de ser "quase" constante de modo a que seja possível fazer uma medição) e que o valor medido y possa ser decomposto na soma de um valor médio m mais um termo de flutuação gaussiano v com variância r (valor inicial). Assim

y:=m+v

Admito também que para cada valor da luminosidade se tem a estimativa x dada por

x:=m+w

com o mesmo valor médio e flutuações gaussianas mas com variância q (valor inicial). Note-se que w e v são variáveis aleatórias gaussianas com média zero e independentes.

O filtro de Kalman admite que as sucessivas aproximações (modelo) são obtidas linearmente das anteriores, i.e. xf:=a xi . Como estou a admitir que os sucessivos valores da luminosidade são constantes ponho a:=1

x:=x

e

p:=p+q

onde p é variância da aproximação seguinte (são todas variáveis gaussianas independentes, a variância da soma é a soma das variâncias).

Ficam assim estabelecidas as regras de evolução da primeira parte do algoritmo de Kalman. Vamos à segunda parte. Esta segunda parte corresponde a estimar/prever a aproximação seguinte que é escrita em termos da aproximação anterior e o erro de previsão, i.e.,

x:=x+k(y-x)

onde k é um parâmetro a determinar, usualmente chamado de ganho do filtro, e y-x o erro de previsão. Como determinar então o valor de k? O valor de k é determinado de forma a minimizar a variância da nova estimativa x+k(y-x).

Calculando a variância desta última quantidade obtém-se

p:=(1-k)^2*p+k^2*r

É condição necessária para que se tenha um extremo relativo da variância que a derivada de p em ordem a k seja zero. Isto dá:

k:=p/(p+r)

e

p:=p*r/(p+r)

Curiosamente, ou talvez não, esta última fórmula corresponde formalmente ao valor do paralelo de duas resistências com valores p e r.

Fico assim com as duas últimas fórmulas que precisava:

k:=p/(p+r)
x:=x+k(y-x)
p:=(1-k)*p

O gráfico seguinte mostra o que acontece quando tapo e destapo o LDR (linha azul) numa escala de 0-1023. As linhas a verde e vermelho correspondem à implementação de filtros de Kalman com parâmetros diferentes.

Happy hacking!


/* Simply implementation of a 1D Kalman filter */
/* for Arduino using a LDR. */

/* Some other examples can be done with this file, */
/* e.g. sonar, temperature measurements, sky is the limit. */
/* Happy hacking! */
  
/* Author: Tiago Charters de Azevedo  */
/* Maintainer: Tiago Charters de Azevedo  */
/* URL: http://diale.org/ */
/* Version: 0 */

/* Copyright (c) - 2018 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. */

/* Commentary: */

int sensorPin = A0; 
int sensorValue = 0;

// 1st filter parameters
float q=0.125;
float r=32;
float p=1023;
float x=0;
float k=0;

// 2nd filter parameters
float q1=4;
float r1=100;
float p1=1023;
float x1=0;
float k1=0;

void setup(){ 
  Serial.begin(9600); 
} 

void loop(){ 
  sensorValue = analogRead(sensorPin); // read sensor value

  // 1st Kalman filter
  p=p+q; 
  k=p/(p+r);
  x=x+k*(float(sensorValue)-x);
  p=(1-k)*p;

  // 2nd Kalman filter
  p1=p1+q1; 
  k1=p1/(p1+r1);
  x1=x1+k1*(float(sensorValue)-x1);
  p1=(1-k1)*p1;

  
  //Print values
  Serial.print(sensorValue); // raw value
  Serial.print(", ");
  Serial.print(int(x)); // 1st filter output
  Serial.print(", ");
  Serial.print(int(x1)); // 2nd filter output
  Serial.println("");
} 

1.R. Kalmam, A New Approach to Linear Filtering and Prediction Problems, Transactions of the ASME–Journal of Basic Engineering, 82 (Series D): 35-45. 1960

Etiquetas/Tags: kalman, arduino, filtro


Ping-Pong Anemometer
3D printed...

2018/06/28-18:48:17

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


Stereographic projection
A simple hack using OpenSCAD.

2018/06/27-16:50:06

Stereographic projection similar do this one by Henry Segerman.

Notes

References

OpenSCAD code

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

// Copyright (c) - 2017 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=2*32;
phi=(1+sqrt(5))/2;
h=2;
R=40;
n=6;
delta=.2;

echo(R*(n-1));

module drawing(){
    for(i=[-(n-1)/2:(n-1)/2]){
        for(j=[-(n-1)/2:(n-1)/2]){
            translate([(1+delta)*i*R,(1+delta)*j*R,0]){
                square(.9*[R,R], center=true);
                //              circle(R/2,center=true);
            }}}

    difference(){
        square(1000*R*[1,1],center=true);
        square(((1+delta)*n*R+delta*R)*[1,1],center=true);}}

module drawingshadow(){
    for(i=[-(n-1)/2:(n-1)/2]){
        for(j=[-(n-1)/2:(n-1)/2]){
            translate([(1+delta)*i*R,(1+delta)*j*R,0]){
                square(.9*[R,R], center=true);
                //      circle(.9*R/2,center=true);

            }}}}

module drawingescher(){
    for(i=[-(n-1)/2:(n-1)/2]){
        for(j=[-(n-1)/2:(n-1)/2]){
            translate([6*i*6.8,j*R,0]){
                rotate([0,0,180]){
                    escher();}
                translate([3.*6.8,2.9*8.05,0]){escher();}
            }}}
        difference(){
        square(1000*R*[1,1],center=true);
        square(((1+delta)*n*R+delta*R)*[1,1],center=true);}}

module projection(l){
    linear_extrude(height=l, scale=10e-6, center=false){
        children();}}

module ball(r,h){
    difference(){
        union(){
            sphere(r=r, center=true);
            translate([0,0,-r/2]){
                cylinder(h=r,r=r*sqrt(2)/2,center=true);}}
        sphere(r=r-h, center=true);}}


module stproj(){
    render(){
        difference(){
            translate([0,0,R]){
                ball(R,h);}

            projection(2*R){
                drawing();}
            
            translate([0,0,2*R]){
                cylinder(h=R,r=R/2,center=true);
//              sphere(R/2,center=true);
            }
        }}}

module seeall(){
    stproj();
    color("red")
    translate([0,0,2*R]){
        sphere(R/32,center=true);}

    %projection(2*R){
        drawingshadow();}}

module squaregrid(l,m){
    difference(){
        square([l,l],center=true);
        for(i=[-(m-1)/2:(m-1)/2]){
            for(j=[-(m-1)/2:(m-1)/2]){
                translate([i*l/m,j*l/m,0])
                square([.5*l/m,.5*l/m],center=true);
            }}}
}




module grid(){
    color("black")
    render(){
        difference(){
            linear_extrude(height=.1, scale=1, center=true){
                square(((1+delta)*n*R+0*delta*R)*[1,1],center=true);}
            linear_extrude(height=10, scale=1, center=true){
                for(i=[-(n-1)/2:(n-1)/2]){
                    for(j=[-(n-1)/2:(n-1)/2]){
                        translate([(1+delta)*i*R,(1+delta)*j*R,0]){
                            square([R,R], center=true);}}}}}}}







module escher(s=.01){    
    polygon(s*
        [[-1022.58620689655,    -1206.46551724138],
            [-527.586206896552, -1701.46551724138],
            [192.413793103448 , -1386.46551724138],
            [462.413793103448 , -1116.46551724138],
            [597.413793103448 , -936.46551724138 ],
            [687.413793103448 , -756.46551724138 ],
            [732.413793103448 , -621.46551724138 ],
            [867.413793103448 , -756.46551724138 ],
            [957.413793103448 , -891.46551724138 ],
            [1002.41379310345 , -1071.46551724138],
            [1047.41379310345 , -1161.46551724138],
            [1317.41379310345 , -1116.46551724138],
            [1452.41379310345 , -1026.46551724138],
            [1632.41379310345 , -846.46551724138 ],
            [1452.41379310345 , -801.465517241379],
            [1227.41379310345 , -711.46551724138 ],
            [1092.41379310345 , -576.46551724138 ],
            [957.413793103448 , -441.46551724138 ],
            [867.413793103448 , -261.46551724138 ],
            [642.413793103448 , 143.53448275862  ],
            [552.413793103448 , 368.53448275862  ],
            [1047.41379310345 , 908.534482758621 ],
            [507.413793103448 , 1448.53448275862 ],
            [687.413793103448 , 1718.53448275862 ],
            [507.413793103448 , 1673.53448275862 ],
            [282.413793103448 , 1583.53448275862 ],
            [147.413793103448 , 1583.53448275862 ],
            [192.413793103448 , 1358.53448275862 ],
            [282.413793103448 , 1223.53448275862 ],
            [417.413793103448 , 1088.53448275862 ],
            [732.413793103448 , 908.534482758621 ],
            [282.413793103448 , 773.53448275862  ],
            [-392.586206896552, 1583.53448275862 ],
            [-392.586206896552, 728.53448275862  ],
            [-752.586206896552, 638.534482758621 ],
            [-977.586206896552, 548.53448275862  ],
            [-977.586206896552, 773.53448275862  ],
            [-1022.58620689655, 908.534482758621 ],
            [-1157.58620689655, 863.53448275862  ],
            [-1292.58620689655, 818.53448275862  ],
            [-1427.58620689655, 863.53448275862  ],
            [-1337.58620689655, 728.53448275862  ],
            [-1247.58620689655, 548.53448275862  ],
            [-1247.58620689655, 413.534482758621 ],
            [-1247.58620689655, 278.53448275862  ],
            [-347.586206896552, 278.53448275862  ],
            [-1157.58620689655, -396.46551724138 ],
            [-1067.58620689655, -846.46551724138 ],
            [-887.586206896552, -576.46551724138 ],
            [-752.586206896552, -396.46551724138 ],
            [-572.586206896552, -306.46551724138 ],
            [-392.586206896552, -261.46551724138 ],
            [-347.586206896552, -486.46551724138 ],
            [-257.586206896552, -666.46551724138 ],
            [-212.586206896552, -756.46551724138 ],
            [-257.586206896552, -801.465517241379],
            [-527.586206896552, -666.46551724138 ],
            [-1022.58620689655, -1206.46551724138]]);}


//%square(.9*[R,R], center=true);


// henryseg
// https://www.thingiverse.com/thing:202774/
//color("green")

// translate([0,0,R+1.8]){
//     sphere(R+1.1,center=true);}
//1.8
//translate([0,0,R]){    import("stereographic_projection_wider_base.stl");}

Etiquetas/Tags: Stereographic projection, 3dprint, reprap


FastDome
FastDome is a set of 3D printed vertices to build an open source geodesic 2V dome using PVC tubes.

2018/06/26-14:48:43

I've used 16cm (outer diameter) PVC tubes. The 3D modeling was done using OpenScad and is under a GPLv3 license. Use the SCAD file to fit the vertices to any diameter tube.

Indoor geodesic dome (70cm radius)

For a 70cm radius we'll need 35cm tubes (30) and 45cm tubes (35). I'll put some math here in a couple of days (check the references below).

3D Printing

For a 2V geodesic dome we will need to print a total of 26 vertices

Number Vertex type
10 4
6 5
10 6

Printer settings

res. = 0.32mm

infill = 20%

References

Geodesic Dome Notes and Calculator

OpenSCAD code

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

// Copyright (c) - 2017 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.

// V2 dome vertices
// strut angle z axis
// https://simplydifferently.org/Geodesic_Dome_Notes?page=3#1V/L1%202/3%20Icosahedron%20Dome

// alpha1=15.86 (5 legs x6)
// alpha2=18.00 (6 legs x10)
// alpha2=18.00 (4 legs x10)

// Notes
//  Indoor r=70cm (door dimensions <=70cm)
// la=38.3cm
// lb=43.4cm
// A x 30: 0.54653 (15.86°)
// B x 35: 0.61803 (18.00°) 

// ------------------------------------------------------------
// GNU GPL v2
// nop.head@gmail.com
// hydraraptor.blogspot.com
// See http://hydraraptor.blogspot.com/2011/02/polyholes.html
// ------------------------------------------------------------
function sides(r)=max(round(4*r),3);
function corrected_radius(r,n=0)=0.1+r/cos(180/(n ? n : sides(r)));
function corrected_diameter(d)=0.2+d/cos(180/sides(d/2));

module poly_circle(r,center=false){
    n=sides(r);
    circle(r=corrected_radius(r,n),$fn=n,center=center);}

module poly_cylinder(h,r,center=false){
    n=sides(r);
    cylinder(h=h,r=corrected_radius(r,n),$fn=n,center=center);}
// ------------------------------------------------------------

$fn=2*16;
phi=(1+sqrt(5))/2;
ri=13/2+.2; //PLA
ro=16/2+.1;
h=2*1.2;


module hub(n=5,m=5,ri=13.2/2,alpha=15.86,h=h){
    rm=1.5*ri;
    height=ri*sin(alpha);
    R=ri*cos(alpha);
    v=[0,R+rm,0]-[0,rm,height];
    difference(){
        union(){
            for(i=[0:m-1]){
                rotate([0,0,i*360/n]){
                    hull(){
                        translate([0,rm,height]){
                            sphere(ri,center=true);}
                        translate(v+[0,R+rm,0]){
                            sphere(ri,center=true);}}}}    
            // Center
            hull(){
                for(i=[0:n]){
                    rotate([0,0,i*360/n]){
                        translate([0,rm,height]){
                            sphere(ri,center=true);}}}}}
        
        for(i=[0:m-1]){
            rotate([0,0,i*360/n]){
                hull(){
                    translate([0,rm,height]){
                        sphere(ri-h,center=true);}
                    v=[0,R+rm,0]-[0,rm,height];
                    translate(2*v+[0,R+rm,0]){
                        sphere(ri-h,center=true);}}}}
        // Center hole
        poly_cylinder(h=10*ri,r=ro,center=true);
        
        
        // Allow a nail to ground
        if(m==n-2){
            translate([1.5*ri,0,height])
            rotate([0,90,0]){
                poly_cylinder(h=3*ri,r=2.5+.15,center=true);}}
    }}
    
    

//Uncomment this 
//hub(5,5,ri,15.86);
hub(6,6,ri,18.00);
//hub(6,4,ri,18.00);

Have fun!

Etiquetas/Tags: reprap, 3dprint, dome, geodesic


3D printed bike flashlight mount
Made for CycleHack 2017 - Lisbon

2018/06/26-12:55:48

This is a hack that enables the use of any regular flashlight as a bike light. Made for CycleHack 2017 - Lisbon (https://cyclehacklisboa.tumblr.com/).

Barrier This Solves: Reuse regular flashlight's to improve bike safety.

Step 1: measure the flashlight's diameter and your bike handlebar

Step 2: edit the OpenScad file and generate the STL file

Step 3: call a friend with a 3d printer or go to the nearest Makerspace/Fablab

Step 4: with 4 zip ties firmly secure it to your bike!

Step 5: Ride you bike safely.

This is similar to https://www.thingiverse.com/thing:250899

I've clean the OpenScad code and now it supports various zip ties and dimensions. Use the OpenScad file for your hack.

Happy CycleHacking!

Materials and methods

infill: 20%

res.: 0.2mm

OpenSCAD code

// Author: Tiago Charters de Azevedo 
// Maintainer: Tiago Charters de Azevedo 
// URL: http://diale.org/
// Version: *

// Copyright (c) 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.

// Commentary:

$fn=64;
phi=(1+sqrt(5))/2;
dflasglight=24;
dbar=22.34;


zip=6; //Width of your zip tie.
height=max(25,dbar,dflasglight);


module holder(){
    difference(){ 
        cube([dbar+zip, dflasglight+zip, height],center=true);
        translate([0,0,height/phi]) rotate([0,90,0]){
            cylinder(r=dflasglight/2, h=1.1*(dbar+zip), center=true);}
        translate([0,0,-height/phi]) rotate([90,90,0]){
            cylinder(r=dbar/2, h=1.1*(dflasglight+zip), center=true);}}}

module ziptietop(){
    translate([0,0,height/phi]){
        rotate([0,90,0]){
            difference(){
                cylinder(r=dflasglight/2+zip, h=zip, center=true);
                cylinder(r=dflasglight/2+zip/2, h=dbar+20, center=true);}}}}

module ziptiebottom(){
    translate([0,0,-height/phi]){
        rotate([90,90,0]){
            difference(){
                cylinder(r=dbar/2+zip, h=zip, center=true);
                cylinder(r=dbar/2+zip/2, h=1.1*(dbar+zip), center=true);}}}}

translate([0,0,(dbar+zip)/2]){
    rotate([0,0,0])
    difference(){
        holder();
        translate([(dbar+zip/2)/4,0,0]){
            ziptietop();}
        translate([-(dbar+zip/2)/4,0,0]){
            ziptietop();}
        translate([0,(dflasglight+zip/2)/4,0]){
            ziptiebottom();}
        translate([0,-(dflasglight+zip/2)/4,0]){
            ziptiebottom();}}}

Pics

Etiquetas/Tags: cyclehack, 3dprint, reprap


Palavras chave/keywords: página pessoal, blog

Criado/Created: NaN

Última actualização/Last updated: 24-09-2018 [16:06]


Voltar à página inicial.


GNU/Emacs Creative Commons License

(c) Tiago Charters de Azevedo