Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Cómo hacer un mini plotter CNC 2D usando una unidad de DVD para chatarra, L293D

Componentes y suministros

Arduino UNO
Cerebro de la máquina
× 1
Escudo del motor L293D
Controla los motores paso a paso del eje
× 1
Tower pro Servo motor 9g
Bolígrafo de movimiento Zaxis ARRIBA y bolígrafo ABAJO
× 1
Scrap DVD Dr
eje X mecánico y eje Y
× 1
Cables de puente (genéricos)
× 1

Aplicaciones y servicios en línea

Arduino IDE
IDE de procesamiento
Inkscape

Acerca de este proyecto

Organice dos unidades de DVD de desecho como se muestra en la imagen

1. Descarga Arduino IDE

2. Descargar IDE de procesamiento

3. Abra Arduino IDE y cargue el código descargado de aquí .

4. Abra Processing IDE y cargue el código descargado de aquí .

Abra la unidad de DVD de desecho y retire la bandeja móvil interna. Esta bandeja que tiene un mecanismo paso a paso actuará como nuestro eje X y eje Y. Consulte las imágenes adjuntas para comprender cómo ensamblar su máquina. Haga un agujero en la caja de la unidad de DVD vacía, monte nuestro eje X e Y en la caja de DVD respectiva con la ayuda de tornillos de tuerca.

Ahora colóquelos perpendicularmente entre sí.

Código G

Para crear archivos de código g que sean compatibles con esta máquina CNC, debe usar Inkscape.

Inkscape es un software de gráficos vectoriales de calidad profesional que se ejecuta en Windows, Mac OS X y Linux. Es utilizado por profesionales del diseño y aficionados en todo el mundo, para crear una amplia variedad de gráficos como ilustraciones, iconos, logotipos, diagramas, mapas y gráficos web. Inkscape utiliza el estándar abierto SVG (Scalable Vector Graphics) del W3C como formato nativo, y es un software gratuito y de código abierto. Descarga e instala Inkscape desde aquí.

( Importante :descargar la versión 0.48.5) Ahora necesita instalar un complemento que permita exportar imágenes a archivos de código g. Este complemento se puede encontrar aquí con las notas de instalación.

Siga el video en YouTube sobre cómo crear un archivo de código G.

  • Sube el archivo gctrl al IDE de procesamiento y haz clic en el botón REPRODUCIR en la ventana de procesamiento.
  • Primero presione 'p' para seleccionar su puerto de comunicación
  • Si lo desea, puede configurar la velocidad de jog presionando el botón 1, 2 o 3 en el teclado
  • Presione 'g' para cargar el archivo de código G
  • Su máquina está lista para trazar tan pronto como presione Intro seleccionando el archivo de código g

Ahora su plotter está listo. Algunos enlaces de descarga de archivos de código G listos para usar:

  • https://www.dropbox.com/s/bazynxife4k1trv/Hisoka.gcode?dl=0
  • https://www.dropbox.com/s/h6bkdr5lhegbj6a/papay.gcode?dl=0
  • https://www.dropbox.com/s/ueku5ckt6m4cmg4/spong1.gcode?dl=0

¡Gracias por tu atención! Visite este enlace para obtener una ilustración completa.

Video para ver la máquina en vivo:

Código

  • Código CNC de Arduino
  • Código de procesamiento
Código CNC de Arduino Arduino
Sube este código a Arduino
 #include  #include  #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP; // Posición del servo para arriba y abajo const int penZUp =95; const int penZDown =83; // Servo en PWM pin 10const int penServoPin =10; // Debería ser adecuado para DVD steppers, pero no es demasiado importante aquíconst int stepsPerRevolution =48; // crea un objeto servo para controlar un servo Servo penServo; // Inicialice steppers para los ejes X e Y usando estos pines Arduino para el L293D H-bridgeAF_Stepper myStepperY (stepsPerRevolution, 1); AF_Stepper myStepperX (pasosPerRevolución, 2); / * Estructuras, variables globales * / struct point {float x; flotar y; flotar z; }; // Posición actual de plotheadstruct point actuatorPos; // Configuración del dibujo, debe ser OKfloat StepInc =1; int StepDelay =0; int LineDelay =0; int penDelay =50; // Pasos del motor hasta 1 milímetro.// Usar boceto de prueba para ir 100 pasos. Mide la longitud de la línea. // Calcula pasos por mm. Ingrese aquí.float StepsPerMillimeterX =100.0; float StepsPerMillimeterY =100.0; // Dibujando los límites del robot, en mm // OK para empezar. Podría llegar hasta 50 mm si se calibra bien. flotar Xmin =0; flotar Xmax =40; flotar Ymin =0; flotar Ymax =40; flotar Zmin =0; flotar Zmax =1; flotar Xpos =Xmin; flotar Ypos =Ymin; flotar Zpos =Zmax; // Establecer en verdadero para obtener la salida de depuración. Boolean verbose =falso; // Necesita interpretar // G1 para mover // G4 P300 (esperar 150ms) // M300 S30 (bolígrafo abajo) // M300 S50 (bolígrafo arriba) / / Descartar cualquier cosa con un (// ¡Descartar cualquier otro comando! / ********************* * void setup () - Inicializaciones ******* **************** / void setup () {// Setup Serial.begin (9600); penServo.attach (penServoPin); penServo.write (penZUp); delay (100); // Disminuir si es necesario myStepperX.setSpeed ​​(600); myStepperY.setSpeed ​​(600); // Establecer y mover a la posición inicial predeterminada // TBD // Notificaciones !!! Serial.println ("¡Mini trazador CNC vivo y coleando! "); Serial.print (" El rango X es de "); Serial.print (Xmin); Serial.print (" a "); Serial.print (Xmax); Serial.println (" mm. "); Serial. print ("El rango Y es de"); Serial.print (Ymin); Serial.print ("a"); Serial.print (Ymax); Serial.println ("mm.");} / ***** ***************** * bucle vacío () - Bucle principal ********************** / void loop () {retardo (100); línea de caracteres [LINE_BUFFER_LENGTH]; char c; int lineIndex; bool lineIsComment, lineSemiColon; lineIndex =0; lineSemiColon =falso; lineIsComment =falso; while (1) {// Recepción en serie:principalmente de Grbl, se agregó soporte de punto y coma while (Serial.available ()> 0) {c =Serial.read (); if ((c =='\ n') || (c =='\ r')) {// Se alcanzó el final de la línea if (lineIndex> 0) {// La línea está completa. ¡Entonces ejecuta! línea [lineIndex] ='\ 0'; // Terminar cadena if (detallado) {Serial.print ("Recibido:"); Serial.println (línea); } processIncomingLine (línea, lineIndex); lineIndex =0; } else {// Línea vacía o de comentario. Saltar bloque. } lineIsComment =falso; lineSemiColon =falso; Serial.println ("ok"); } else {if ((lineIsComment) || (lineSemiColon)) {// Deseche todos los caracteres de comentario if (c ==')') lineIsComment =false; // Fin del comentario. Reanudar línea. } else {if (c <='') {// Elimina los espacios en blanco y los caracteres de control} else if (c =='/') {// No se admite la eliminación de bloqueos. Ignorar personaje. } else if (c =='(') {// Habilite la marca de comentarios e ignore todos los caracteres hasta ')' o EOL. lineIsComment =verdadero; } más si (c ==';') {lineSemiColon =true; } else if (lineIndex> =LINE_BUFFER_LENGTH-1) {Serial.println ("ERROR - lineBuffer overflow"); lineIsComment =falso; lineSemiColon =falso; } else if (c> ='a' &&c <='z') {// Línea en minúscula en mayúscula [lineIndex ++] =c-'a '+' A '; } else {línea [lineIndex ++] =c; }}}}}} void processIncomingLine (char * línea, int charNB) {int currentIndex =0; tampón char [64]; // Espero que 64 sea suficiente para 1 parámetro struct point newPos; newPos.x =0.0; newPos.y =0.0; // Necesita interpretar // G1 para mover // G4 P300 (espere 150ms) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (bolígrafo abajo) // M300 S50 (bolígrafo arriba) // Deseche cualquier cosa con un (// Descartar cualquier otro comando! While (currentIndex  =Xmax) {x1 =Xmax; } si (x1 <=Xmin) {x1 =Xmin; } si (y1> =Ymax) {y1 =Ymax; } si (y1 <=Ymin) {y1 =Ymin; } if (detallado) {Serial.print ("Xpos, Ypos:"); Serial.print (Xpos); Serial.print (","); Serial.print (Ypos); Serial.println (""); } if (detallado) {Serial.print ("x1, y1:"); Serial.print (x1); Serial.print (","); Serial.print (y1); Serial.println (""); } // Convertir coordenadas a pasos x1 =(int) (x1 * StepsPerMillimeterX); y1 =(int) (y1 * StepsPerMillimeterY); flotar x0 =Xpos; flotar y0 =Ypos; // Averigüemos el cambio de las coordenadas long dx =abs (x1-x0); long dy =abs (y1-y0); int sx =x0  dy) {for (i =0; i  =dx) {over- =dx; myStepperY.onestep (sy, STEP); } retraso (StepDelay); }} else {for (i =0; i  =dy) {over- =dy; myStepperX.onestep (sx, PASO); } retraso (StepDelay); }} if (detallado) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print (","); Serial.print (dy); Serial.println (""); } if (detallado) {Serial.print ("Yendo a ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); } // Retraso antes de que se envíen las siguientes líneas delay (LineDelay); // Actualiza las posiciones Xpos =x1; Ypos =y1;} // Aumenta penvoid penUp () {penServo.write (penZUp); retraso (penDelay); Zpos =Zmax; digitalWrite (15, BAJO); escritura digital (16, ALTA); if (detallado) {Serial.println ("Pen up!"); }} // Reduce penvoid penDown () {penServo.write (penZDown); retraso (penDelay); Zpos =Zmin; escritura digital (15, ALTA); digitalWrite (16, BAJO); if (detallado) {Serial.println ("Pen down."); }} 
Código de procesamiento Java
Cargue este código en Processing IDE
 import java.awt.event.KeyEvent; import javax.swing.JOptionPane; import processing.serial. *; Serial port =null; // seleccione y modifique la línea apropiada para su sistema operativo / / dejar como nulo para usar el puerto interactivo (presione 'p' en el programa) String portname =null; // String portname =Serial.list () [0]; // Mac OS X // String portname ="/ dev / ttyUSB0"; // Linux // String portname ="COM6"; // Transmisión booleana de Windows =falso; velocidad de flotación =0.001; String [] gcode; int i =0; void openSerialPort () {if (portname ==null) return; si (puerto! =nulo) puerto.stop (); puerto =nueva serie (este, nombre de puerto, 9600); port.bufferUntil ('\ n');} void selectSerialPort () {String result =(String) JOptionPane.showInputDialog (frame, "Seleccione el puerto serie que corresponde a su placa Arduino.", "Seleccione puerto serie", JOptionPane. QUESTION_MESSAGE, null, Serial.list (), 0); if (resultado! =nulo) {nombre de puerto =resultado; openSerialPort (); }} configuración vacía () {tamaño (500, 250); openSerialPort ();} vacío dibujar () {fondo (0); llenar (255); int y =24, dy =12; text ("INSTRUCCIONES", 12, y); y + =dy; text ("p:seleccionar puerto serie", 12, y); y + =dy; text ("1:establece la velocidad en 0,001 pulgadas (1 mil) por trote", 12, y); y + =dy; text ("2:establece la velocidad en 0.010 pulgadas (10 mil) por trote", 12, y); y + =dy; text ("3:establezca la velocidad en 0,100 pulgadas (100 mil) por trote", 12, y); y + =dy; text ("teclas de flecha:jog en el plano x-y", 12, y); y + =dy; texto ("página arriba y página abajo:desplazamiento en el eje z", 12, y); y + =dy; text ("$:mostrar configuración de grbl", 12, y); y + =dy; text ("h:ir a casa", 12, y); y + =dy; text ("0:máquina cero (establecer inicio en la ubicación actual)", 12, y); y + =dy; text ("g:transmitir un archivo de código g", 12, y); y + =dy; text ("x:detener la transmisión de código g (esto NO es inmediato)", 12, y); y + =dy; y =altura - dy; text ("velocidad de jog actual:" + velocidad + "pulgadas por paso", 12, y); y - =dy; text ("puerto serie actual:" + nombre de puerto, 12, y); y - =dy;} void keyPressed () {if (key =='1') speed =0.001; if (clave =='2') velocidad =0.01; if (clave =='3') velocidad =0.1; if (! streaming) {if (keyCode ==LEFT) port.write ("G91 \ nG20 \ nG00 X-" + velocidad + "Y0.000 Z0.000 \ n"); if (keyCode ==RIGHT) port.write ("G91 \ nG20 \ nG00 X" + velocidad + "Y0.000 Z0.000 \ n"); if (keyCode ==UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y" + velocidad + "Z0.000 \ n"); if (keyCode ==DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y-" + velocidad + "Z0.000 \ n"); if (keyCode ==KeyEvent.VK_PAGE_UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z" + velocidad + "\ n"); if (keyCode ==KeyEvent.VK_PAGE_DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z-" + velocidad + "\ n"); if (clave =='h') port.write ("G90 \ nG20 \ nG00 X0.000 Y0.000 Z0.000 \ n"); if (clave =='v') port.write ("$ 0 =75 \ n $ 1 =74 \ n $ 2 =75 \ n"); // if (clave =='v') port.write ("$ 0 =100 \ n $ 1 =74 \ n $ 2 =75 \ n"); if (clave =='s') port.write ("$ 3 =10 \ n"); if (clave =='e') port.write ("$ 16 =1 \ n"); if (clave =='d') port.write ("$ 16 =0 \ n"); if (clave =='0') openSerialPort (); if (clave =='p') selectSerialPort (); if (clave =='$') port.write ("$$ \ n"); } if (! Streaming &&key =='g') {gcode =null; i =0; Archivo archivo =nulo; println ("Cargando archivo ..."); selectInput ("Seleccionar un archivo para procesar:", "archivoSeleccionado", archivo); } if (key =='x') streaming =false;} void fileSelected (Selección de archivo) {if (selección ==null) {println ("La ventana se cerró o el usuario presionó cancelar."); } else {println ("Usuario seleccionado" + selection.getAbsolutePath ()); gcode =loadStrings (selection.getAbsolutePath ()); if (gcode ==null) return; streaming =verdadero; Arroyo(); }} void stream () {if (! streaming) return; while (verdadero) {if (i ==gcode.length) {transmisión =falso; regreso; } if (gcode [i] .trim (). length () ==0) i ++; más romper; } println (gcode [i]); port.write (gcode [i] + '\ n'); i ++;} void serialEvent (Serial p) {String s =p.readStringUntil ('\ n'); println (s.trim ()); if (s.trim (). startsWith ("ok")) stream (); if (s.trim (). startsWith ("error")) stream (); // XXX:¿de verdad?} 

Esquemas

conecte todos los componentes como se muestra en la figura

Proceso de manufactura

  1. Haga una máquina de escribir para hacer tareas caseras en casa
  2. Hacer Monitor Ambilight usando Arduino
  3. Sistema de robótica de detección humana con Arduino Uno
  4. Juguete controlado por Android con Raspberry Motor Shield
  5. Cómo hacer un botón de teclado perforable personalizable
  6. Cómo medir la masa de la Tierra usando Arduino
  7. Cómo crear un sitio web comunicando Arduino usando PHP
  8. Cómo hacer música con un Arduino
  9. Cómo hacer una apertura automática de puerta basada en Arduino
  10. Cómo hacer un coche controlado por Bluetooth Arduino
  11. Cómo hacer una brújula usando Arduino y Processing IDE