ImprUV, reinventando las impresoras 3D DLP

ImprUV, reinventando las impresoras 3D DLP

¿Qué es la impresión estereolitográfica?

La estereolitografía apareció por primera vez en 1986, cuando Chuck Hull patentó éste método para realizar objetos sólidos mediante la impresión sucesiva de finas capas de un material fotosensible que es curado (solidificado) mediante su exposición a una luz ultravioleta.

Una luz ultravioleta incide sobre una pantalla despolarizada en la que aparece el objeto a imprimir en blanco y negro. La luz, pasará por la parte blanca, mientras que la parte negra impedirá su paso. La luz que consiga pasar, actuará sobre la resina fotosensible dispuesta sobre un recipiente, curándola. La primera capa curada, queda adherida a una base que sirve también de plataforma móvil. A continuación ésta plataforma asciende una distancia hasta que la capa se despega del fondo del recipiente. Al subir y despegarse, la resina vuelve a cubrir el fondo y la plataforma vuelve a bajar la misma distancia ascendida menos la altura de  capa. De esta forma se va creando, capa a capa una pieza tridimensional. Una vez que la pieza tridimensional se ha completado, la plataforma asciende de nuevo para proceder a su retirada.

Existen otros métodos de impresión por adición de capas pero éste logra obtener una mayor calidad de definición en el objeto, además de reducir considerablemente el tiempo a la hora de imprimir varias piezas a la vez, ya que el tiempo es el mismo al imprimir un objeto que al imprimir varios, factor diferenciador con los demás tipos de impresión.

La finalidad del proyecto es sustituir el proyector por un foco de luz UV y fabricar unos sensores para la medición de luz UV y lumens.
.

.

Este sensor detecta 280-390 nm luz. Este rango está categorizado como parte del espectro UVB (rayos que queman) y la mayoría del espectro UVA (rayos que broncean).

Se ha empezado por la creación de los sensores utilizando como tal, los integrados siguientes:

TSL2561

El circuito integrado TSL2561 es un sensor de luz sofisticado que tiene una respuesta plana en la mayor parte del espectro visible. El TSL2561 es capaz de la comunicación I2C directa y es capaz de llevar a cabo rangos de luz específicas de 0,1 – 40k + Lux fácilmente. Además, el TSL12561 contiene dos integrando de analógico a digital, convertidores (ADC) que integran las corrientes a partir de dos fotodiodos, simultáneamente, ect.
.

.

 SENSOR UV

Para este proyecto se necesitaba un valor concreto de luz UV para curar la resina. Después de empezar a investigar con los LED y lámparas nos dimos cuenta que era necesario hacer un sensor de luz UV, ya que sin esto no sabríamos si estábamos consiguiendo el valor requerido.
Investigamos en internet y la manera más fácil de hacer este sensor fue usando arduino y el ML5811.
A continuación se dará una explicación concreta sobre el sensor que hemos mencionado.

ML5811

El ML8511 es un sensor fácil de usar de luz ultravioleta. El sensor MP8511 UV (ultravioleta) funciona dando como salida una señal analógica en relación a la cantidad de luz UV que es detectada.

.

.

Para ello se ha hecho una PCB. Antes de iniciarse con la PCB se ha diseñado el circuido mediante los programas ARES ISIS y CircuitCAM.

.

.

.

.

Una vez comprobado el correcto funcionamiento de los sensores mediantes estos programas, se ha seguido con la fabricación de la PCB, el montaje de los componentes y se ha terminado por organizarlo bien en una caja para el buen mantenimiento de los sensores.

.

.

.

.

La caja del foco consta de estos planos que están creados por impresoras 3D.

.

.

.

 

Se ha continuado haciendo el foco de Luz UV y en el cual hemos seguido los mismos pasos que para el sensor, es decir, se ha empezado por los programas ISIS ARES y CircuitCAM.

.

.

.

.

Una vez hecha la comprobación del correcto funcionamiento se prosiguió al montaje. Se utilizaron resistencias para que no se fundiesen los led, se utilizó foylon para la dispersión de la luz UV y una lente fresnel para que los led no se focalizasen en unos puntos sino que la luz se dispersase.

.

.                      

1- Son los led UV que curan la resina.

2- Son resistencias que se utilizan para que los led no se fundan.

3- Interruptor ON/OFF que se utiliza como para apagar y encender el foco.

4- Lente fresnel que es para dispersar la luz UV y no quede focalizada en tan solo un punto.

5- Foylon que se utiliza también para que la luz UV de disperse y vaya en todas las direcciones gracias a la especie de rugosidad que tiene que hace que se disperse un 98%.

6- Cable que va a corriente.

Para este proyecto como se ha visto en la foto de arriba, también se he hecho uso de la impresora de Tumaker aunque esta vez debido a las dimensiones de la PCB se ha tenido que partir por la mitad las piezas por lo que los planos de a continuación han de imprimirse doble.

.

.


.

El resultado de todo el conjunto del proyecto es el siguiente:

.

.

Este proyecto como otro cualquiera también tiene unas conclusiones y unas líneas futuras que podrían ser estas:

Conclusiones

Al terminar el prototipo se ha pensado una serie de mejoras como:

  • Mejora de la rapidez de curado de la resina.
  • Posibilidad de utilizar la Tablet para la impresión 3D.
  • Abaratamiento de la impresora 3D

Líneas futuras

Aunque el objetivo principal de este proyecto haya sido crear un foco de luz ultravioleta y un medidor de luz UV y de lumens más llegar al máximo con la Tablet para bajar el coste de Eraikizpi, se le podría dar más opciones a la impresora 3D.

  • Integrar PC en la impresora.
  • Autoabastecimiento de resina.
  • Detector de fallos.

Videotutorial

.

Si quieres puedes descargar los archivos del proyecto en este enlace.

Braill3D, una impresora 3D para imprimir en Braille

Braill3D, una impresora 3D para imprimir en Braille

Actualmente las impresoras 3D se han convertido en una de las opciones de mayor uso a la hora de creación de piezas de materiales termoplásticos, incluso son consideradas por las empresas como un negocio viable.

Como resultado de un estudio realizado en el departamento de Mantenimiento Electrónico del centro de Formación Profesional Don Bosco, se ha visto la necesidad de dar a conocer ésta tecnología a personas con discapacidad visual, ofreciéndoles la posibilidad de imprimir braille e incluso figuras 3D. Por lo tanto, el grupo Braill3D decidió fusionar una página web PHP, una impresora 3D y una impresora normal de tinta.
.

.
En primer lugar el PHP es la aplicación encargada de traducir el texto que introducimos a través del teclado en Braille(PHP)
El texto introducido es recorrido caracter a caracter por la aplicación, traduciendo dichos caracteres en sus correspondientes 6 puntos de Braille.
.
.
Como se aprecia en la imagen, los 6 puntos de Braille están representados con unos y ceros. En las posiciones de carácter que hay uno, la impresora 3D imprimirá un punto.
La impresora 3D que utilizamos fue la Prusa I3 con estructura de madera, de la empresa Createc3D. Estas son muy fáciles de construir dado a la cantidad de información que hay en la red. Las máquinas están preparadas para poder imprimir piezas de plástico de muchos tipos(ABS,PLA,PET…)  En este caso, sólo la utilizamos con PLA, porque es un material más pegajoso, necesita menos temperatura para ser extruido (190ºC) y no expulsa gases nocivos.
La impresora construida por el grupo Braill3D tiene como electrónica principal la placa Arduino Mega 2560 conectada con una Shield especializada en estas máquinas, por su amplitud de entradas y salidas. Esta placa recibe señales y alimenta partes de la impresora como,finales de carrera, los motores, el termistor…
.

.

.

Una de las cosas que se han modificado en la impresora 3D, ha sido el Hot-End. La razón ha sido el diámetro del agujero(Nozzle). En el anterior Hot-End, el Nozzle era de 0,4mm pero los puntos de Braille debían ser más finos, con lo cual se tuvo que poner uno de 0,3mm.

.

.

.

Por último, la impresora de tinta ha sido implementada mediante una placa diseñada, simulada y creada para así mecanizar la alimentación de papel. Para ello se han utilizado los programas de Proteus (Isis y Ares) y para fabricar la placa, utilizamos la fresadora LPKF.

.

.
El modo de alimentar con papel la impresora 3D, es un método mecánico, es decir, hemos colocado un botón al lado del final de carrera del eje Y, de tal manera cuando la impresora 3D recibiera la señal de ir al punto de partida (home) golpeará el botón de la placa realizada para la máquina de tinta, por lo tanto la impresora de tinta expulsa una hoja a la cama de la impresora preparándose para imprimir Braille.

.

,
A continuación, los archivos del proyecto:

Robot «Cuadrúpedo AI» controlado por Android

Robot «Cuadrúpedo AI» controlado por Android

¿Que es un robot?

Un robot es un dispositivo electrónico y generalmente mecánico capaz de desempeñar tareas automáticamente, ya sea por medio de supervisión humana directa, a través de un programa predefinido o siguiendo un conjunto de reglas generales establecidas. Existen multitud de robots diseñados para cumplir diferentes objetivos: como brazos robóticos para el montaje de piezas en una fábrica, vehículos aéreos no tripulados o los robots móviles terrestres.

El “cuadrúpedo AI” nace de la idea de dos alumnos con ganas de hacer un proyecto visual, no nos valía un proyecto estanco, que no se moviese, que no llamase la atención, y ahí, aparece el Cuadrúpedo.

El robot esta construido con piezas de plástico, ABS o PLA. Nos decantamos por las piezas de plástico por la sencillez que nos ofrecían las impresoras 3D para crear piezas. Aparte las piezas de plástico son de gran ligereza y lo suficientemente robustas para la estructura del cuadrúpedo. Las piezas de plástico están impresas en las impresoras 3D del ikaslab, gracias a Tumaker.

Las uniones son los servos FUTABA S3003. Estos servos únicamente tienen tres conexiones, alimentación (5v) , masa y control Estos van unidos a las piezas de plástico con tornillos como se puede ver en la siguiente imagen:

Para las patas se corto goma con intención de que no se resbalase por el pavimento, sin esa goma el movimiento del cuadrúpedo habría quedado mermado en exceso. Al principio tuvimos problemas con esto, pensamos que sin goma los movimientos serian naturales y andaría normal, pero resulto que no, se resbalaba y se quedaba en el sitio sin avanzar. Para ello cortamos un trozo de goma y lo pegamos con loctite al ABS de la pata.

Una vez recopiladas todas las piezas el robot queda montado tal que así, únicamente el chasis sin nada de electrónica.

Mientras uno de los componentes del equipo iba montando el esqueleto del robot, el otro iba haciendo los esquemas en Isis y viendo el funcionamiento de este. Para el esquema se utilizo el Arduino Uno puesto que no encontramos la opción de sacar el Mega. El Isis nos proporciono una idea general de como iba a ser el proyecto pero muy virtual y de forma visual.

Para el proyecto se ha utilizado el Arduino mega 2560, principalmente por las salidas PWM de las cuales dispone. El cuadrúpedo esta formado por 9 motores,y esta placa nos los admitía. Ya que con el arduino UNO que habíamos pensado en un principio no tenia tantas salidas PWM para todos los motores.

Una vez teniamos la placa decidimos crear un escudo «shield» para el Mega, para tratar de manipular menos posible la placa de aprendizaje. Intentamos buscar esa Shield por internet pero no dimos con ella, por lo que en Ares nos dispusimos a diseñarla.
Como se ve en la siguiente imagen esta el archivo del diseño en Ares:

Una vez montada la electronica y formado el cuadrupedo nos dispusimos a hacer la parte logica del proyecto, La aplicacion que la controlaria y el codigo para los motores y el ultrasonico.

La tecnología principal de este proyecto es el Bluetooth. Nos decantamos por el bluetooth puesto que necesitábamos algo que no llevase cables y fuese inalámbrico, otro de los factores claves del bluetooth es su simplicidad y la facilidad que Internet ofrece a esta tecnología.

El cuadrúpedo se controla con el móvil mediante un modulo Bluetooth y con un programa creado y diseñado con la aplicación App inventor. El App inventor es una plataforma online para preparar programas, se programa mediante una forma visual y no en código.

Una vez creado el programa App inventor se procederá a su descarga, se nos bajara un archivo .apk  y lo pasaremos al dispositivo Android, únicamente solo con que ejecutemos ese apk se nos instala Nos aparecerá así en nuestro móvil:

La interfaz creada sera tal que asi y se vera de esta forma sencilla:

En el vídeo se observa el programa, y dependiendo los botones que se pulsen el  cuadrúpedo reaccionará de una manera u otra. El programa de Android esta formado por diferentes botones que se explican en el video, excepto dos botones, reset y stop. La primera función es que se quede en el suelo con las piernas abiertas, y stop, es un modo en el que el cuadrúpedo queda apoyado con las cuatro patas pero de forma relajada.

Dispone de un modulo ultrasónico HC-SR04 que permite al cuadrúpedo andar de forma libre, en modo solitario, pero cuando se encuentra con un objeto delante de el, esquivarlo de manera natural para poder seguir andando y moviéndose por el entorno que le rodea.

Según el programa cuando el ultrasónico detecta algún obstáculo a menos de 30cm el cuadrúpedo se dirige hacia atrás.

En el vídeo anterior se observa el programa Android, explicando brevemente lo que ocurre al pulsar los diferentes botones que forman el programa, con su correspondiente reacción del cuadrúpedo.

Como anexo os adjuntamos el programa que hemos utilizado:

#include <Servo.h>
Servo myservoA;  // create servo object to control a servo
Servo myservoB;
Servo myservoC;
Servo myservoD;
Servo myservoE;
Servo myservoF;
Servo myservoG;
Servo myservoH;
Servo myservoQ;
long medir1;
long medir2;
long medir3;
int TrigPin = 12;
int EchoPin = 13;
int A = 90;  //A – Cadera 1
int B = 90;  //B – Cadera 3
int C = 90;  //C – Cadera 5
int D = 90;  //D – Cadera 7
int E = 90;  //E – Pie 2
int F = 90;  //F – Pie 4
int G = 90;  //G – Pie 6
int H = 90;  //H – Pie 8
int Q = 90;
int incomingByte = 0;
#include <SoftwareSerial.h>
SoftwareSerial mySerial(19, 18); // RX, TX
void setup()
{
   // Open serial communications and wait for port to open:
  Serial.begin(9600);
  pinMode(TrigPin,OUTPUT);
  pinMode(EchoPin,INPUT);
  Serial.println(«Hello «);
  Serial.println(«attaching to port_b»);
  myservoA.attach(9);  // attaches the servo on pin 9 to the servo object
  myservoB.attach(8);  // attaches the servo on pin 9 to the servo object
  myservoC.attach(6);  // attaches the servo on pin 9 to the servo object
  myservoD.attach(7);  // attaches the servo on pin 9 to the servo object
  myservoE.attach(2);  // attaches the servo on pin 9 to the servo object
  myservoF.attach(3);  // attaches the servo on pin 9 to the servo object
  myservoG.attach(4);  // attaches the servo on pin 9 to the servo object
  myservoH.attach(5);  // attaches the servo on pin 9 to the servo object
  myservoQ.attach(11);
}
void loop()
{
  long distance;
  distance=medir();
  Serial.print(  medir() );//Serial display distance
  //Serial.print(«cm»);
  Serial.println();
  //delay(1000);
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
    Serial.print(«He recibido:»);
    Serial.println(incomingByte,DEC);
  }
 if (incomingByte==0)
  {
    Serial.print(medir());//Serial display distance
    Serial.print(«dm»);
    Serial.println();
  // delay(500);
  }
  if(medir() ==0)
  {
    if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Serial.print(«He recibido:»);
    Serial.println(incomingByte,DEC);
    // delay(500);
    }
  }
if((medir()<80) &( medir()>=30))
{
   cycle_Stop();
   Serial.println();
   cycle_girar();
   Serial.println();
   Serial.print(  medir2);
   Serial.print(«d2mD»);
   Serial.println();
   Serial.print(  medir3);
   Serial.print(«d3mD»);
   Serial.println();
   //delay(1000);
}
   while((medir2>=medir3)&(medir()<80) &( medir()>=30)&(incomingByte==55))
  {
    cycle_Derecha();
    if (Serial.available() > 0)
    {
      incomingByte = Serial.read();
      Serial.print(«He recibido:»);
      Serial.println(incomingByte,DEC);
    }
    distance=medir();
    Serial.print(  medir());//Serial display distance
    Serial.print(«d1mD»);
    Serial.println();
    Serial.print(  medir2);
    Serial.print(«d2mD»);
    Serial.println();
    Serial.print(  medir3);
    Serial.print(«d3mD»);
    Serial.println();
   // delay(2000);
  }
   while((medir2<medir3)&(medir()<80) &( medir()>=30)&(incomingByte==55))
  {
    cycle_Izquierda();
    if (Serial.available() > 0)
    {
      incomingByte = Serial.read();
      Serial.print(«He recibido:»);
      Serial.println(incomingByte,DEC);
    }
    distance=medir();
    Serial.print(  medir());//Serial display distance
    Serial.print(«d1mZ»);
    Serial.println();
    Serial.print(  medir2);
    Serial.print(«d1mZ»);
    Serial.println();
    Serial.print(  medir3);
    Serial.print(«d1mZ»);
    Serial.println();
    //delay(2000);
  }
 if (( medir()<30 )&(incomingByte==55))
  {
    while (( medir()<60 )&(incomingByte==55))
    {
    cycle_Atras();
    if (Serial.available() > 0)
    {
      incomingByte = Serial.read();
      Serial.print(«He recibido:»);
      Serial.println(incomingByte,DEC);
    }
    distance=medir();
    Serial.print( medir() );//Serial display distance
    Serial.print(«d0m»);
    Serial.println();
   // delay(1000);
    }
  }
    while((medir() >=80)&(incomingByte==55))
  {
    cycle_Avance();
    distance=medir();
    Serial.print(medir());//Serial display distance
    Serial.print(«d2m»);
    Serial.println();
    //delay(3000);
    if (Serial.available() > 0 )
    {
      incomingByte = Serial.read();
      Serial.print(«He recibido:»);
      Serial.println(incomingByte,DEC);
                       
    }                   
   }
  
   while (incomingByte==50)
   {
     cycle_Avance();
       if (Serial.available() > 0) {
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
       }
     
   }
  
 
     while (incomingByte==53){
      cycle_Stop();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
     
    }
  while (incomingByte==49){
      cycle_Atras();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
     
    }
   
     while (incomingByte==56){
      cycle_Derecha();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
       
    }
   while (incomingByte==52){
      cycle_Izquierda();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
      
    }
   while (incomingByte==48){
      cycle_Reset();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
      
    }
     while (incomingByte==54){
      cycle_Avance2();
      if (Serial.available() > 0){
      incomingByte = Serial.read();
       Serial.print(«He recibido:»);
       Serial.println(incomingByte,DEC);
      }
      
    }
}
void   cycle_Avance(){
   for(A = 90; A < 150; A += 60)  // goes from 30 degrees to 150 degrees
  { 
    myservoE.write(40);
    myservoH.write( 140);
    myservoF.write(0);
    myservoG.write(0);
    delay(200);     // in steps of 10 degree
    myservoA.write(30);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(150);
    myservoC.write(90);
    delay(200);
                 // waits 15ms for the servo to reach the position
  }
  for(A = 150; A>=91; A-=60)     // goes from 150 degrees to 30 degrees
  {                                
    
    myservoF.write(40);
    myservoG.write(40);
    myservoE.write(0);
    myservoH.write(180);
      delay(200);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(30);
    myservoB.write(90);
    myservoC.write(150);   
    delay(200);             // waits 15ms for the servo to reach the position
  }
   Serial.print(«Avance»);
  }
void cycle_Stop(){
   myservoE.write( 0);
    myservoH.write(180);
    myservoF.write(0);
    myservoG.write(0);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(90);
    myservoC.write(90);
    //delay(1000);
    Serial.print(«Stop»);
  }
void cycle_Reset(){
    for(A = 90; A < 150; A += 1)  // goes from 30 degrees to 150 degrees
  {                           // in steps of 10 degree
  
    myservoE.write( 90);
    myservoH.write(90);
    myservoF.write(90);
    myservoG.write(90);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(90);
    myservoC.write(90);
   
    delay(20);    
                      // waits 15ms for the servo to reach the position
  }
 for(A = 150; A>=91; A-=1)     // goes from 150 degrees to 30 degrees
  {                              
    myservoF.write(90);
    myservoG.write(90);
    myservoE.write(90);
    myservoH.write(90);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(90);
    myservoC.write(90);
   
    delay(20);   
                      // waits 15ms for the servo to reach the position
  }
}
void   cycle_Atras(){
  for(A = 90; A < 150; A += 60)  // goes from 30 degrees to 150 degrees
  { 
    myservoE.write(0);
    myservoH.write( 180);
    myservoF.write(40);
    myservoG.write(40);
    delay(200);     // in steps of 10 degree
    myservoA.write(30);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(150);
    myservoC.write(90);
    delay(200);
                 // waits 15ms for the servo to reach the position
  }
  for(A = 150; A>=91; A-=60)     // goes from 150 degrees to 30 degrees
  {                                
    
    myservoF.write(0);
    myservoG.write(0);
    myservoE.write(40);
    myservoH.write(140);
      delay(200);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(30);
    myservoB.write(90);
    myservoC.write(150);   
    delay(200);             // waits 15ms for the servo to reach the position
  }
   Serial.print(«Atras»);
}
void   cycle_Avance2(){
   for(A = 90; A < 150; A += 60)  // goes from 30 degrees to 150 degrees
  { 
    myservoE.write(40);
    myservoH.write( 140);
    myservoF.write(0);
    myservoG.write(0);
    delay(150);     // in steps of 10 degree
    myservoA.write(60);              // tell servo to go to position in variable ‘A’
    myservoD.write(120);
    myservoB.write(120);
    myservoC.write(60);
    delay(150);
                 // waits 15ms for the servo to reach the position
  }
  for(A = 150; A>=91; A-=60)     // goes from 150 degrees to 30 degrees
  {
    myservoF.write(40);
    myservoG.write(40);
    myservoE.write(0);
    myservoH.write(180);
      delay(180);
    myservoA.write(120);              // tell servo to go to position in variable ‘A’
    myservoD.write(60);
    myservoB.write(60);
    myservoC.write(120);   
    delay(180);             // waits 15ms for the servo to reach the position
  }
   Serial.print(«Avance»);
  }
void   cycle_Izquierda(){
  for(A = 90; A < 150; A += 60)  // goes from 30 degrees to 150 degrees
  {
    myservoE.write(40);
    myservoH.write( 140);
    myservoF.write(0);
    myservoG.write(0);
    delay(180);     // in steps of 10 degree
    myservoA.write(60);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(90);
    myservoC.write(90);
    delay(180);
                 // waits 15ms for the servo to reach the position
  }
  for(A = 150; A>=91; A-=60)     // goes from 150 degrees to 30 degrees
  {
    myservoF.write(40);
    myservoG.write(40);
    myservoE.write(0);
    myservoH.write(180);
      delay(150);
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(60);
    myservoB.write(90);
    myservoC.write(150);   
    delay(150);             // waits 15ms for the servo to reach the position
  }
    Serial.print(«Izquierda»);
}
void  cycle_Derecha(){
  for(A = 90; A < 150; A += 60)  // goes from 30 degrees to 150 degrees
  {
    myservoE.write(0);
    myservoH.write( 180);
    myservoF.write(40);
    myservoG.write(40);
    delay(200);     // in steps of 10 degree
    myservoA.write(90);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(90);
    myservoC.write(120);
    delay(200);
                 // waits 15ms for the servo to reach the position
  }
  for(A = 150; A>=91; A-=60)     // goes from 150 degrees to 30 degrees
  {                               
    
    myservoF.write(0);
    myservoG.write(0);
    myservoE.write(40);
    myservoH.write(140);
      delay(200);
    myservoA.write(30);              // tell servo to go to position in variable ‘A’
    myservoD.write(90);
    myservoB.write(120);
    myservoC.write(90);   
    delay(200);             // waits 15ms for the servo to reach the position
  }
   Serial.print(«derecha»);
}
long medir(void)
{
  
  long dist,duration;
  digitalWrite(TrigPin,HIGH);//TrigPin prepare high of more than 10us
  delayMicroseconds(11);
  digitalWrite(TrigPin,LOW);
  duration = pulseIn(EchoPin, HIGH);//EchoPin received high start counting until the receiver to the low,return to the count valu
  dist = duration/29/2;//Calculating the distance  cm
                           // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  return dist;
}
void cycle_girar(){
  
  myservoQ.write(0);   //Cargamos la funcion con el valor en grados de 0 a 179º
  delay(200);
  medir2=medir();
  delay(200);        //Retardo entre coordenadas
  myservoQ.write(90);  //Cargamos la funcion con el valor en grados de 0 a 179º
  delay(200);
  medir1=medir();
  delay(200);  //Retardo entre coordenadas
  myservoQ.write(179); //Cargamos la funcion con el valor en grados de 0 a 179º
  delay(200);
  medir3=medir();
  delay(200);        //Retardo entre coordenadas
  myservoQ.write(90);  //Cargamos la funcion con el valor en grados de 0 a 179º
  delay(200);
   Serial.print(«girar»);

 

  }
TWI-TWI, impresora 3D controlada por Android

TWI-TWI, impresora 3D controlada por Android

¿Que es el proyecto TWI – TWI?

De manera sencilla y resumida, la Voladora V2 de Tumaker utiliza una placa llamada Megatronics V3, simplemente es un Arduino Mega 2560 con los pines adaptados para controlar impresoras 3D. Se le ha añadido un modulo Bluetooth a la placa electrónica y se ha creado una aplicación, mediante el programa App Inventor de Google, para controlar la impresora 3D Voladora V2 de Tumaker desde cualquier periférico que utilice el sistema operativo Android.

El objetivo de este proyecto es desarrollar y construir un periférico que controle una impresora 3D, exactamente, la Voladora V2 de Tumaker.

Este proyecto esta formado por tres partes, la comunicación entre el móvil y la impresora 3D Voladora V2 de Tumaker, la aplicación que se crea con App Inventor y el firmaware (el programa que se carga en la placa Megatronics V3) que se llama Marlin.

Comunicación Bluetooth y comunicación Serie
La comunicación  Bluetooth es un protocolo de comunicación inalámbrica de voz y datos.

La comunicación Serie o Serial es un protocolo de comunicación mediante cables de voz y datos que se envía y recibe mediante RX y Tx.

El proyecto TWI – TWI funciona,se envían «comandos» desde el móvil, a la impresora 3D y viceversa. El modulo Bluetooth hace de intermediario entre la impresora 3D y el móvil. El modulo Bluetooth recibe los «comandos» desde el móvil y la impresora 3D. Se utilizan dos tipos de comunicación, la comunicación Serie y la comunicación Bluetooth. La comunicaciòn entre el móvil y el modulo Bluetooth es comunicación Bluetooth, es decir, la información es enviado mediante ondas y la comunicación entre el modulo Bluetooth y la impresora 3D es una comunicación Serie.

Programación

En este proyecto se ha llevado a cabo modificando el Marlin en el sketch de Arduino, el lenguaje en el que se basa Arduino es en C y C++.

Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares.

Firmware (Marlin)

Firmware es un programa que es grabado en una memoria, normalmente de lectura/escritura (ROM, EEPROM, flash, etc.), que establece la lógica de más bajo nivel que controla los circuitos electrónicos de un dispositivo de cualquier tipo.
El firmware que utiliza la impresora 3D Voladora V2 de Tumaker es uno llamado Marlin. El mismo firmware sirve para diferentes impresoras 3D, pero se tiene que modificar adaptándolo a la impresora 3D en funciones.

El primer y gran dilema de este proyecto es que se tiene que crear un nuevo puerto serie, muchos os preguntareis porque si puedes utilizar el puerto serie que trae predeterminado la placa. Si se utiliza el mismo puerto serie, la trasmisión de datos se colapsa y ademas no se podrá utilizar la impresora 3D mediante el uso normal, para ello se modifica el firmware «Marlin». La placa electrónica Megatronics V3 de la impresora 3D te da la opción de abrir puertos serie mediante software y hardware.

Los trozos de programa que se modifica en el Marlin.

#include "NewSoftSerial.h"  // Llamada a la libreria NewSoftSerial
#define rxPin 11  //  Declara el pin 11 con el nombre de rxPin
#define txPin 15  //  Declara el pin 15 con el nombre de rxPin
NewSoftSerial miSerial(rxPin, txPin);  //  declara en nombre del puerto serie y define los pines rx y tx

void setup()
{
  miSerial.begin(9600);  // Abre en nuevo puerto serie
  pinMode(3,INPUT);  // declara el pin 3 como entrada
  pinMode(2,OUTPUT);  // declara el pin 2 como salida
  pinMode(rxPin, INPUT); // declara el pin rxPin como entrada
  pinMode(txPin, OUTPUT); // declara el pin txPin como salida

Con el trozo de código de arriba  se consigue abrir el nuevo puerto serie y en este caso el pin 11 es Rx y el pin 15 es Tx. Sin olvidar la velocidad en baudios del nuevo puerto serie, en este caso es de 9600 baudios, es una de las razones por las que puede que al dibujar a mano alzada la impresión se atasque, ya que la impresora 3D y el ordenador se comunican a 115200 baudios. 12 veces mas lento.

void loop()

{
 int estado;  // crear una variable con el nombre estado
 estado=digitalRead(3);  // guardar la lectura del pin 3 en la variable estado
 switch(estado) // mira el valor de la variable estado y ejecutara lo que este dentro del caso 0: caso 1: ...
 {
   case 0: //  ejecutara lo que este dentro siempre que el valor de estado sea 0

   if(buflen < (BUFSIZE-1))


     get_command();
   #ifdef SDSUPPORT
   card.checkautostart(false);
   #endif
   if(buflen)
   {
     #ifdef SDSUPPORT
       if(card.saving)
       {
  if(strstr_P(cmdbuffer[bufindr], PSTR("M29")) == NULL)
  {
    card.write_command(cmdbuffer[bufindr]);
    SERIAL_PROTOCOLLNPGM(MSG_OK);
  }
  else
  {
    card.closefile();
    SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED);
  }
       }
       else
       {
  process_commands();
       }
     #else
       process_commands();
     #endif //SDSUPPORT
     buflen = (buflen-1);
     bufindr = (bufindr + 1)%BUFSIZE;
   }
   //check heater every n milliseconds
   manage_heater();
   manage_inactivity();
   checkHitEndstops();
   lcd_update();
          break;

   case 1:

 if(buflen < (BUFSIZE-1))


  get_command_bluetooth();
   #ifdef SDSUPPORT
   card.checkautostart(false);
   #endif
   if(buflen)
   {
     #ifdef SDSUPPORT
       if(card.saving)
       {
  if(strstr_P(cmdbuffer[bufindr], PSTR("M29")) == NULL)
  {
    card.write_command(cmdbuffer[bufindr]);
    SERIAL_PROTOCOLLNPGM(MSG_OK);
  }
  else
  {
    card.closefile();
    SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED);
  }
       }
       else
       {
  process_commands();
       }
     #else
       process_commands();
     #endif //SDSUPPORT
     buflen = (buflen-1);
     bufindr = (bufindr + 1)%BUFSIZE;
   }
   //check heater every n milliseconds
   manage_heater();
   manage_inactivity();
   checkHitEndstops();
   lcd_update();
          break;
  
  
}

}

void get_command_bluetooth() // es una funcion que se ha creado para interpretar los datos recibidos desde el móvil y ejecutar las acciones
{ 
  while( miSerial.available() > 0  && buflen < BUFSIZE) { // mientras reciba algo superior a 0 por el puerto serie
    serial_char = miSerial.read();

Dentro del Void loop, que es la función principal, se crea este trozo de código para elegir mediante un interruptor la forma de utilizar la impresora 3D Voladora V2 de Tumaker, de manera normal, es decir, controlado por ordenador o controlado por el móvil.

Se ha creado la función void get_command_bluetooth() para interpretar los datos recibidos desde el móvil y ejecutar las acciones.

Se ha creado la función void get_command_bluetooth() para interpretar los datos recibidos desde el móvil y ejecutar las acciones.

App Inventor

App Inventor es un entorno de desarrollo visual de aplicaciones para los teléfonos Android desarrollado por el MIT. Para desarrollar aplicaciones con App Inventor sólo necesitas un navegador web y un teléfono Android.

Al construir las aplicaciones para Android se trabaja con dos herramientas: App Inventor Designer y App Inventor Blocks Editor. En Designer se construye el Interfaz de Usuario, eligiendo y situando los elementos con los que interactuará el usuario. Con el Blocks Editor se define el comportamiento de los componentes de la aplicación.

Esta es la parte visual de la aplicación se ha creado utilizando la herramienta Designer, simplemente son botones, textBox (que es un texto vació para rellenar), texto.

En la imagen de abajo se aprecia el programa entero, mediante el editor de bloques conseguimos asignar acciones a los diferentes objetos de la parte visual.

Todos los bloques tienen una condición, si el modulo bluetooth esta conectado, entonces ejecuta las acciones.

Componentes

-Modulo Bluetooth
-Interruptor
-Voladora V2
-Móvil sistema operativo Android
-Tarjeta SD

Cambios en la impresora 3D Voladora V2 de Tumaker

Se ha modificado la impresora 3D Voladora V2 de Tumaker físicamente para llevar a cavo este proyecto.

Utilizando un pin digital libre de la placa Megatronics V3 se ha colocado un interruptor en forma de pull-up, cuando el interruptor este levantado significa que se controla desde el ordenador y cuando el interruptor este abajo significa que se controla desde el móvil.
Aparte de colocar el interruptor es necesario conectar el modulo Bluetooth e introducir la tarjeta SD con algún G-code cargado en la tarjeta SD.
Esquema de Megatronics V3
En el esquema de arriba se aprecia el conexionado de la placa Megatronics V3, los pines del modulo Bluetooth se conectan Rx al pin 11 y Tx al pin 15 y dos mas que son 5v y 0v.
El interruptor con el sistema pull-up se conecta en el pin 2.

Descargar archivos del proyecto.

Características de una Impresora 3D Tumaker Voladora

Características de una Impresora 3D Tumaker Voladora

¿Qué es una impresora 3D? 

Es un dispositivo capaz de generar objetos solidos tridimensionales partiendo de un diseño digitalizado. Las impresoras 3D construyen objetos solidos mediante capas de hilo  que se imprime pulverizando un material adherente que se fija en finas capas superpuestas. Las capas reproducen físicamente el objeto  capa a capa. Se pueden utilizar diferentes materiales y colores en una sola impresión.

Lellenda 1: La impresora 3D Voladora
.

TUMAKER

El objetivo es trabajar para alcanzar los límites de la tecnología, con el fin de poner las herramientas en manos de las personas creativas y empresas innovadoras para que sean capaces de avanzar hacia una sociedad mejor y más sostenible.

Tumaker es algo más que una empresa de impresoras 3D, producen valor añadido y acompañamiento experto para educar y ayudar a tu empresa, colegio, colectivo o a ti mismo a utilizar un ecosistema de fabricación personal asequible y de calidad.

Lellenda 2: Tumaker fabricación personal

.
VOLADORA
La Voladora es la actual impresora 3D de Tumaker, se fabrica totalmente en Oiartzun y se divide en dos partes fundamentales, el Hardware y el Software.

HARDWARE  

Se refiere a las partes tangibles o físicas.

ELECTRÓNICA

La placa que utiliza la Voladora es Megatronics V2, es una placa que tiene las entradas/salidas configuradas para el uso de la impresora 3D como (motores de los «ejes X, Y, Z», motores del extrusor, finales de carrera, termistores, ventiladores variables, resistencias para calentar el Hotend y la cama,..)  y el micro controlador de la placa es un Arduino Mega 2560. Para controlar la tensión de los motores se utilizan los «Stepper-s» también conocidos como (Pololu-s o Driver-s).

Lellenda 3: Megatronisc V2

.

Fuente de alimentación externa de 12v y hasta 18A.
Conectividad de la electrónica, tiene la opción de conectarse mediante USB y SD Card.

MECÁNICA

Todo el diseño de la Voladora se ha hecho en Tumaker.

  • EL chasis está compuesto por perfiles de aluminio de alta resistencia y embellecedores de metacrilato colores personalizables al gusto del cliente.
  • Apoyos paramétricos, las patas de la impresora reducen las vibraciones, ruidos y permite ajustar la altura de la impresora.
  • Rodamientos lineales dobles de alta calidad en los ejes X, Y, Z para el desplazamiento ligero.
  • Varillas rectificadas y calibradas.

EJES X, Y, Z 

Los ejes X, Y, Z utilizan motores paso a paso, estos motores son ideales para la creación de objetos tridimensionales por tener gran precisión es sus movimientos, convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, es decir,  avanzar una serie de grados.

 

Lellenda 4: Motor paso a paso

.

La Voladora utiliza correas para convertir los movimientos de los motores paso a paso en desplazamientos precisos del carro (que es donde va el Hotend).

Lellenda 5: Correas de los ejes X e Y

  .

EXTRUSOR

El extrusor es una de las partes más importantes de las impresoras 3D. La Voladora utiliza el sistema  de extrusión Bowden porque es ligero y optimizado, permite impresiones más rápidas y más precisas proporcionando mejores resultados que los sistemas tradicionales de extrusión directa.
El extrusor también utiliza motores paso a paso por su gran precisión.

Lellenda 6: Extrusor

.

El sistema Bowden es el mismo sistema que utiliza el freno de las bicicletas, pero en vez del cable se utiliza el filamento, consisten en llevar el mismo movimiento y fuerza que hace el motor del extrusor en el filamento, al Hotend, sin pérdidas.

Lellenda 7: Bowden

.

CARRO (HOTEND)

El carro es el objeto que sujeta el Hotend, como el nombre indica «final caliente» es la punta donde sale el filamento fundido.
Los Hotend que pueden utilizar las Voladoras son un J-head o un All-metal. (Actualmente en las nuevas versiones que están a punto de salir, se utiliza un All-metal el «E3D»)¿Cómo consigue que el filamento salga fundido?

El Hotend en su interior tiene una resistencia y un termistor. El termistor es un sensor resistivo de temperatura, con ello sabemos la temperatura que tiene el Hotend. La resistencia se utiliza para calentar el Hotend y fundir el filamento. (Con un PID adecuado conseguiremos que el Hotend consiga le temperatura que deseemos en el menor tiempo posible y con la mayor exactitud.)
El extrusor empuja el filamento a través del Bowden y sale fundido del Hotend.

 

Lellenda 8: Filamenta saliendo del Hotend

.

  • La Voladora puede tener dos Hotend-s para conseguir imprimir objetos de diferentes materiales y colores.
  • Los Hotend-s pueden tener diferentes diámetros de  boquilla: 0.3mm/0.5mm… el que utiliza la Voladora es 0.4mm

CAMA DE IMPRESIÓN

La cama de impresión es la superficie donde se creara el objeto tridimensional, el tamaño de la superficie donde se puede imprimir es de 25x25x19 cm. Una Voladora puede llevar cama caliente o no. Se compone de un termistor para saber que temperatura tiene y una resistencia para calentar.
La cama caliente es una superficie que se calienta para que se adhiera mejor el filamento fundido y tiene una superficie de impresión de 21×21 cm.

Lellenda 9: Cama caliente

.
FILAMENTO

El filamento es el material que se funde y crea el objeto tridimensional. Puede ser de diferentes colores y de diferentes materiales (PLA, ABS, Nylon, resina de madera, filamento soluble, material flexible, filamento conductor,..)
Cada filamento es diferente y se funde a diferentes temperaturas, las temperaturas varían dependiendo del material y del color, es recomendable utilizar la temperatura que recomienda el fabricante.

Lellenda 10: Piezas de diferentes materiales y colores

.
SOFTWARE

Equipamiento lógico de un sistema informático, los programas que se utilizan son los siguientes:

CURA

Es un software que filetea los objetos diseñados en otros software-s como (SolidWorks, SolidEdge, SketchUp,…). Una vez fileteado conseguiremos un archivo «G-code», esto es un conjunto de órdenes en lenguaje C que necesitamos para la impresión 3D.
Los tipos de ficheros que se pueden usar en estos software-s son: STL, OBJ, AMF (los más utilizados y los que se recomiendan) entre otros.

REPETIER HOST 

Una vez tienes el «G-code» se carga en el software Repetier Host que es el programa que le manda las órdenes que interpreta del «G-code» a la impresora 3D y así creando el objeto tridimensional.
También se puede controlar la impresora 3D.

FIRMWARE

Es un bloque de instrucciones de máquina para propósitos específicos. El firmware que utiliza la Voladora es uno llamado «Marlin» pero con muchas modificaciones y ajustada a la Voladora, únicamente sirve para esta impresora 3D. El firmware, es un programa en lenguaje C y se carga en el micro controlador Arduino Mega 2560.

CLIENTES 

PARTICULARES

Uno de los habituales clientes son los particulares, creativos y con imaginación, también conocidos como «MAKERS». Esta impresora 3D, la Voladora, es perfecta para este tipo de clientes, con precios razonables y con multitud de accesorios.

CENTROS DE FORMACIÓN

Otro de los clientes son los centros de formación, suelen interesarse por las nuevas tecnologías y la innovación, (la Voladora es una tecnología medianamente nueva, al alcance de todos, e innovadora) además da rienda suelta a la imaginación de los alumnos.
El pionero en crear laboratorios de impresoras 3D «Fab-Lab»  es el Instituto de formación profesional Don Bosco, pero esto no sería posible sin la colaboración del departamento de Electrónica y la empresa Tumaker.

EN ÁREAS DE LA MEDICINA 

La Voladora es una perfecta herramienta de trabajo para varios ámbitos de la medicina, por la calidad de impresión que tiene, por el bajo coste, por la diversidad de materiales,..
Suelen adquirir esta impresora los médicos especializados, tales como, Odontólogos, Podólogos, Cirujanos… para crear moldes, prótesis, implantes…