Cómo hacer un mini plotter CNC 2D usando una unidad de DVD para chatarra, L293D
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
| ||||
| ||||
|
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 IDEimport 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 figuraProceso de manufactura
- Haga una máquina de escribir para hacer tareas caseras en casa
- Hacer Monitor Ambilight usando Arduino
- Sistema de robótica de detección humana con Arduino Uno
- Juguete controlado por Android con Raspberry Motor Shield
- Cómo hacer un botón de teclado perforable personalizable
- Cómo medir la masa de la Tierra usando Arduino
- Cómo crear un sitio web comunicando Arduino usando PHP
- Cómo hacer música con un Arduino
- Cómo hacer una apertura automática de puerta basada en Arduino
- Cómo hacer un coche controlado por Bluetooth Arduino
- Cómo hacer una brújula usando Arduino y Processing IDE